diff options
-rw-r--r-- | src/comp.c | 41 | ||||
-rw-r--r-- | src/ctl.c | 4 | ||||
-rw-r--r-- | src/piesctl.c | 4 | ||||
-rw-r--r-- | src/prog.h | 2 | ||||
-rw-r--r-- | src/progman.c | 19 |
5 files changed, 26 insertions, 44 deletions
@@ -21,17 +21,12 @@ | |||
21 | struct complist | 21 | struct complist |
22 | { | 22 | { |
23 | struct component *head; | 23 | struct component *head; |
24 | struct component *tail; | 24 | struct component *tail; |
25 | }; | 25 | }; |
26 | 26 | ||
27 | /* 0 on the first load, and 1 on all subsequent reloads. Tells the | ||
28 | component_config_commit whether we're starting from scratch or just | ||
29 | updating an already loaded configuration */ | ||
30 | static int loaded; | ||
31 | |||
32 | static struct complist comp_list[2]; | 27 | static struct complist comp_list[2]; |
33 | static int cur; | 28 | static int cur; |
34 | 29 | ||
35 | static struct component **comp_array; | 30 | static struct component **comp_array; |
36 | static size_t comp_count; | 31 | static size_t comp_count; |
37 | 32 | ||
@@ -537,41 +532,27 @@ component_config_commit (void) | |||
537 | } | 532 | } |
538 | else | 533 | else |
539 | comp_array = grecs_realloc (comp_array, i * sizeof (comp_array[0])); | 534 | comp_array = grecs_realloc (comp_array, i * sizeof (comp_array[0])); |
540 | comp_count = i; | 535 | comp_count = i; |
541 | 536 | ||
542 | /* Rearrange components, registering entries for the new ones */ | 537 | /* Rearrange components, registering entries for the new ones */ |
543 | for (comp = list->head, i = 0; comp; ) | 538 | for (comp = list->head, i = 0; comp; comp = comp->next, i++) |
544 | { | 539 | { |
545 | struct component *next = comp->next; | 540 | match = complist_find_match (prev, comp); |
546 | if (loaded && comp->mode == pies_comp_startup) | 541 | if (match) |
547 | { | 542 | { |
548 | /* Ignore startup components */ | 543 | component_merge (match, comp); |
549 | component_unlink (comp); | 544 | component_unlink (match); |
545 | match->listidx = cur; | ||
546 | component_link (match, comp->prev); | ||
550 | component_free (comp); | 547 | component_free (comp); |
548 | comp = match; | ||
551 | } | 549 | } |
552 | else | 550 | comp_array[i] = comp; |
553 | { | 551 | comp->arridx = i; |
554 | match = complist_find_match (prev, comp); | ||
555 | if (match) | ||
556 | { | ||
557 | component_merge (match, comp); | ||
558 | component_unlink (match); | ||
559 | match->listidx = cur; | ||
560 | component_link (match, comp->prev); | ||
561 | component_free (comp); | ||
562 | comp = match; | ||
563 | } | ||
564 | comp_array[i] = comp; | ||
565 | comp->arridx = i; | ||
566 | i++; | ||
567 | } | ||
568 | comp = next; | ||
569 | } | 552 | } |
570 | /* Adjust comp_count */ | ||
571 | comp_count = i; | ||
572 | 553 | ||
573 | /* Mark orphaned progs for termination */ | 554 | /* Mark orphaned progs for termination */ |
574 | list = &comp_list[prev]; | 555 | list = &comp_list[prev]; |
575 | if (list->head) | 556 | if (list->head) |
576 | { | 557 | { |
577 | progman_foreach (mark_prog, NULL); | 558 | progman_foreach (mark_prog, NULL); |
@@ -582,14 +563,12 @@ component_config_commit (void) | |||
582 | component_build_depmap (); | 563 | component_build_depmap (); |
583 | 564 | ||
584 | /* Register new progs */ | 565 | /* Register new progs */ |
585 | for (comp = comp_list[cur].head; comp; comp = comp->next) | 566 | for (comp = comp_list[cur].head; comp; comp = comp->next) |
586 | if (!comp->prog) | 567 | if (!comp->prog) |
587 | register_prog (comp); | 568 | register_prog (comp); |
588 | |||
589 | loaded = 1; | ||
590 | } | 569 | } |
591 | 570 | ||
592 | static int | 571 | static int |
593 | component_verify (struct component *comp, grecs_locus_t *locus) | 572 | component_verify (struct component *comp, grecs_locus_t *locus) |
594 | { | 573 | { |
595 | int header = 0; | 574 | int header = 0; |
@@ -1450,13 +1450,15 @@ static char * const pies_type_str[] = { | |||
1450 | }; | 1450 | }; |
1451 | 1451 | ||
1452 | static char * const pies_comp_mode_str[] = { | 1452 | static char * const pies_comp_mode_str[] = { |
1453 | [pies_comp_exec] = "exec", | 1453 | [pies_comp_exec] = "exec", |
1454 | [pies_comp_accept] = "accept", | 1454 | [pies_comp_accept] = "accept", |
1455 | [pies_comp_inetd] = "inetd", | 1455 | [pies_comp_inetd] = "inetd", |
1456 | [pies_comp_pass_fd] = "pass_fd", | 1456 | [pies_comp_pass_fd] = "pass_fd", |
1457 | [pies_comp_startup] = "startup", | ||
1458 | [pies_comp_shutdown] = "shutdown", | ||
1457 | [pies_comp_wait] = "wait", | 1459 | [pies_comp_wait] = "wait", |
1458 | [pies_comp_once] = "once", | 1460 | [pies_comp_once] = "once", |
1459 | [pies_comp_boot] = "boot", | 1461 | [pies_comp_boot] = "boot", |
1460 | [pies_comp_bootwait] = "bootwait", | 1462 | [pies_comp_bootwait] = "bootwait", |
1461 | [pies_comp_powerfail] = "powerfail", | 1463 | [pies_comp_powerfail] = "powerfail", |
1462 | [pies_comp_powerwait] = "powerwait", | 1464 | [pies_comp_powerwait] = "powerwait", |
diff --git a/src/piesctl.c b/src/piesctl.c index f2e774b..0cd2736 100644 --- a/src/piesctl.c +++ b/src/piesctl.c | |||
@@ -1049,13 +1049,15 @@ struct kwtrans | |||
1049 | }; | 1049 | }; |
1050 | 1050 | ||
1051 | struct kwtrans mode_trans[] = { | 1051 | struct kwtrans mode_trans[] = { |
1052 | { "exec", 'C' }, | 1052 | { "exec", 'C' }, |
1053 | { "accept", 'A' }, | 1053 | { "accept", 'A' }, |
1054 | { "inetd", 'I' }, | 1054 | { "inetd", 'I' }, |
1055 | { "pass_fd", 'P' }, | 1055 | { "pass_fd", 'P' }, |
1056 | { "startup", 'S' }, | ||
1057 | { "shutdown", 'E' }, | ||
1056 | { "wait", 'W' }, | 1058 | { "wait", 'W' }, |
1057 | { "once", 'c' }, | 1059 | { "once", 'c' }, |
1058 | { "boot", 'B' }, | 1060 | { "boot", 'B' }, |
1059 | { "bootwait", 'w' }, | 1061 | { "bootwait", 'w' }, |
1060 | { "powerfail", 'F' }, | 1062 | { "powerfail", 'F' }, |
1061 | { "powerwait", 'f' }, | 1063 | { "powerwait", 'f' }, |
@@ -26,13 +26,13 @@ enum prog_status | |||
26 | status_stopped, /* Component is stopped. */ | 26 | status_stopped, /* Component is stopped. */ |
27 | status_running, /* Component is running */ | 27 | status_running, /* Component is running */ |
28 | status_listener, /* Component is an inetd listener */ | 28 | status_listener, /* Component is an inetd listener */ |
29 | status_sleeping, /* Component is sleeping. An attempt to start it will | 29 | status_sleeping, /* Component is sleeping. An attempt to start it will |
30 | be made at prog->v.p.timestamp + SLEEPTIME */ | 30 | be made at prog->v.p.timestamp + SLEEPTIME */ |
31 | status_stopping, /* Component is being stopped */ | 31 | status_stopping, /* Component is being stopped */ |
32 | status_finished, /* A "once" component has finished */ | 32 | status_finished, /* A "once" or "startup" component has finished */ |
33 | }; | 33 | }; |
34 | 34 | ||
35 | struct conn_class | 35 | struct conn_class |
36 | { | 36 | { |
37 | const char *tag; | 37 | const char *tag; |
38 | union pies_sockaddr_storage sa_storage; | 38 | union pies_sockaddr_storage sa_storage; |
diff --git a/src/progman.c b/src/progman.c index 5bc4eb3..a625885 100644 --- a/src/progman.c +++ b/src/progman.c | |||
@@ -321,13 +321,14 @@ static inline int | |||
321 | progman_startup_phase (void) | 321 | progman_startup_phase (void) |
322 | { | 322 | { |
323 | struct prog *prog; | 323 | struct prog *prog; |
324 | 324 | ||
325 | for (prog = proghead; prog; prog = prog->next) | 325 | for (prog = proghead; prog; prog = prog->next) |
326 | { | 326 | { |
327 | if (IS_COMPONENT (prog) && prog->v.p.comp->mode == pies_comp_startup) | 327 | if (IS_COMPONENT (prog) && prog->v.p.comp->mode == pies_comp_startup |
328 | && prog->v.p.status == status_running) | ||
328 | return 1; | 329 | return 1; |
329 | } | 330 | } |
330 | return 0; | 331 | return 0; |
331 | } | 332 | } |
332 | 333 | ||
333 | int | 334 | int |
@@ -335,13 +336,13 @@ progman_waiting_p (void) | |||
335 | { | 336 | { |
336 | struct prog *prog; | 337 | struct prog *prog; |
337 | 338 | ||
338 | for (prog = proghead; prog; prog = prog->next) | 339 | for (prog = proghead; prog; prog = prog->next) |
339 | { | 340 | { |
340 | if (IS_COMPONENT (prog) | 341 | if (IS_COMPONENT (prog) |
341 | && prog->pid > 0 | 342 | && prog->v.p.status == status_running |
342 | && (prog->wait || prog->v.p.comp->mode == pies_comp_startup)) | 343 | && (prog->wait || prog->v.p.comp->mode == pies_comp_startup)) |
343 | { | 344 | { |
344 | debug (3, ("%s: waiting for %s (%lu)", | 345 | debug (3, ("%s: waiting for %s (%lu)", |
345 | __FUNCTION__, prog_tag (prog), | 346 | __FUNCTION__, prog_tag (prog), |
346 | (unsigned long) prog->pid)); | 347 | (unsigned long) prog->pid)); |
347 | return 1; | 348 | return 1; |
@@ -2353,20 +2354,12 @@ progman_cleanup (int expect_term) | |||
2353 | react (listener, status, pid); | 2354 | react (listener, status, pid); |
2354 | if (listener->v.p.comp->flags & CF_WAIT) | 2355 | if (listener->v.p.comp->flags & CF_WAIT) |
2355 | enable_socket (listener->v.p.socket); | 2356 | enable_socket (listener->v.p.socket); |
2356 | } | 2357 | } |
2357 | destroy_prog (&prog); | 2358 | destroy_prog (&prog); |
2358 | } | 2359 | } |
2359 | else if (prog->v.p.comp->mode == pies_comp_startup) | ||
2360 | { | ||
2361 | debug (1, (_("removing startup component %s, pid=%lu"), | ||
2362 | prog_tag (prog), (unsigned long)pid)); | ||
2363 | destroy_prog (&prog); | ||
2364 | if (!progman_startup_phase ()) | ||
2365 | pies_schedule_children (PIES_CHLD_WAKEUP); | ||
2366 | } | ||
2367 | else | 2360 | else |
2368 | { | 2361 | { |
2369 | if (prog->v.p.comp->mode >= pies_mark_sysvinit | 2362 | if (prog->v.p.comp->mode >= pies_mark_sysvinit |
2370 | && prog->v.p.comp->mode != pies_comp_ondemand) | 2363 | && prog->v.p.comp->mode != pies_comp_ondemand) |
2371 | { | 2364 | { |
2372 | sysvinit_acct (SYSV_ACCT_PROC_STOP, "", prog_tag (prog), | 2365 | sysvinit_acct (SYSV_ACCT_PROC_STOP, "", prog_tag (prog), |