diff options
-rw-r--r-- | src/diag.c | 15 | ||||
-rw-r--r-- | src/pies.c | 48 | ||||
-rw-r--r-- | src/pies.h | 11 | ||||
-rw-r--r-- | src/progman.c | 49 |
4 files changed, 73 insertions, 50 deletions
@@ -19,6 +19,16 @@ unsigned debug_level; int source_info_option; +int diag_output = DIAG_TO_STDERR; + +void +diag_setup (int flags) +{ + if (flags) + diag_output = flags; + if (diag_output & DIAG_TO_SYSLOG) + openlog (log_tag, LOG_PID, log_facility); +} void syslog_printer (int prio, const char *fmt, va_list ap) @@ -35,12 +45,13 @@ syslog_printer (int prio, const char *fmt, va_list ap) void vlogmsg (int prio, const char *fmt, va_list ap) { - if (log_to_stderr) + if (DIAG_OUTPUT (DIAG_TO_STDERR)) { + fprintf (stderr, "%s: ", program_name); vfprintf (stderr, fmt, ap); fprintf (stderr, "\n"); } - else + if (DIAG_OUTPUT (DIAG_TO_SYSLOG)) syslog_printer (prio, fmt, ap); } @@ -22,7 +22,7 @@ char *conffile = SYSCONFDIR "/pies.conf"; int preprocess_only; /* Preprocess config, do nothing more */ int lint_mode; /* Test configuration syntax and exit */ -int log_to_stderr; /* Use stderr for logging */ +int log_to_stderr_only; /* Use only stderr for logging */ int log_facility = LOG_USER; char *log_tag; struct pies_privs pies_privs; @@ -73,13 +73,6 @@ add_pp_option (const char *opt, const char *arg) /* Logging */ -void -log_setup (int want_stderr) -{ - if (!want_stderr) - openlog (log_tag, LOG_PID, log_facility); -} - static int stderr_closed_p () { @@ -1235,7 +1228,7 @@ config_init () grecs_set_keywords (pies_keywords); grecs_include_path_setup (DEFAULT_VERSION_INCLUDE_DIR, DEFAULT_INCLUDE_DIR, NULL); - grecs_log_to_stderr = log_to_stderr; + grecs_log_to_stderr = log_to_stderr_only; if (DEFAULT_PREPROCESSOR) { obstack_init (&pp_stk); @@ -1353,7 +1346,7 @@ parse_opt (int key, char *arg, struct argp_state *state) break; case 't': - log_to_stderr = 1; + log_to_stderr_only = 1; lint_mode = 1; break; @@ -1362,7 +1355,7 @@ parse_opt (int key, char *arg, struct argp_state *state) exit (0); case OPT_FOREGROUND: - log_to_stderr = 1; + log_to_stderr_only = 1; foreground = 1; break; @@ -1372,16 +1365,16 @@ parse_opt (int key, char *arg, struct argp_state *state) case OPT_RESTART: case OPT_DUMP_PREREQ: case OPT_DUMP_DEPMAP: - log_to_stderr = 1; + log_to_stderr_only = 1; command = key; break; case OPT_SYSLOG: - log_to_stderr = 0; + log_to_stderr_only = 0; break; case OPT_STDERR: - log_to_stderr = 1; + log_to_stderr_only = 1; break; case 'x': @@ -1830,8 +1823,8 @@ main (int argc, char **argv) set_quoting_style (NULL, shell_quoting_style); /* Set default logging */ - log_to_stderr = !stderr_closed_p (); - log_setup (log_to_stderr); + diag_setup (DIAG_TO_SYSLOG | (stderr_closed_p () ? 0 : DIAG_TO_STDERR)); + config_init (); argp_program_version_hook = version; if (argp_parse (&argp, argc, argv, 0, &index, NULL)) @@ -1860,8 +1853,8 @@ main (int argc, char **argv) } /* Re-setup logging: it might have been reset in the config file */ - log_setup (log_to_stderr); - + diag_setup (log_to_stderr_only ? DIAG_TO_STDERR : 0); + if (argc != index && command != 'R') { logmsg (LOG_ERR, "extra command line arguments"); @@ -1921,20 +1914,19 @@ main (int argc, char **argv) exit (EX_USAGE); } - if (!foreground) - log_setup (log_to_stderr = 0); - logmsg (LOG_INFO, _("%s starting"), program_version); if (!foreground) - check_pidfile (pidfile); - - if (!foreground && daemon (0, 0) == -1) { - logmsg (LOG_ERR, _("cannot become a daemon: %s"), strerror (errno)); - exit (EX_SOFTWARE); + check_pidfile (pidfile); + if (daemon (0, 0) == -1) + { + logmsg (LOG_ERR, _("cannot become a daemon: %s"), strerror (errno)); + exit (EX_SOFTWARE); + } + diag_setup (DIAG_TO_SYSLOG); } - + create_pidfile (pidfile); if (argv[0][0] != '/') @@ -1985,7 +1977,7 @@ main (int argc, char **argv) if (action == ACTION_RESTART && argv[0][0] == '/') { - int minfd = log_to_stderr ? 2 : 0; + int minfd = DIAG_OUTPUT (DIAG_TO_STDERR) ? 2 : 0; int i; for (i = getmaxfd (); i > minfd; i--) @@ -168,7 +168,6 @@ struct component struct action act_temp; /* Auxiliary object used during configuration */ }; -extern int log_to_stderr; extern char *log_tag; extern int log_facility; extern unsigned long shutdown_timeout; @@ -257,6 +256,16 @@ int meta1error (char *s); int meta1parse (void); +/* diag.c */ +#define DIAG_TO_SYSLOG 0x1 +#define DIAG_TO_STDERR 0x2 + +extern int diag_output; + +#define DIAG_OUTPUT(x) (diag_output & (x)) + +void diag_setup (int flags); + void logmsg (int prio, const char *fmt, ...); void logmsg_printf (int prio, const char *fmt, ...); void logmsg_vprintf (int prio, const char *fmt, va_list ap); diff --git a/src/progman.c b/src/progman.c index 8897c74..d0ea0d8 100644 --- a/src/progman.c +++ b/src/progman.c @@ -16,8 +16,12 @@ #include "pies.h" -#define TYPE_COMPONENT 0 -#define TYPE_REDIRECTOR 1 +enum prog_type + { + TYPE_COMPONENT, + TYPE_REDIRECTOR, + TYPE_PROG + }; enum prog_status { @@ -33,7 +37,7 @@ enum prog_status struct prog { struct prog *next, *prev; - int type; + enum prog_type type; pid_t pid; /* PID */ char *tag; /* Entry tag (for diagnostics purposes) */ int idx; /* Numeric identifier */ @@ -176,8 +180,8 @@ destroy_prog (struct prog **pp) master->v.p.redir[0] = NULL; else if (p == master->v.p.redir[1]) master->v.p.redir[1] = NULL; - else - logmsg (LOG_NOTICE, _("orphan redirector: %s"), p->tag); + /* else + logmsg (LOG_NOTICE, _("orphan redirector: %s"), p->tag);*/ } } unlink_prog (*pp); @@ -224,16 +228,14 @@ void update_redir (int type, struct prog *master, pid_t pid) { struct prog *pp; - if (master->v.p.redir[type] == NULL) - { - pp = register_redir (type, master); - master->v.p.redir[type] = pp; - } - else + if (master->v.p.redir[type]) { pp = master->v.p.redir[type]; prog_stop (pp, SIGKILL); /* Just in case */ } + + pp = register_redir (type, master); + master->v.p.redir[type] = pp; pp->pid = pid; } @@ -405,7 +407,7 @@ open_redirector (struct prog *master, int stream) close (i); } - log_setup (0); + diag_setup (0); signal_setup (redir_exit); close (p[1]); @@ -425,6 +427,8 @@ open_redirector (struct prog *master, int stream) return -1; default: + debug (1, (_("redirector for %s started, pid=%lu"), + master->tag, (unsigned long) pid)); update_redir (stream, master, pid); close (p[0]); return p[1]; @@ -780,6 +784,7 @@ prog_start (struct prog *prog) close (prog->v.p.socket); prog->pid = pid; prog->v.p.status = status_enabled; + debug (1, (_("%s started, pid=%lu"), prog->tag, (unsigned long) pid)); } } @@ -1235,7 +1240,7 @@ prog_stop_dependents (struct prog *prog) continue; if (!warned && dp->pid) { - debug (1, ("Stopping dependencies of %s", prog->tag)); + debug (1, ("stopping dependencies of %s", prog->tag)); warned = 1; } prog_stop (dp, SIGTERM); @@ -1257,7 +1262,7 @@ prog_stop (struct prog *prog, int sig) recompute_alarm = 1; } } - debug (1, ("Stopping %s (%lu)", prog->tag, (unsigned long) prog->pid)); + debug (1, ("stopping %s (%lu)", prog->tag, (unsigned long) prog->pid)); kill (prog->pid, sig); } @@ -1266,7 +1271,7 @@ prog_stop_all (int sig) { struct prog *prog; - debug (1, ("Stopping all components (signal %d)", sig)); + debug (1, ("stopping all components (signal %d)", sig)); for (prog = progtail; prog; prog = prog->prev) if (IS_PROG (prog) && (prog->v.p.status == status_enabled @@ -1435,7 +1440,7 @@ send_msg (char *rcpts, const char *msg_text) } if (child_pid) - /*FIXME: SIGCHLD Handler? */ + /*FIXME: reg program */ return; /* Child process */ @@ -1628,15 +1633,18 @@ progman_cleanup (int expect_term) struct prog *prog = prog_lookup_by_pid (pid); if (!prog) { + print_status (_("subprocess"), pid, status, expect_term); + /* logmsg (LOG_NOTICE, _("subprocess %lu finished"), (unsigned long) pid); + */ continue; } - print_status (prog->tag, prog->pid, status, expect_term); prog->pid = 0; if (IS_PROG (prog)) { + print_status (prog->tag, pid, status, expect_term); if (prog->v.p.comp->mode == pies_comp_inetd) { prog_stop_redirectors (prog); @@ -1709,8 +1717,11 @@ progman_cleanup (int expect_term) } else { - /* It was a redirector of an already finished inetd process. */ - debug (1, (_("removing inetd redirector %s"), prog->tag)); + /* It was a redirector of an already finished process. */ + if (!(WIFSIGNALED (status) && WTERMSIG (status) == SIGKILL)) + print_status (prog->tag, pid, status, expect_term); + debug (1, (_("removing redirector %s, pid=%lu"), + prog->tag, (unsigned long)pid)); destroy_prog (&prog); } } |