diff options
-rw-r--r-- | src/comp.c | 87 | ||||
-rw-r--r-- | src/pies.c | 115 | ||||
-rw-r--r-- | src/pies.h | 38 | ||||
-rw-r--r-- | src/progman.c | 291 | ||||
-rw-r--r-- | src/socket.c | 54 | ||||
-rw-r--r-- | tests/Makefile.am | 9 | ||||
-rw-r--r-- | tests/atlocal.in | 2 | ||||
-rwxr-xr-x | tests/aux/mailer (renamed from tests/mailer) | 0 | ||||
-rwxr-xr-x | tests/aux/respawn (renamed from tests/respawn) | 0 | ||||
-rwxr-xr-x | tests/aux/retcode (renamed from tests/retcode) | 0 | ||||
-rwxr-xr-x | tests/aux/startup | 7 | ||||
-rw-r--r-- | tests/redirect.at | 2 | ||||
-rw-r--r-- | tests/respawn.at | 2 | ||||
-rw-r--r-- | tests/ret-exec.at | 4 | ||||
-rw-r--r-- | tests/ret-notify.at | 6 | ||||
-rw-r--r-- | tests/startup.at | 84 | ||||
-rw-r--r-- | tests/testsuite.at | 1 |
17 files changed, 442 insertions, 260 deletions
@@ -21,27 +21,32 @@ struct complist { struct component *head; struct component *tail; }; +/* 0 on the first load, and 1 on all subsequent reloads. Tells the + component_config_commit whether we're starting from scratch or just + updating an already loaded configuration */ +static int loaded; + static struct complist comp_list[2]; static int cur; static struct component **comp_array; static size_t comp_count; static pies_depmap_t depmap; -static int +static inline int next_index (void) { return (cur + 1) % ARRAY_SIZE (comp_list); } -static int +static inline int prev_index (void) { return (cur + ARRAY_SIZE (comp_list) - 1) % ARRAY_SIZE (comp_list); } void @@ -82,12 +87,28 @@ void component_append (struct component *comp) { component_link (comp, comp_list[comp->listidx].tail); } void +comp_array_remove (size_t i) +{ + struct component *comp = comp_array[i]; + + depmap_remove (depmap, i); + while (i < comp_count -1) + { + comp_array[i] = comp_array[i+1]; + comp_array[i]->arridx = i; + i++; + } + component_free (comp); + comp_count--; +} + +void component_unlink (struct component *comp) { struct complist *list = &comp_list[comp->listidx]; struct component *x; if ((x = comp->prev)) @@ -198,13 +219,18 @@ component_ref_incr (struct component *comp) void component_ref_decr (struct component *comp) { assert (comp->ref_count > 0); if (--comp->ref_count == 0) - component_free (comp); + { + if (component_is_active (comp)) + comp_array_remove (comp->arridx); + else + component_free (comp); + } } static int argvcmp (char **a, char **b) { size_t i; @@ -422,23 +448,12 @@ report_cyclic_dependency (pies_depmap_t dp, size_t idx) } while (i != idx); logmsg_printf (LOG_NOTICE, "%s\n", comp_array[idx]->tag); } void -comp_array_remove (size_t i) -{ - struct component *comp = comp_array[i]; - if (i < comp_count - 1) - memmove (&comp_array[i], &comp_array[i+1], - (comp_count - i - 1) * sizeof comp_array[0]); - component_free (comp); - comp_count--; -} - -void component_build_depmap (void) { size_t i; pies_depmap_t dp; free (depmap); @@ -457,13 +472,12 @@ component_build_depmap (void) { logmsg (LOG_ERR, _("component %s depends on %s, " "which is not declared"), comp->tag, tag); comp_array_remove (i); - depmap_remove (depmap, i); continue; } depmap_set (depmap, i, tgt); } if (comp->depend) @@ -494,16 +508,13 @@ component_build_depmap (void) report_cyclic_dependency (dp, i); } for (i = 0; i < comp_count;) if (comp_array[i]->flags & CF_REMOVE) - { - comp_array_remove (i); - depmap_remove (depmap, i); - } + comp_array_remove (i); else i++; free (dp); } @@ -525,28 +536,42 @@ component_config_commit (void) comp_array = NULL; } else comp_array = grecs_realloc (comp_array, i * sizeof (comp_array[0])); comp_count = i; - /* Rearrange components, registering prog entries for the new ones */ - for (comp = list->head, i = 0; comp; comp = comp->next, i++) + /* Rearrange components, registering entries for the new ones */ + for (comp = list->head, i = 0; comp; ) { - match = complist_find_match (prev, comp); - if (match) + struct component *next = comp->next; + if (loaded && comp->mode == pies_comp_startup) { - component_merge (match, comp); - component_unlink (match); - match->listidx = cur; - component_link (match, comp->prev); + /* Ignore startup components */ + component_unlink (comp); component_free (comp); - comp = match; } - comp_array[i] = comp; - comp->arridx = i; + else + { + match = complist_find_match (prev, comp); + if (match) + { + component_merge (match, comp); + component_unlink (match); + match->listidx = cur; + component_link (match, comp->prev); + component_free (comp); + comp = match; + } + comp_array[i] = comp; + comp->arridx = i; + i++; + } + comp = next; } + /* Adjust comp_count */ + comp_count = i; /* Mark orphaned progs for termination */ list = &comp_list[prev]; if (list->head) { progman_foreach (mark_prog, NULL); @@ -557,12 +582,14 @@ component_config_commit (void) component_build_depmap (); /* Register new progs */ for (comp = comp_list[cur].head; comp; comp = comp->next) if (!comp->prog) register_prog (comp); + + loaded = 1; } static int component_verify (struct component *comp, grecs_locus_t *locus) { int header = 0; @@ -129,13 +129,13 @@ config_file_add_type (enum config_syntax_type syntax, const char *name) } int config_file_remove (const char *name) { struct grecs_list_entry *ep; - + for (ep = config_list->head; ep; ep = ep->next) { struct config_file *file = ep->data; if (strcmp (file->name, name) == 0) { grecs_list_remove_entry (config_list, ep); @@ -153,13 +153,13 @@ config_file_remove_all (void) } void config_file_list_serialize (struct json_value *ar) { struct grecs_list_entry *ep; - + for (ep = config_list->head; ep; ep = ep->next) { struct config_file *file = ep->data; struct json_value *obj = json_new_object (); json_object_set (obj, "syntax", json_new_string (file->syntax->name)); json_object_set (obj, "file", json_new_string (file->name)); @@ -324,13 +324,13 @@ action_free (struct action *act) return; if (act->nstat > 0) free (act->status); free (act->addr); free (act->message); free (act->command); - + free (act); } static void free_entry_action (void *act) { @@ -356,13 +356,13 @@ create_action (struct component *comp, { for (i = 0; i < argc; i++) { unsigned n; const char *arg = getarg (val, i, locus); size_t len = strlen (arg); - + if (isdigit (arg[0])) { char *p; n = strtoul (arg, &p, 0); if (*p) { @@ -391,18 +391,18 @@ create_action (struct component *comp, } else if (strtotok_ci (ex_tokendef, arg, (int *) &n)) { grecs_error (locus, 0, _("%s: not a return code"), arg); continue; } - + /* Alles in ordnung */ retv[retc++] = n; } } - + if (retc == 0 && !allflag) { free (retv); return NULL; } @@ -469,33 +469,33 @@ return_code_section_parser (enum grecs_callback_command cmd, case grecs_callback_section_begin: if (GRECS_VALUE_EMPTY_P (value)) { grecs_error (locus, 0, _("missing tag")); return 1; } - + switch (value->type) { case GRECS_TYPE_STRING: act = create_action (comp, locus, value, 1, _get_string_arg); break; - + case GRECS_TYPE_ARRAY: act = create_action (comp, locus, value, value->v.arg.c, _get_array_arg); break; - + case GRECS_TYPE_LIST: count = grecs_list_size (value->v.list); act = create_action (comp, locus, value, count, _get_list_arg); } if (!act) return 1; *(struct action **) cb_data = act; break; - + case grecs_callback_section_end: break; case grecs_callback_set_value: grecs_error (locus, 0, _("invalid use of block statement")); } @@ -539,13 +539,13 @@ _cb_command (enum grecs_callback_command cmd, grecs_error (locus, 0, "wordsplit: %s", strerror (errno)); return 1; } wordsplit_get_words (&ws, &comp->argc, &comp->argv); wordsplit_free (&ws); break; - + case GRECS_TYPE_ARRAY: comp->argv = config_array_to_argv (value, locus, &comp->argc); break; case GRECS_TYPE_LIST: grecs_error (locus, 0, _("unexpected list")); @@ -699,13 +699,13 @@ _cb_redir (enum grecs_callback_command cmd, {"null", redir_null}, {"syslog", redir_syslog}, {"file", redir_file}, {NULL} }; int res; - + switch (value->type) { case GRECS_TYPE_STRING: if (strcmp (value->v.string, "null") == 0) { rp->type = redir_null; @@ -716,13 +716,13 @@ _cb_redir (enum grecs_callback_command cmd, { grecs_error (locus, 0, _("unknown syslog priority %s"), value->v.string); return 0; } break; - + case GRECS_TYPE_ARRAY: if (assert_grecs_value_type (locus, value->v.arg.v[0], GRECS_TYPE_STRING)) return 0; if (strtotok (redirtab, value->v.arg.v[0]->v.string, &res)) grecs_error (locus, 0, _("%s: unrecognised redirector type"), @@ -736,48 +736,48 @@ _cb_redir (enum grecs_callback_command cmd, grecs_error (locus, 0, _("wrong number of arguments")); return 0; } if (assert_grecs_value_type (locus, value->v.arg.v[1], GRECS_TYPE_STRING)) return 0; - + switch (res) { case redir_null: break; - + case redir_syslog: if (string_to_syslog_priority (value->v.arg.v[1]->v.string, &rp->v.prio)) { grecs_error (locus, 0, _("unknown syslog priority %s"), value->v.arg.v[1]->v.string); return 0; } break; - + case redir_file: rp->v.file = grecs_strdup (value->v.arg.v[1]->v.string); break; } } rp->type = res; } break; - + default: grecs_error (locus, 0, _("unexpected list")); } - + return 0; } static struct tokendef socktype_xtab[] = { - { "stream", SOCK_STREAM }, - { "dgram", SOCK_DGRAM }, + { "stream", SOCK_STREAM }, + { "dgram", SOCK_DGRAM }, { "seqpacket", SOCK_SEQPACKET }, { "raw", SOCK_RAW }, { "rdm", SOCK_RDM }, #ifdef SOCK_PACKET { "packet", SOCK_PACKET }, #endif @@ -817,18 +817,20 @@ static struct tokendef modetab[] = { {"once", pies_comp_once}, {"accept", pies_comp_accept}, {"inetd", pies_comp_inetd}, {"nostartaccept", pies_comp_inetd}, {"pass-fd", pies_comp_pass_fd}, {"pass", pies_comp_pass_fd}, + {"startup", pies_comp_startup}, + {"shutdown", pies_comp_shutdown}, {"boot", pies_comp_boot}, {"bootwait", pies_comp_boot}, {"powerfail", pies_comp_powerfail}, {"powerwait", pies_comp_powerwait}, {"powerokwait", pies_comp_powerokwait}, - {"ctrlaltdel", pies_comp_ctrlaltdel}, + {"ctrlaltdel", pies_comp_ctrlaltdel}, {"ondemand", pies_comp_ondemand}, {"sysinit", pies_comp_sysinit}, {"powerfailnow", pies_comp_powerfailnow}, {"kbrequest", pies_comp_kbrequest}, {NULL} @@ -917,17 +919,17 @@ _cb_flags (enum grecs_callback_command cmd, if (str_to_cf (value->v.string, flags)) { grecs_error (locus, 0, _("%s: unrecognised flag"), value->v.string); return 1; } break; - + case GRECS_TYPE_LIST: { struct grecs_list_entry *ep; - + for (ep = value->v.list->head; ep; ep = ep->next) { const grecs_value_t *vp = ep->data; if (assert_grecs_value_type (locus, vp, GRECS_TYPE_STRING)) return 1; if (str_to_cf (vp->v.string, flags)) @@ -936,13 +938,13 @@ _cb_flags (enum grecs_callback_command cmd, vp->v.string); return 1; } } } break; - + case GRECS_TYPE_ARRAY: grecs_error (locus, 0, _("too many arguments")); return 1; } return 0; } @@ -1225,13 +1227,13 @@ struct grecs_keyword component_keywords[] = { }; struct grecs_keyword * find_component_keyword (const char *ident) { struct grecs_keyword *kwp; - + for (kwp = component_keywords; kwp->ident; kwp++) if (strcmp (kwp->ident, ident) == 0) return kwp; return NULL; } @@ -1253,13 +1255,13 @@ component_section_parser (enum grecs_callback_command cmd, break; case grecs_callback_section_end: comp = *(struct component **) section_data; component_finish (comp, locus); break; - + case grecs_callback_set_value: grecs_error (locus, 0, _("expected block statement")); } return 0; } @@ -1531,13 +1533,13 @@ pies_config_parse (char const *name) { struct grecs_node *node; struct grecs_node *tree = grecs_parse (name); if (!tree) return 1; - + for (node = tree; node; node = node->next) { node = grecs_find_node (node, "identity-provider"); if (!node) break; pies_config_provider (node); @@ -1547,13 +1549,13 @@ pies_config_parse (char const *name) return 1; grecs_tree_free (tree); if (grecs_error_count) return 1; - + return 0; } void config_help (void) { @@ -1570,26 +1572,26 @@ int pies_read_config (void) { struct grecs_list_entry *ep; int err = 0; component_config_begin (); - + for (ep = config_list->head; ep; ep = ep->next) { struct config_file *file = ep->data; if (file->syntax->parser (file->name)) ++err; } if (init_process) err = 0; - + if (err) component_config_rollback (); - + return err; } int pies_reread_config (void) { @@ -1653,13 +1655,13 @@ sig_handler (int sig) void setsigvhan (RETSIGTYPE (*handler) (int signo), int *sigv, int sigc) { int i; struct sigaction act; - + act.sa_flags = 0; sigemptyset (&act.sa_mask); for (i = 0; i < sigc; i++) sigaddset (&act.sa_mask, sigv[i]); act.sa_handler = handler; @@ -1776,13 +1778,13 @@ pies_check_status (pid_t *ppid) int request_restart_components (size_t cc, char **cv) { char **argv; size_t i, j; - + argv = grecs_calloc (5 + 3 * cc - 1, sizeof (*argv)); argv[0] = "piesctl"; argv[1] = "--url"; argv[2] = (char*) pies_control_url (); argv[3] = "restart"; j = 4; @@ -1800,13 +1802,13 @@ request_restart_components (size_t cc, char **cv) } void list_components (void) { char *argv[5]; - + argv[0] = "piesctl"; argv[1] = "--url"; argv[2] = (char*) pies_control_url (); argv[3] = "list"; argv[4] = NULL; execvp (argv[0], argv); @@ -1939,13 +1941,13 @@ remove_pidfile (char *name) static void set_mailer_argcv (void) { int i; struct wordsplit ws; - + if (wordsplit (mailer_command_line, &ws, WRDSF_DEFFLAGS)) { logmsg (LOG_CRIT, _("cannot parse mailer command line: %s"), strerror (errno)); exit (EX_CONFIG); } @@ -2030,61 +2032,61 @@ main (int argc, char **argv) { pid_t pid; extern char **environ; struct grecs_list_entry *ep; int diag_flags; int i; - + set_program_name (argv[0]); #ifdef ENABLE_NLS setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); #endif mf_proctitle_init (argc, argv, environ); grecs_print_diag_fun = pies_diag_printer; - + pies_master_argc = argc; pies_master_argv = argv; - + set_quoting_style (NULL, shell_quoting_style); init_process = getpid () == 1; for (i = 1; i < argc; i++) { if (strcmp (argv[i], "--no-init") == 0) { init_process = 0; break; } } - + /* Set default logging */ if (init_process) { log_facility = LOG_DAEMON; diag_flags = DIAG_TO_STDERR | DIAG_REOPEN_LOG; } else diag_flags = DIAG_TO_SYSLOG | (stderr_closed_p () ? 0 : DIAG_TO_STDERR); - + diag_setup (diag_flags); - + config_init (); parse_options (&argc, &argv); - + if (argc && !(command == COM_RESTART_COMPONENT || command == COM_TRACE_DEPEND || command == COM_TRACE_PREREQ)) { logmsg (LOG_ERR, "extra command line arguments"); exit (EX_USAGE); } - + if (!instance) { instance = strrchr (program_name, '/'); if (!instance) instance = (char*) program_name; else @@ -2116,39 +2118,39 @@ main (int argc, char **argv) exit (EX_CONFIG); component_config_commit (); set_state_file_names (instance); set_mailer_argcv (); - + if (lint_mode) exit (0); /* Re-setup logging: it might have been reset in the config file */ diag_setup (log_to_stderr_only ? DIAG_TO_STDERR : 0); - + if (!control.url) { char const *str = default_control_url[init_process]; if (pies_url_create (&control.url, str)) { logmsg (LOG_CRIT, _("%s: cannot create control URL: %s"), str, strerror (errno)); if (!init_process) exit (EX_OSERR); } } - + switch (command) { case COM_RESTART_COMPONENT: pies_priv_setup (&pies_privs); if (pies_umask) umask (pies_umask); exit (request_restart_components (argc, argv)); - + case COM_RELOAD: exit (request_reload ()); case COM_STATUS: exit (request_status ()); @@ -2159,17 +2161,17 @@ main (int argc, char **argv) components_dump_depmap (); exit (0); case COM_TRACE_DEPEND: components_trace (argv, depmap_row); exit (0); - - case COM_TRACE_PREREQ: + + case COM_TRACE_PREREQ: components_trace (argv, depmap_col); exit (0); - + default: pies_priv_setup (&pies_privs); if (pies_umask) umask (pies_umask); } @@ -2190,47 +2192,48 @@ main (int argc, char **argv) logmsg (LOG_ERR, _("another pies instance may be running (pid %lu), " "use --force to override"), (unsigned long) pid); exit (EX_USAGE); } break; - + case pies_status_running: logmsg (LOG_ERR, _("another pies instance already running (pid %lu)"), (unsigned long) pid); exit (EX_USAGE); } - + if (!foreground) { check_pidfile (pidfile); if (daemon (0, 0) == -1) { logfuncall ("daemon", NULL, errno); exit (EX_SOFTWARE); } diag_setup (DIAG_TO_SYSLOG); } logmsg (LOG_INFO, _("%s %s starting"), proginfo.package, proginfo.version); - + if (!init_process) { if (ctl_open ()) exit (EX_UNAVAILABLE); create_pidfile (pidfile); } - + if (pies_master_argv[0][0] != '/') logmsg (LOG_NOTICE, _("not started as an absolute pathname; " "restart will not work")); signal_setup (sig_handler); progman_create_sockets (); + program_init_startup (); progman_start (); do { if (children_op == PIES_CHLD_NONE) pies_pause (); @@ -2258,13 +2261,13 @@ main (int argc, char **argv) progman_create_sockets (); progman_start (); pies_schedule_children (PIES_CHLD_WAKEUP); action = ACTION_CONT; break; - + case ACTION_STOP: if (init_process) { debug (1, ("ignoring stop/restart")); action = ACTION_CONT; } @@ -2273,13 +2276,13 @@ main (int argc, char **argv) case ACTION_CTRLALTDEL: debug (1, ("ctrl-alt-del")); sysvinit_runlevel_setup (PIES_COMP_MASK (pies_comp_ctrlaltdel)); pies_schedule_children (PIES_CHLD_WAKEUP); action = ACTION_CONT; break; - + case ACTION_KBREQUEST: debug (1, ("kbrequest")); sysvinit_runlevel_setup (PIES_COMP_MASK (pies_comp_kbrequest)); pies_schedule_children (PIES_CHLD_WAKEUP); action = ACTION_CONT; break; @@ -101,13 +101,13 @@ struct action { size_t nstat; unsigned *status; enum return_action act; /* Action to take when the component terminates */ char *addr; /* Addresses to notify about it. */ char *message; /* Notification mail. */ - char *command; /* Execute this command */ + char *command; /* Execute this command */ }; /* user privs */ struct pies_privs { @@ -134,20 +134,27 @@ enum pies_comp_mode */ pies_comp_inetd, /* Open a socket, start a component, and pass the socket fd to the component via the UNIX domain socket. Corresponds to `start_action = pass' in MeTA1. */ pies_comp_pass_fd, - + + /* Components of this type runs once on program startup. Running other + components is delayed until the last startup component finishes. */ + pies_comp_startup, + + /* FIXME: Runs before program termination */ + pies_comp_shutdown, + /* ** Init-style components */ pies_mark_sysvinit, /* Start the process when the specified runlevel is entered and wait for its termination */ - pies_comp_wait = pies_mark_sysvinit, + pies_comp_wait = pies_mark_sysvinit, /* Execute the component once, when the specified runlevel is entered */ pies_comp_once, /* Execute the component during system boot. Ignore runlevel settings. */ pies_comp_boot, /* Execute the component during system boot and wait for it to terminate. Ignore runlevel settings. */ @@ -159,13 +166,13 @@ enum pies_comp_mode pies_comp_powerwait, /* Execute the component when the power is restored. Wait for it to terminate. */ pies_comp_powerokwait, /* Execute the process when SIGINT is delivered, i.e. someone has pressed the Ctrl+Alt+Del combination. */ - pies_comp_ctrlaltdel, + pies_comp_ctrlaltdel, /* Execute the component when a specified ondemand runlevel is called */ pies_comp_ondemand, /* Execute the component on the system boot. */ pies_comp_sysinit, /* Execute the component when running on the UPS and pies is informed that the UPS battery is almost empty. */ @@ -181,22 +188,22 @@ enum pies_comp_mode #define PIES_COMP_DEFAULT 0 #define PIES_COMP_MASK(m) (1 << ((m))) #define CF_DISABLED 0x001 /* The componenet is disabled */ #define CF_PRECIOUS 0x002 /* The component is precious (should not - be disabled) */ + be disabled) */ #define CF_WAIT 0x004 /* Wait for the component instance to - terminate. */ + terminate. */ #define CF_TCPMUX 0x008 /* A plain TCPMUX service */ #define CF_TCPMUXPLUS 0x010 /* A TCPMUX-plus service, i.e. pies - must emit a '+' response before starting - it */ + must emit a '+' response before starting + it */ #define CF_INTERNAL 0x020 /* An internal inetd service */ #define CF_SOCKENV 0x040 /* Component wants socket information in - the environment */ + the environment */ #define CF_RESOLVE 0x080 /* Resolve IP addresses */ #define CF_SIGGROUP 0x100 /* Send signals to the process group */ #define CF_NULLINPUT 0x200 /* Provide null input stream */ #define CF_REMOVE 0x400 /* Marked for removal */ @@ -207,15 +214,15 @@ struct prog; struct component { struct component *prev, *next; /* Components form doubly-linked list. */ int listidx; /* Index of the list. */ size_t arridx; /* Index of this component. */ - size_t ref_count; /* Reference count. */ + size_t ref_count; /* Reference count. */ struct prog *prog; /* Prog associated with this component. */ - + enum pies_comp_mode mode; char *tag; /* Entry tag (for diagnostics purposes) */ char *program; /* Program name */ size_t argc; /* Number of command line arguments */ char **argv; /* Program command line */ char **env; /* Program environment */ @@ -229,13 +236,13 @@ struct component struct pies_privs privs; /* UID/GIDS+groups to run as */ mode_t umask; /* Umask to install before starting */ limits_record_t limits; /* System limits */ /* For exec (init) components */ char *runlevels; - + /* For inetd components */ size_t max_rate; /* Maximum number of invocations per minute */ size_t max_ip_connections; /* Max. number of connections per IP address */ int socket_type; /* Socket type */ struct inetd_builtin *builtin; /* Builtin function */ char *service; @@ -250,15 +257,15 @@ struct component char *tcpmux; /* Master service for TCPMUX */ /* Optional error messages to be sent back on the socket: */ char *access_denied_message; char *max_instances_message; char *max_ip_connections_message; - + /* Redirectors: */ - int facility; /* Syslog facility. */ + int facility; /* Syslog facility. */ struct redirector redir[2]; /* Repeaters for stdout and stderr */ /* Actions to execute on various exit codes: */ struct grecs_list *act_list; /* ACLs for control interface */ pies_acl_t list_acl; /* List access control list */ pies_acl_t adm_acl; /* Administrative ACL (stop, start, etc.) */ @@ -331,12 +338,13 @@ void free_action (struct action *act); void pies_schedule_children (int op); int pies_read_config (void); int pies_reread_config (void); void register_prog (struct component *comp); +void program_init_startup (void); int progman_waiting_p (void); void progman_start (void); void progman_gc (void); void progman_wake_sleeping (int); void progman_stop (void); void progman_cleanup (int expect_term); @@ -591,13 +599,13 @@ struct sysvinit_request /* utmp.c */ #define SYSV_ACCT_BOOT 0 #define SYSV_ACCT_RUNLEVEL 1 #define SYSV_ACCT_PROC_START 2 -#define SYSV_ACCT_PROC_STOP 3 +#define SYSV_ACCT_PROC_STOP 3 void sysvinit_acct (int what, const char *user, const char *id, pid_t pid, const char *line); /* ctl.c */ diff --git a/src/progman.c b/src/progman.c index 1b09cd5..5bc4eb3 100644 --- a/src/progman.c +++ b/src/progman.c @@ -62,13 +62,13 @@ progman_lookup_component (const char *tag) { struct prog *prog; for (prog = proghead; prog; prog = prog->next) if (IS_COMPONENT (prog) && strcmp (prog_tag (prog), tag) == 0) return prog->v.p.comp; return NULL; -} +} struct component * progman_lookup_tcpmux (const char *service, const char *master) { struct prog *prog; for (prog = proghead; prog; prog = prog->next) @@ -119,13 +119,13 @@ link_prog (struct prog *prog, struct prog *ref) else { struct prog *x; prog->prev = ref; prog->next = ref->next; - + if ((x = ref->next)) x->prev = prog; else progtail = prog; ref->next = prog; @@ -148,27 +148,27 @@ unlink_prog (struct prog *pp) } void destroy_prog (struct prog **pp) { struct prog *p = *pp; - + unlink_prog (p); switch (p->type) { case TYPE_COMPONENT: component_ref_decr (p->v.p.comp); if (p->v.p.status == status_listener && p->v.p.socket != -1) - deregister_socket (p->v.p.socket); - /* FIXME: Remove also all dependent progs (esp. tcpmux) */ + deregister_socket (p->v.p.socket); + /* FIXME: Remove also all dependent progs (esp. tcpmux) */ if (p->v.p.redir[RETR_OUT]) p->v.p.redir[RETR_OUT]->v.r.master = NULL; if (p->v.p.redir[RETR_ERR]) p->v.p.redir[RETR_ERR]->v.r.master = NULL; break; - + case TYPE_REDIRECTOR: { struct prog *master = p->v.r.master; component_ref_decr (p->v.r.comp); if (master) { @@ -179,13 +179,13 @@ destroy_prog (struct prog **pp) } /* else logmsg (LOG_NOTICE, _("orphan redirector: %s"), p->tag);*/ free (p->v.r.tag); } break; - + case TYPE_COMMAND: free (p->v.c.tag); free (p->v.c.command); } free (p); *pp = NULL; @@ -253,13 +253,13 @@ find_prog_ref (struct component *comp) if (!comp->prog) { comp = comp->prev; if (!comp) return NULL; /* FIXME: Skip redirectors? */ } - + if (comp->prog) { for (prog = comp->prog; prog->next && IS_COMPONENT (prog->next) && prog->next->v.p.comp == comp; @@ -267,18 +267,18 @@ find_prog_ref (struct component *comp) ; } else prog = NULL; return prog; } - + static struct prog * register_prog0 (struct component *comp) { struct prog *newp; - + |