57 #include "configmanager.h" |
57 #include "configmanager.h" |
58 #include "httplistener.h" |
58 #include "httplistener.h" |
59 #include "webserver.h" |
59 #include "webserver.h" |
60 #include "log.h" |
60 #include "log.h" |
61 #include "auth.h" |
61 #include "auth.h" |
|
62 #include "srvctrl.h" |
62 |
63 |
63 extern struct FuncStruct webserver_funcs[]; |
64 extern struct FuncStruct webserver_funcs[]; |
64 |
65 |
65 static RestartCallback *atrestart; |
66 static RestartCallback *atrestart; |
66 |
|
67 static int srvctrl; |
|
68 |
67 |
69 int webserver_init() { |
68 int webserver_init() { |
70 // init NSPR |
69 // init NSPR |
71 systhread_init("webserver"); |
70 systhread_init("webserver"); |
72 |
71 |
196 } |
195 } |
197 |
196 |
198 |
197 |
199 // create srvctrl unix domain socket |
198 // create srvctrl unix domain socket |
200 // this socket is used for stop, reconfigure and other operations |
199 // this socket is used for stop, reconfigure and other operations |
201 sstr_t uds_path = ucx_sprintf("%s/private/srvctrl.sock", cfg->tmp.ptr); |
200 if(srvctrl_init(cfg)) { |
202 struct sockaddr_un addr; |
201 return -1; |
203 if(uds_path.length > sizeof(addr.sun_path)-1) { |
202 } |
204 log_ereport( |
|
205 LOG_CATASTROPHE, |
|
206 "path '%s' too long for unix domain socket", |
|
207 uds_path.ptr); |
|
208 return -1; |
|
209 } |
|
210 |
|
211 // make sure there is no old srvctrl socket file |
|
212 // otherweise bind would fail |
|
213 if(unlink(uds_path.ptr)) { |
|
214 if(errno != ENOENT) { |
|
215 log_ereport( |
|
216 LOG_CATASTROPHE, |
|
217 "cannot unlink old srvctrl socket '%s': %s", |
|
218 uds_path.ptr, |
|
219 strerror(errno)); |
|
220 return -1; |
|
221 } |
|
222 } |
|
223 |
|
224 ZERO(&addr, sizeof(addr)); |
|
225 addr.sun_family = AF_UNIX; |
|
226 memcpy(addr.sun_path, uds_path.ptr, uds_path.length); |
|
227 |
|
228 srvctrl = socket(AF_UNIX, SOCK_STREAM, 0); |
|
229 if(srvctrl == -1) { |
|
230 log_ereport( |
|
231 LOG_CATASTROPHE, |
|
232 "Cannot create server control socket: %s", |
|
233 strerror(errno)); |
|
234 return -1; |
|
235 } |
|
236 if(bind(srvctrl, (struct sockaddr*)&addr, sizeof(addr))) { |
|
237 log_ereport( |
|
238 LOG_CATASTROPHE, |
|
239 "srvctrl socket bind failed: %s", |
|
240 strerror(errno)); |
|
241 return -1; |
|
242 } |
|
243 |
|
244 free(uds_path.ptr); |
|
245 |
|
246 |
203 |
247 //endpwent(); // TODO: close or not? |
204 //endpwent(); // TODO: close or not? |
248 //free(pwbuf); // TODO: ? |
205 //free(pwbuf); // TODO: ? |
249 |
206 |
250 return 0; |
207 return 0; |
263 return 0; |
220 return 0; |
264 } |
221 } |
265 |
222 |
266 void webserver_shutdown() { |
223 void webserver_shutdown() { |
267 log_ereport(LOG_INFORM, "webserver shutdown"); |
224 log_ereport(LOG_INFORM, "webserver shutdown"); |
|
225 |
|
226 srvctrl_shutdown(); |
268 |
227 |
269 // execute restart callbacks |
228 // execute restart callbacks |
270 RestartCallback *re = atrestart; |
229 RestartCallback *re = atrestart; |
271 while(re) { |
230 while(re) { |
272 re->func(re->data); |
231 re->func(re->data); |
273 re = re->next; |
232 re = re->next; |
274 } |
233 } |
275 } |
234 } |
276 |
235 |
277 int webserver_srvctrl_fd() { |
236 int webserver_reconfig() { |
278 return srvctrl; |
237 if(cfgmgr_load_config(NULL) != 0) { |
|
238 return -1; |
|
239 } |
|
240 // start newly created listeners |
|
241 start_all_listener(); |
|
242 |
|
243 return 0; |
279 } |
244 } |
280 |
245 |
281 void webserver_atrestart(void (*fn)(void *), void *data) { |
246 void webserver_atrestart(void (*fn)(void *), void *data) { |
282 RestartCallback *cb = malloc(sizeof(RestartCallback)); |
247 RestartCallback *cb = malloc(sizeof(RestartCallback)); |
283 cb->func = fn; |
248 cb->func = fn; |