aboutsummaryrefslogtreecommitdiff
path: root/src/progman.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/progman.c')
-rw-r--r--src/progman.c291
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
70struct component * 70struct component *
71progman_lookup_tcpmux (const char *service, const char *master) 71progman_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
151destroy_prog (struct prog **pp) 151destroy_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
274static struct prog * 274static struct prog *
275register_prog0 (struct component *comp) 275register_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
320static inline int
321progman_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
320int 333int
321progman_waiting_p (void) 334progman_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
757static void 772static void
758environ_setup (char **hint) 773environ_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