backend.c
00001
00002
00003
00004
00005
00006
00007
00008
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
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
00067 for(pp = backend_list; *pp != NULL; ++pp)
00068 if(!strcasecmp((*pp)->proto, proto))
00069 break;
00070
00071 warn_err_ifm(*pp == NULL, "backend type \"%s\" not found", proto);
00072
00073
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;
00079 #else
00080 be->model = SERVER_MODEL_PREFORK;
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
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
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
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
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
00109 be->fork_child = be->start_child;
00110 }
00111
00112
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
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