backend.c

00001 /*
00002  * Copyright (c) 2005-2012 by KoanLogic s.r.l. <http://www.koanlogic.com>
00003  * All rights reserved.
00004  *
00005  * This file is part of KLone, and as such it is subject to the license stated
00006  * in the LICENSE file which you have received as part of this distribution.
00007  *
00008  * $Id: backend.c,v 1.24 2006/10/11 16:31:42 tat Exp $
00009  */
00010 
00011 #include <unistd.h>
00012 #include <klone/backend.h>
00013 #include <klone/server.h>
00014 #include <klone/klog.h>
00015 #include <klone/context.h>
00016 #include <u/libu.h>
00017 #include "klone_conf.h"
00018 
00019 extern backend_t be_http;
00020 
00021 #ifdef SSL_ON
00022 extern backend_t be_https;
00023 #endif
00024 
00025 backend_t *backend_list[] = { 
00026     &be_http, 
00027 #ifdef SSL_ON
00028     &be_https, 
00029 #endif
00030     0 };
00031 
00032 
00033 static int backend_set_model(backend_t *be, const char *v)
00034 {
00035     dbg_return_if (v == NULL, ~0);
00036     dbg_return_if (be == NULL, ~0);
00037 
00038     if(!strcasecmp(v, "iterative"))
00039         be->model = SERVER_MODEL_ITERATIVE;
00040 #ifdef HAVE_FORK
00041     else if(!strcasecmp(v, "fork"))
00042         be->model = SERVER_MODEL_FORK;
00043     else if(!strcasecmp(v, "prefork"))
00044         be->model = SERVER_MODEL_PREFORK;
00045 #endif  /* HAVE_FORK */
00046     else
00047         warn_err("unknown server model [%s]", v);
00048 
00049     return 0;
00050 err:
00051     return ~0;
00052 }
00053 
00054 int backend_create(const char *proto, u_config_t *config, backend_t **pbe)
00055 {
00056     backend_t *be = NULL, **pp;
00057     const char *v;
00058 
00059     dbg_return_if (proto == NULL, ~0);
00060     dbg_return_if (config == NULL, ~0);
00061     dbg_return_if (pbe == NULL, ~0);
00062     
00063     be = u_zalloc(sizeof(backend_t));
00064     dbg_err_if(be == NULL);
00065 
00066     /* find the requested backend type */
00067     for(pp = backend_list; *pp != NULL; ++pp)
00068         if(!strcasecmp((*pp)->proto, proto))
00069             break; /* found */
00070 
00071     warn_err_ifm(*pp == NULL, "backend type \"%s\" not found", proto);
00072 
00073     /* copy static backend struct fields */
00074     memcpy(be, *pp, sizeof(backend_t));
00075 
00076     be->config = config;
00077 #if defined(OS_WIN) || !defined(HAVE_FORK)
00078     be->model = SERVER_MODEL_ITERATIVE;  /* default */
00079 #else
00080     be->model = SERVER_MODEL_PREFORK;  /* default */
00081 #endif
00082 
00083     if((v = u_config_get_subkey_value(config, "model")) != NULL)
00084         dbg_err_if(backend_set_model(be, v));
00085 
00086     if(be->model == SERVER_MODEL_FORK)
00087     {
00088         /* max # of child allowed to run at once */
00089         dbg_err_if(u_config_get_subkey_value_i(config, "fork.max_child", 
00090             SERVER_MAX_BACKEND_CHILD, (int *)&be->max_child));
00091     }
00092 
00093     if(be->model == SERVER_MODEL_PREFORK)
00094     {
00095         /* max # of child allowed to run at once */
00096         dbg_err_if(u_config_get_subkey_value_i(config, "prefork.max_child", 
00097             SERVER_MAX_BACKEND_CHILD, (int *)&be->max_child));
00098         
00099         /* # of child to run at startup */
00100         dbg_err_if(u_config_get_subkey_value_i(config, "prefork.start_child", 
00101             SERVER_PREFORK_START_CHILD, (int *)&be->start_child));
00102 
00103         /* max # of requests a child process will handle before it dies */
00104         dbg_err_if(u_config_get_subkey_value_i(config, 
00105             "prefork.max_requests_per_child", SERVER_PREFORK_MAX_RQ_CHILD, 
00106             (int *)&be->max_rq_xchild));
00107 
00108         /* set start_child child to be forked when possible */
00109         be->fork_child = be->start_child;
00110     }
00111 
00112     /* call backend initialization function */
00113     if(be->cb_init)
00114         warn_err_ifm(be->cb_init(be), "backend (%s) init error", proto);
00115 
00116     *pbe = be;
00117 
00118     return 0;
00119 err:
00120     U_FREE(be);
00121     return ~0;
00122 }
00123 
00124 int backend_serve(backend_t *be, int fd)
00125 {
00126     dbg_return_if (be == NULL, ~0);
00127     dbg_return_if (fd < 0, ~0);
00128     
00129     dbg_err_if(be->cb_serve == NULL);
00130 
00131     be->cb_serve(be, fd);
00132 
00133     return 0;
00134 err:
00135     return ~0;
00136 }
00137 
00138 int backend_free(backend_t *be)
00139 {
00140     if(be)
00141     {
00142         /* children must not call klog_close (see comment in server.c) */
00143         if(be->klog && ctx->pipc == 0)
00144             klog_close(be->klog);
00145         if(be->cb_term)
00146             be->cb_term(be);
00147         U_FREE(be);
00148     }
00149     return 0;
00150 }
00151 

←Products
Copyright © 2005-2012 - KoanLogic S.r.l. - All rights reserved