Commit | Line | Data |
---|---|---|
800ffe89 NW |
1 | /* |
2 | * Warning: extremely XXX | |
3 | * fake syslog to write to stderr, for standalone test version of init | |
4 | */ | |
9a6eb889 NW |
5 | |
6 | ||
7 | #ifdef FAKE_SYSLOG | |
8 | ||
9 | ||
10 | #include <unistd.h> | |
11 | #include <string.h> | |
800ffe89 | 12 | #include <stdarg.h> |
9a6eb889 NW |
13 | #include <errno.h> |
14 | #include <sys/file.h> | |
800ffe89 NW |
15 | |
16 | ||
9a6eb889 NW |
17 | #ifdef TESTRUN |
18 | # define FAKE_LOGFILE "/dev/tty" | |
19 | #else | |
20 | # define FAKE_LOGFILE "/dev/console" | |
21 | #endif | |
22 | ||
23 | ||
24 | static char * | |
25 | itoa(i) | |
26 | int i; | |
27 | { | |
28 | static char buf[12]; | |
29 | char *s; | |
30 | int minflg = 0; | |
31 | ||
32 | s = &buf[11]; | |
33 | *s = '\0'; | |
34 | if (i < 0) | |
35 | minflg = 1, i = -i; | |
36 | do { | |
37 | *(--s) = (i % 10) + '0'; | |
38 | i /= 10; | |
39 | } while (i); | |
40 | if (minflg) | |
41 | *(--s) = '-'; | |
42 | return(s); | |
43 | } | |
44 | ||
45 | ||
46 | static int _log_fd = 2; | |
47 | static const char *_log_id = ""; | |
800ffe89 NW |
48 | |
49 | ||
50 | void | |
9a6eb889 NW |
51 | openlog(ident, logopt, facility) |
52 | const char *ident; | |
53 | int logopt, facility; | |
800ffe89 | 54 | { |
9a6eb889 NW |
55 | if (ident) |
56 | _log_id = ident; | |
57 | if (_log_fd >= 0) | |
58 | close(_log_fd); | |
59 | _log_fd = open(FAKE_LOGFILE, O_WRONLY | O_NONBLOCK, 0); | |
800ffe89 NW |
60 | } |
61 | ||
62 | ||
63 | void | |
9a6eb889 | 64 | vsyslog(int pri, const char *fmt, va_list ap) |
800ffe89 | 65 | { |
9a6eb889 NW |
66 | const char *s, *t; |
67 | int saved_errno = errno; | |
800ffe89 | 68 | |
9a6eb889 NW |
69 | if (write(_log_fd, "", 0) < 0) |
70 | openlog(NULL, 0, 0); | |
71 | write(_log_fd, _log_id, strlen(_log_id)); | |
72 | if (*_log_id) write(_log_fd, ": ", 2); | |
73 | for (s=fmt; *s; s++) | |
74 | if (*s == '%') | |
75 | switch (*(++s)) { | |
76 | case '\0': | |
77 | s--; break; | |
78 | case '%': | |
79 | write(_log_fd, s, 1); break; | |
80 | case 's': | |
81 | t = va_arg(ap, char *); | |
82 | write(_log_fd, t, strlen(t)); | |
83 | break; | |
84 | case 'm': | |
85 | #ifdef SMALL | |
86 | write(_log_fd, "Error ", 6); | |
87 | t = itoa(saved_errno); | |
88 | #else | |
89 | t = strerror(saved_errno); | |
90 | #endif | |
91 | write(_log_fd, t, strlen(t)); | |
92 | break; | |
93 | case 'd': | |
94 | t = itoa(va_arg(ap, int)); | |
95 | write(_log_fd, t, strlen(t)); | |
96 | break; | |
97 | default: | |
98 | write(_log_fd, s-1, 2); | |
99 | } | |
100 | else | |
101 | write(_log_fd, s, 1); | |
102 | write(_log_fd, "\n", 1); | |
800ffe89 NW |
103 | } |
104 | ||
9a6eb889 | 105 | |
800ffe89 | 106 | void |
9a6eb889 | 107 | syslog(int pri, const char *fmt, ...) |
800ffe89 | 108 | { |
9a6eb889 NW |
109 | va_list ap; |
110 | ||
111 | va_start(ap, fmt); | |
112 | vsyslog(pri, fmt, ap); | |
113 | va_end(ap); | |
800ffe89 NW |
114 | } |
115 | ||
116 | ||
117 | void | |
118 | closelog(void) | |
119 | { | |
9a6eb889 NW |
120 | close(_log_fd); |
121 | _log_fd = -1; | |
800ffe89 | 122 | } |
9a6eb889 NW |
123 | |
124 | ||
125 | #endif |