diff options
Diffstat (limited to 'src/progman.c')
-rw-r--r-- | src/progman.c | 291 |
1 files changed, 167 insertions, 124 deletions
diff --git a/src/progman.c b/src/progman.c index 1b09cd5..5bc4eb3 100644 --- a/src/progman.c +++ b/src/progman.c | |||
@@ -65,7 +65,7 @@ progman_lookup_component (const char *tag) | |||
65 | if (IS_COMPONENT (prog) && strcmp (prog_tag (prog), tag) == 0) | 65 | if (IS_COMPONENT (prog) && strcmp (prog_tag (prog), tag) == 0) |
66 | return prog->v.p.comp; | 66 | return prog->v.p.comp; |
67 | return NULL; | 67 | return NULL; |
68 | } | 68 | } |
69 | 69 | ||
70 | struct component * | 70 | struct component * |
71 | progman_lookup_tcpmux (const char *service, const char *master) | 71 | progman_lookup_tcpmux (const char *service, const char *master) |
@@ -122,7 +122,7 @@ link_prog (struct prog *prog, struct prog *ref) | |||
122 | 122 | ||
123 | prog->prev = ref; | 123 | prog->prev = ref; |
124 | prog->next = ref->next; | 124 | prog->next = ref->next; |
125 | 125 | ||
126 | if ((x = ref->next)) | 126 | if ((x = ref->next)) |
127 | x->prev = prog; | 127 | x->prev = prog; |
128 | else | 128 | else |
@@ -151,21 +151,21 @@ void | |||
151 | destroy_prog (struct prog **pp) | 151 | destroy_prog (struct prog **pp) |
152 | { | 152 | { |
153 | struct prog *p = *pp; | 153 | struct prog *p = *pp; |
154 | 154 | ||
155 | unlink_prog (p); | 155 | unlink_prog (p); |
156 | switch (p->type) | 156 | switch (p->type) |
157 | { | 157 | { |
158 | case TYPE_COMPONENT: | 158 | case TYPE_COMPONENT: |
159 | component_ref_decr (p->v.p.comp); | 159 | component_ref_decr (p->v.p.comp); |
160 | if (p->v.p.status == status_listener && p->v.p.socket != -1) | 160 | if (p->v.p.status == status_listener && p->v.p.socket != -1) |
161 | deregister_socket (p->v.p.socket); | 161 | deregister_socket (p->v.p.socket); |
162 | /* FIXME: Remove also all dependent progs (esp. tcpmux) */ | 162 | /* FIXME: Remove also all dependent progs (esp. tcpmux) */ |
163 | if (p->v.p.redir[RETR_OUT]) | 163 | if (p->v.p.redir[RETR_OUT]) |
164 | p->v.p.redir[RETR_OUT]->v.r.master = NULL; | 164 | p->v.p.redir[RETR_OUT]->v.r.master = NULL; |
165 | if (p->v.p.redir[RETR_ERR]) | 165 | if (p->v.p.redir[RETR_ERR]) |
166 | p->v.p.redir[RETR_ERR]->v.r.master = NULL; | 166 | p->v.p.redir[RETR_ERR]->v.r.master = NULL; |
167 | break; | 167 | break; |
168 | 168 | ||
169 | case TYPE_REDIRECTOR: | 169 | case TYPE_REDIRECTOR: |
170 | { | 170 | { |
171 | struct prog *master = p->v.r.master; | 171 | struct prog *master = p->v.r.master; |
@@ -182,7 +182,7 @@ destroy_prog (struct prog **pp) | |||
182 | free (p->v.r.tag); | 182 | free (p->v.r.tag); |
183 | } | 183 | } |
184 | break; | 184 | break; |
185 | 185 | ||
186 | case TYPE_COMMAND: | 186 | case TYPE_COMMAND: |
187 | free (p->v.c.tag); | 187 | free (p->v.c.tag); |
188 | free (p->v.c.command); | 188 | free (p->v.c.command); |
@@ -256,7 +256,7 @@ find_prog_ref (struct component *comp) | |||
256 | if (!comp) | 256 | if (!comp) |
257 | return NULL; /* FIXME: Skip redirectors? */ | 257 | return NULL; /* FIXME: Skip redirectors? */ |
258 | } | 258 | } |
259 | 259 | ||
260 | if (comp->prog) | 260 | if (comp->prog) |
261 | { | 261 | { |
262 | for (prog = comp->prog; | 262 | for (prog = comp->prog; |
@@ -270,12 +270,12 @@ find_prog_ref (struct component *comp) | |||
270 | prog = NULL; | 270 | prog = NULL; |
271 | return prog; | 271 | return prog; |
272 | } | 272 | } |
273 | 273 | ||
274 | static struct prog * | 274 | static struct prog * |
275 | register_prog0 (struct component *comp) | 275 | register_prog0 (struct component *comp) |
276 | { | 276 | { |
277 | struct prog *newp; | 277 | struct prog *newp; |
278 | 278 | ||
279 | newp = grecs_zalloc (sizeof (*newp)); | 279 | newp = grecs_zalloc (sizeof (*newp)); |
280 | newp->type = TYPE_COMPONENT; | 280 | newp->type = TYPE_COMPONENT; |
281 | newp->pid = 0; | 281 | newp->pid = 0; |
@@ -291,7 +291,7 @@ register_prog0 (struct component *comp) | |||
291 | newp->active = 0; | 291 | newp->active = 0; |
292 | else | 292 | else |
293 | newp->active = 1; | 293 | newp->active = 1; |
294 | 294 | ||
295 | if (comp->mode != pies_comp_exec) | 295 | if (comp->mode != pies_comp_exec) |
296 | comp->redir[RETR_OUT].type = redir_null; | 296 | comp->redir[RETR_OUT].type = redir_null; |
297 | 297 | ||
@@ -317,14 +317,29 @@ register_command (char *tag, char *command, pid_t pid) | |||
317 | link_prog (newp, progtail); | 317 | link_prog (newp, progtail); |
318 | } | 318 | } |
319 | 319 | ||
320 | static inline int | ||
321 | progman_startup_phase (void) | ||
322 | { | ||
323 | struct prog *prog; | ||
324 | |||
325 | for (prog = proghead; prog; prog = prog->next) | ||
326 | { | ||
327 | if (IS_COMPONENT (prog) && prog->v.p.comp->mode == pies_comp_startup) | ||
328 | return 1; | ||
329 | } | ||
330 | return 0; | ||
331 | } | ||
332 | |||
320 | int | 333 | int |
321 | progman_waiting_p (void) | 334 | progman_waiting_p (void) |
322 | { | 335 | { |
323 | struct prog *prog; | 336 | struct prog *prog; |
324 | 337 | ||
325 | for (prog = proghead; prog; prog = prog->next) | 338 | for (prog = proghead; prog; prog = prog->next) |
326 | { | 339 | { |
327 | if (IS_COMPONENT (prog) && prog->wait && prog->pid > 0) | 340 | if (IS_COMPONENT (prog) |
341 | && prog->pid > 0 | ||
342 | && (prog->wait || prog->v.p.comp->mode == pies_comp_startup)) | ||
328 | { | 343 | { |
329 | debug (3, ("%s: waiting for %s (%lu)", | 344 | debug (3, ("%s: waiting for %s (%lu)", |
330 | __FUNCTION__, prog_tag (prog), | 345 | __FUNCTION__, prog_tag (prog), |
@@ -406,17 +421,17 @@ open_redirector (struct prog *master, int stream) | |||
406 | 421 | ||
407 | case redir_file: | 422 | case redir_file: |
408 | return redirect_to_file (master, stream); | 423 | return redirect_to_file (master, stream); |
409 | 424 | ||
410 | case redir_syslog: | 425 | case redir_syslog: |
411 | break; | 426 | break; |
412 | } | 427 | } |
413 | 428 | ||
414 | if (pipe (p)) | 429 | if (pipe (p)) |
415 | { | 430 | { |
416 | logmsg (LOG_CRIT, "pipe: %s", strerror (errno)); | 431 | logmsg (LOG_CRIT, "pipe: %s", strerror (errno)); |
417 | return -1; | 432 | return -1; |
418 | } | 433 | } |
419 | 434 | ||
420 | switch (pid = fork ()) | 435 | switch (pid = fork ()) |
421 | { | 436 | { |
422 | case 0: | 437 | case 0: |
@@ -428,10 +443,10 @@ open_redirector (struct prog *master, int stream) | |||
428 | FD_ZERO (&fdset); | 443 | FD_ZERO (&fdset); |
429 | FD_SET (p[0], &fdset); | 444 | FD_SET (p[0], &fdset); |
430 | close_fds (&fdset); | 445 | close_fds (&fdset); |
431 | 446 | ||
432 | diag_setup (0); | 447 | diag_setup (0); |
433 | signal_setup (redir_exit); | 448 | signal_setup (redir_exit); |
434 | 449 | ||
435 | close (p[1]); | 450 | close (p[1]); |
436 | fp = fdopen (p[0], "r"); | 451 | fp = fdopen (p[0], "r"); |
437 | if (fp == NULL) | 452 | if (fp == NULL) |
@@ -441,7 +456,7 @@ open_redirector (struct prog *master, int stream) | |||
441 | while (getline (&buf, &size, fp) > 0) | 456 | while (getline (&buf, &size, fp) > 0) |
442 | syslog (prio, "%s", buf); | 457 | syslog (prio, "%s", buf); |
443 | _exit (0); | 458 | _exit (0); |
444 | 459 | ||
445 | case -1: | 460 | case -1: |
446 | logmsg (LOG_CRIT, | 461 | logmsg (LOG_CRIT, |
447 | _("cannot run redirector `%s': fork failed: %s"), | 462 | _("cannot run redirector `%s': fork failed: %s"), |
@@ -466,7 +481,7 @@ conn_class_hasher (void *data, unsigned long n_buckets) | |||
466 | size_t value = 0; | 481 | size_t value = 0; |
467 | unsigned char ch; | 482 | unsigned char ch; |
468 | size_t len; | 483 | size_t len; |
469 | 484 | ||
470 | while ((ch = *tag++)) | 485 | while ((ch = *tag++)) |
471 | value = (value * 31 + ch) % n_buckets; | 486 | value = (value * 31 + ch) % n_buckets; |
472 | 487 | ||
@@ -530,7 +545,7 @@ conn_class_lookup (const char *tag, | |||
530 | probe->sa_storage.s.sa_family); | 545 | probe->sa_storage.s.sa_family); |
531 | break; | 546 | break; |
532 | } | 547 | } |
533 | 548 | ||
534 | probe->count = 0; | 549 | probe->count = 0; |
535 | if (!conn_tab) | 550 | if (!conn_tab) |
536 | { | 551 | { |
@@ -725,7 +740,7 @@ env_concat (const char *name, size_t namelen, const char *a, const char *b) | |||
725 | { | 740 | { |
726 | char *res; | 741 | char *res; |
727 | size_t len; | 742 | size_t len; |
728 | 743 | ||
729 | if (a && b) | 744 | if (a && b) |
730 | { | 745 | { |
731 | res = grecs_malloc (namelen + 1 + strlen (a) + strlen (b) + 1); | 746 | res = grecs_malloc (namelen + 1 + strlen (a) + strlen (b) + 1); |
@@ -753,14 +768,14 @@ env_concat (const char *name, size_t namelen, const char *a, const char *b) | |||
753 | res[namelen] = '='; | 768 | res[namelen] = '='; |
754 | return res; | 769 | return res; |
755 | } | 770 | } |
756 | 771 | ||
757 | static void | 772 | static void |
758 | environ_setup (char **hint) | 773 | environ_setup (char **hint) |
759 | { | 774 | { |
760 | char **old_env = environ; | 775 | char **old_env = environ; |
761 | char **new_env; | 776 | char **new_env; |
762 | size_t count, i, j, n; | 777 | size_t count, i, j, n; |
763 | 778 | ||
764 | if (!hint) | 779 | if (!hint) |
765 | return; | 780 | return; |
766 | 781 | ||
@@ -769,22 +784,22 @@ environ_setup (char **hint) | |||
769 | old_env = NULL; | 784 | old_env = NULL; |
770 | hint++; | 785 | hint++; |
771 | } | 786 | } |
772 |