src/server/daemon/webserver.c

branch
srvctrl
changeset 158
77f4f0079428
parent 156
724e107983e9
child 179
ef6827505bd2
equal deleted inserted replaced
156:724e107983e9 158:77f4f0079428
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;

mercurial