2 * copyright (c) 2001-2011 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.
23 #include "bsd.h" /* for strlcpy */
34 static void to_syslog(const char *type
, const int want_err
,
35 const char *format
, va_list va
) _printflike_(3, 0);
38 to_syslog(const char *type
, const int want_err
,
39 const char *format
, va_list va
)
43 int saved_errno
= errno
;
46 strlcpy(buf
, type
, sizeof(buf
));
49 vsnprintf(buf
+pos
, sizeof(buf
)-pos
, format
, va
);
51 strlcat(buf
, ": ", sizeof(buf
));
52 strlcat(buf
, strerror(saved_errno
), sizeof(buf
));
54 syslog(LOG_DEBUG
, "%s", buf
);
58 err(const int code
, const char *format
, ...)
64 to_syslog("ERROR: ", 1, format
, va
);
66 fprintf(stderr
, "%5d: error: ", (int)getpid());
67 vfprintf(stderr
, format
, va
);
68 fprintf(stderr
, ": %s\n", strerror(errno
));
76 errx(const int code
, const char *format
, ...)
82 to_syslog("ERROR: ", 0, format
, va
);
84 fprintf(stderr
, "%5d: error: ", (int)getpid());
85 vfprintf(stderr
, format
, va
);
86 fprintf(stderr
, "\n");
94 warn(const char *format
, ...)
100 to_syslog("WARNING: ", 1, format
, va
);
102 fprintf(stderr
, "%5d: warning: ", (int)getpid());
103 vfprintf(stderr
, format
, va
);
104 fprintf(stderr
, ": %s\n", strerror(errno
));
110 warnx(const char *format
, ...)
114 va_start(va
, format
);
116 to_syslog("WARNING: ", 0, format
, va
);
118 fprintf(stderr
, "%5d: warning: ", (int)getpid());
119 vfprintf(stderr
, format
, va
);
120 fprintf(stderr
, "\n");
125 /* We interlock verbosef() between processes by using a pipe with a single
126 * byte in it. This pipe must be initialized before the first fork() in order
127 * to work. Then, verbosef() will block on a read() until it is able to
128 * retrieve the byte. After doing its business, it will put a byte back into
131 * This is completely silly and largely unnecessary.
133 static int inited
= 0;
134 static int lockpipe
[2];
136 static void unlock(void);
141 if (pipe(lockpipe
) == -1)
142 err(1, "pipe(lockpipe)");
152 if (!inited
) initlock();
153 if (read(lockpipe
[0], buf
, 1) != 1) {
154 fprintf(stderr
, "lock failed!\n");
165 if (write(lockpipe
[1], &c
, 1) != 1) {
166 fprintf(stderr
, "unlock failed!\n");
173 verbosef(const char *format
, ...)
177 if (!opt_want_verbose
) return;
178 va_start(va
, format
);
180 to_syslog(NULL
, 0, format
, va
);
183 fprintf(stderr
, "darkstat (%05d): ", (int)getpid());
184 vfprintf(stderr
, format
, va
);
185 fprintf(stderr
, "\n");
192 dverbosef(const char *format _unused_
, ...)
194 /* disabled / do-nothing verbosef */
197 /* vim:set ts=3 sw=3 tw=78 expandtab: */