2 * copyright (c) 2001-2009 Emil Mikulic.
4 * err.c: BSD-like err() and warn() functions
6 * Permission to use, copy, modify, and distribute this file for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
34 to_syslog(const char *type
, const int want_err
,
35 const char *format
, va_list va
)
39 int saved_errno
= errno
;
42 strlcpy(buf
, type
, sizeof(buf
));
45 vsnprintf(buf
+pos
, sizeof(buf
)-pos
, format
, va
);
47 strlcat(buf
, ": ", sizeof(buf
));
48 strlcat(buf
, strerror(saved_errno
), sizeof(buf
));
50 syslog(LOG_DEBUG
, "%s", buf
);
54 err(const int code
, const char *format
, ...)
60 to_syslog("ERROR: ", 1, format
, va
);
62 fprintf(stderr
, "%5d: error: ", (int)getpid());
63 vfprintf(stderr
, format
, va
);
64 fprintf(stderr
, ": %s\n", strerror(errno
));
72 errx(const int code
, const char *format
, ...)
78 to_syslog("ERROR: ", 0, format
, va
);
80 fprintf(stderr
, "%5d: error: ", (int)getpid());
81 vfprintf(stderr
, format
, va
);
82 fprintf(stderr
, "\n");
90 warn(const char *format
, ...)
96 to_syslog("WARNING: ", 1, format
, va
);
98 fprintf(stderr
, "%5d: warning: ", (int)getpid());
99 vfprintf(stderr
, format
, va
);
100 fprintf(stderr
, ": %s\n", strerror(errno
));
106 warnx(const char *format
, ...)
110 va_start(va
, format
);
112 to_syslog("WARNING: ", 0, format
, va
);
114 fprintf(stderr
, "%5d: warning: ", (int)getpid());
115 vfprintf(stderr
, format
, va
);
116 fprintf(stderr
, "\n");
121 /* We interlock verbosef() between processes by using a pipe with a single
122 * byte in it. This pipe must be initialized before the first fork() in order
123 * to work. Then, verbosef() will block on a read() until it is able to
124 * retrieve the byte. After doing its business, it will put a byte back into
127 * This is completely silly and largely unnecessary.
129 static int inited
= 0;
130 static int lockpipe
[2];
132 static void unlock(void);
137 if (pipe(lockpipe
) == -1)
138 err(1, "pipe(lockpipe)");
148 if (!inited
) initlock();
149 if (read(lockpipe
[0], buf
, 1) != 1) {
150 fprintf(stderr
, "lock failed!\n");
161 if (write(lockpipe
[1], &c
, 1) != 1) {
162 fprintf(stderr
, "unlock failed!\n");
168 int want_verbose
= 0, want_syslog
= 0;
171 verbosef(const char *format
, ...)
175 if (!want_verbose
) return;
176 va_start(va
, format
);
178 to_syslog(NULL
, 0, format
, va
);
181 fprintf(stderr
, "darkstat (%05d): ", (int)getpid());
182 vfprintf(stderr
, format
, va
);
183 fprintf(stderr
, "\n");
190 dverbosef(const char *format _unused_
, ...)
192 /* disabled / do-nothing verbosef */
195 /* vim:set ts=3 sw=3 tw=78 expandtab: */