diff options
-rw-r--r-- | src/diag.c | 152 | ||||
-rw-r--r-- | src/pies.c | 7 | ||||
-rw-r--r-- | src/pies.h | 11 | ||||
-rw-r--r-- | src/sysvinit.c | 10 |
4 files changed, 136 insertions, 44 deletions
@@ -16,21 +16,15 @@ | |||
16 | 16 | ||
17 | #include "pies.h" | 17 | #include "pies.h" |
18 | 18 | ||
19 | unsigned debug_level; | 19 | typedef struct |
20 | int source_info_option; | ||
21 | int diag_output = DIAG_TO_STDERR; | ||
22 | |||
23 | void | ||
24 | diag_setup (int flags) | ||
25 | { | 20 | { |
26 | if (flags) | 21 | int open; |
27 | diag_output = flags; | 22 | FILE *file; |
28 | if (diag_output & DIAG_TO_SYSLOG) | 23 | } LOGSTREAM; |
29 | openlog (log_tag, LOG_PID, log_facility); | ||
30 | } | ||
31 | 24 | ||
32 | void | 25 | |
33 | syslog_printer (int prio, const char *fmt, va_list ap) | 26 | static int |
27 | syslog_printer (LOGSTREAM *str, int prio, const char *fmt, va_list ap) | ||
34 | { | 28 | { |
35 | #if HAVE_VSYSLOG | 29 | #if HAVE_VSYSLOG |
36 | vsyslog (prio, fmt, ap); | 30 | vsyslog (prio, fmt, ap); |
@@ -39,48 +33,131 @@ syslog_printer (int prio, const char *fmt, va_list ap) | |||
39 | vsnprintf (buf, sizeof buf, fmt, ap); | 33 | vsnprintf (buf, sizeof buf, fmt, ap); |
40 | syslog (prio, "%s", buf); | 34 | syslog (prio, "%s", buf); |
41 | #endif | 35 | #endif |
36 | return 0; | ||
42 | } | 37 | } |
43 | 38 | ||
44 | static FILE * | 39 | static int |
45 | stderr_open () | 40 | syslog_open (int logf, LOGSTREAM *str) |
46 | { | 41 | { |
47 | if (!init_process) | 42 | if (logf & DIAG_REOPEN_LOG) |
48 | return stderr; | 43 | { |
44 | openlog (log_tag, LOG_PID, log_facility); | ||
45 | str->open = 1; | ||
46 | } | ||
49 | else | 47 | else |
48 | str->open = 0; | ||
49 | return 0; | ||
50 | } | ||
51 | |||
52 | static void | ||
53 | syslog_close (LOGSTREAM *str) | ||
54 | { | ||
55 | if (str->open) | ||
56 | closelog (); | ||
57 | } | ||
58 | |||
59 | static int | ||
60 | stderr_printer (LOGSTREAM *str, int prio, const char *fmt, va_list ap) | ||
61 | { | ||
62 | FILE *fp = str->file; | ||
63 | va_list aq; | ||
64 | |||
65 | fprintf (fp, "%s: ", program_name); | ||
66 | va_copy (aq, ap); | ||
67 | vfprintf (fp, fmt, aq); | ||
68 | va_end (aq); | ||
69 | fprintf (fp, "\n"); | ||
70 | return 0; | ||
71 | } | ||
72 | |||
73 | static int | ||
74 | stderr_open (int logf, LOGSTREAM *str) | ||
75 | { | ||
76 | if (logf & DIAG_REOPEN_LOG) | ||
50 | { | 77 | { |
51 | int fd = console_open (O_WRONLY|O_NOCTTY|O_NDELAY); | 78 | int fd = console_open (O_WRONLY|O_NOCTTY|O_NDELAY); |
52 | if (fd == -1) | 79 | if (fd == -1) |
53 | return NULL; | 80 | return -1; |
54 | return fdopen (fd, "w"); | 81 | str->file = fdopen (fd, "w"); |
82 | if (!str->file) | ||
83 | { | ||
84 | close (fd); | ||
85 | return -1; | ||
86 | } | ||
87 | str->open = 1; | ||
55 | } | 88 | } |
89 | else | ||
90 | { | ||
91 | str->file = stderr; | ||
92 | str->open = 0; | ||
93 | } | ||
94 | return 0; | ||
56 | } | 95 | } |
57 | 96 | ||
58 | static void | 97 | static void |
59 | stderr_close (FILE *fp) | 98 | stderr_close (LOGSTREAM *str) |
60 | { | 99 | { |
61 | if (init_process) | 100 | if (str->open) |
62 | fclose (fp); | 101 | fclose (str->file); |
63 | } | 102 | } |
103 | |||
104 | struct logger | ||
105 | { | ||
106 | int mask; | ||
107 | int (*printer) (LOGSTREAM *, int prio, const char *fmt, va_list ap); | ||
108 | int (*open) (int flags, LOGSTREAM *); | ||
109 | void (*close) (LOGSTREAM *); | ||
110 | }; | ||
111 | |||
112 | struct logger logger[] = { | ||
113 | { DIAG_TO_STDERR, stderr_printer, stderr_open, stderr_close }, | ||
114 | { DIAG_TO_SYSLOG, syslog_printer, syslog_open, syslog_close } | ||
115 | }; | ||
64 | 116 | ||
65 | void | 117 | void |
66 | vlogmsg (int prio, const char *fmt, va_list ap) | 118 | vdiagmsg (int logf, int prio, const char *fmt, va_list ap) |
67 | { | 119 | { |
68 | if (DIAG_OUTPUT (DIAG_TO_STDERR)) | 120 | int i; |
121 | for (i = 0; i < ARRAY_SIZE (logger); i++) | ||
69 | { | 122 | { |
70 | va_list aq; | 123 | if (logger[i].mask & (logf & DIAG_TO_MASK)) |
71 | FILE *fp = stderr_open (); | 124 | { |
72 | if (!fp) | 125 | LOGSTREAM stream; |
73 | return; | 126 | if (logger[i].open (logf, &stream) == 0) |
74 | fprintf (fp, "%s: ", program_name); | 127 | { |
75 | va_copy (aq, ap); | 128 | logger[i].printer (&stream, prio, fmt, ap); |
76 | vfprintf (fp, fmt, aq); | 129 | logger[i].close (&stream); |
77 | va_end (aq); | 130 | } |
78 | fprintf (fp, "\n"); | 131 | } |
79 | stderr_close (fp); | ||
80 | } | 132 | } |
81 | 133 | } | |
82 | if (DIAG_OUTPUT (DIAG_TO_SYSLOG)) | 134 | |
83 | syslog_printer (prio, fmt, ap); | 135 | void |
136 | diagmsg (int logf, int prio, const char *fmt, ...) | ||
137 | { | ||
138 | va_list ap; | ||
139 | va_start (ap, fmt); | ||
140 | vdiagmsg (logf, prio, fmt, ap); | ||
141 | va_end (ap); | ||
142 | } | ||
143 | |||
144 | unsigned debug_level; | ||
145 | int source_info_option; | ||
146 | int diag_output = DIAG_TO_STDERR; | ||
147 | |||
148 | void | ||
149 | diag_setup (int flags) | ||
150 | { | ||
151 | if (flags) | ||
152 | diag_output = flags; | ||
153 | if (diag_output & DIAG_TO_SYSLOG) | ||
154 | openlog (log_tag, LOG_PID, log_facility); | ||
155 | } | ||
156 | |||
157 | void | ||
158 | vlogmsg (int prio, const char *fmt, va_list ap) | ||
159 | { | ||
160 | vdiagmsg (diag_output, prio, fmt, ap); | ||
84 | } | 161 | } |
85 | 162 | ||
86 | void | 163 | void |
@@ -102,7 +179,6 @@ debug_msg (const char *fmt, ...) | |||
102 | } | 179 | } |
103 | 180 | ||
104 | 181 | ||
105 | |||
106 | void | 182 | void |
107 | logmsg_vprintf (int prio, const char *fmt, va_list ap) | 183 | logmsg_vprintf (int prio, const char *fmt, va_list ap) |
108 | { | 184 | { |
@@ -1968,7 +1968,7 @@ main (int argc, char **argv) | |||
1968 | 1968 | ||
1969 | /* Set default logging */ | 1969 | /* Set default logging */ |
1970 | if (init_process) | 1970 | if (init_process) |
1971 | diag_flags = DIAG_TO_STDERR; | 1971 | diag_flags = DIAG_TO_STDERR | DIAG_REOPEN_LOG; |
1972 | else | 1972 | else |
1973 | diag_flags = DIAG_TO_SYSLOG | (stderr_closed_p () ? 0 : DIAG_TO_STDERR); | 1973 | diag_flags = DIAG_TO_SYSLOG | (stderr_closed_p () ? 0 : DIAG_TO_STDERR); |
1974 | 1974 | ||
@@ -2137,8 +2137,9 @@ main (int argc, char **argv) | |||
2137 | (unsigned long) pid); | 2137 | (unsigned long) pid); |
2138 | exit (EX_USAGE); | 2138 | exit (EX_USAGE); |
2139 | } | 2139 | } |
2140 | 2140 | ||
2141 | logmsg (LOG_INFO, _("%s %s starting"), proginfo.package, proginfo.version); | 2141 | logmsg (LOG_INFO, |
2142 | _("%s %s starting"), proginfo.package, proginfo.version); | ||
2142 | 2143 | ||
2143 | if (!foreground) | 2144 | if (!foreground) |
2144 | { | 2145 | { |
@@ -446,8 +446,12 @@ int meta1parse (void); | |||
446 | 446 | ||
447 | 447 | ||
448 | /* diag.c */ | 448 | /* diag.c */ |
449 | #define DIAG_TO_SYSLOG 0x1 | 449 | #define DIAG_TO_SYSLOG 0x01 |
450 | #define DIAG_TO_STDERR 0x2 | 450 | #define DIAG_TO_STDERR 0x02 |
451 | #define DIAG_TO_MASK 0x0f | ||
452 | #define DIAG_REOPEN_LOG 0x10 | ||
453 | |||
454 | #define DIAG_ALL (DIAG_REOPEN_LOG|DIAG_TO_STDERR|DIAG_TO_SYSLOG) | ||
451 | 455 | ||
452 | extern int diag_output; | 456 | extern int diag_output; |
453 | 457 | ||
@@ -463,6 +467,9 @@ void diag_setup (int flags); | |||
463 | # define PIES_PRINTFLIKE(fmt,narg) __attribute__ ((__format__ (__printf__, fmt, narg))) | 467 | # define PIES_PRINTFLIKE(fmt,narg) __attribute__ ((__format__ (__printf__, fmt, narg))) |
464 | #endif | 468 | #endif |
465 | 469 | ||
470 | void diagmsg (int logf, int prio, const char *fmt, ...) | ||
471 | PIES_PRINTFLIKE(3,4); | ||
472 | |||
466 | void logmsg (int prio, const char *fmt, ...) PIES_PRINTFLIKE(2,3); | 473 | void logmsg (int prio, const char *fmt, ...) PIES_PRINTFLIKE(2,3); |
467 | void logmsg_printf (int prio, const char *fmt, ...) PIES_PRINTFLIKE(2,3); | 474 | void logmsg_printf (int prio, const char *fmt, ...) PIES_PRINTFLIKE(2,3); |
468 | void logmsg_vprintf (int prio, const char *fmt, va_list ap); | 475 | void logmsg_vprintf (int prio, const char *fmt, va_list ap); |
diff --git a/src/sysvinit.c b/src/sysvinit.c index 7fad00b..87a52d6 100644 --- a/src/sysvinit.c +++ b/src/sysvinit.c | |||
@@ -61,6 +61,8 @@ int prevlevel = 'N'; | |||
61 | int initdefault; /* Default runlevel */ | 61 | int initdefault; /* Default runlevel */ |