2 * copyright (c) 2001-2012 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 */
33 static void to_syslog(const char *type
, const int want_err
,
34 const char *format
, va_list va
) _printflike_(3, 0);
37 to_syslog(const char *type
, const int want_err
,
38 const char *format
, va_list va
)
42 int saved_errno
= errno
;
45 strlcpy(buf
, type
, sizeof(buf
));
48 vsnprintf(buf
+pos
, sizeof(buf
)-pos
, format
, va
);
50 strlcat(buf
, ": ", sizeof(buf
));
51 strlcat(buf
, strerror(saved_errno
), sizeof(buf
));
53 syslog(LOG_DEBUG
, "%s", buf
);
57 err(const int code
, const char *format
, ...)
63 to_syslog("ERROR: ", 1, format
, va
);
65 fprintf(stderr
, "%5d: error: ", (int)getpid());
66 vfprintf(stderr
, format
, va
);
67 fprintf(stderr
, ": %s\n", strerror(errno
));
75 errx(const int code
, const char *format
, ...)
81 to_syslog("ERROR: ", 0, format
, va
);
83 fprintf(stderr
, "%5d: error: ", (int)getpid());
84 vfprintf(stderr
, format
, va
);
85 fprintf(stderr
, "\n");
93 warn(const char *format
, ...)
99 to_syslog("WARNING: ", 1, format
, va
);
101 fprintf(stderr
, "%5d: warning: ", (int)getpid());
102 vfprintf(stderr
, format
, va
);
103 fprintf(stderr
, ": %s\n", strerror(errno
));
109 warnx(const char *format
, ...)
113 va_start(va
, format
);
115 to_syslog("WARNING: ", 0, format
, va
);
117 fprintf(stderr
, "%5d: warning: ", (int)getpid());
118 vfprintf(stderr
, format
, va
);
119 fprintf(stderr
, "\n");
124 /* We interlock verbosef() between processes by using a pipe with a single
125 * byte in it. This pipe must be initialized before the first fork() in order
126 * to work. Then, verbosef() will block on a read() until it is able to
127 * retrieve the byte. After doing its business, it will put a byte back into
130 * This is completely silly and largely unnecessary.
132 static int inited
= 0;
133 static int lockpipe
[2];
135 static void unlock(void);
140 if (pipe(lockpipe
) == -1)
141 err(1, "pipe(lockpipe)");
151 if (!inited
) initlock();
152 if (read(lockpipe
[0], buf
, 1) != 1) {
153 fprintf(stderr
, "lock failed!\n");
164 if (write(lockpipe
[1], &c
, 1) != 1) {
165 fprintf(stderr
, "unlock failed!\n");
172 verbosef(const char *format
, ...)
176 if (!opt_want_verbose
) return;
177 va_start(va
, format
);
179 to_syslog(NULL
, 0, format
, va
);
182 fprintf(stderr
, "darkstat (%05d): ", (int)getpid());
183 vfprintf(stderr
, format
, va
);
184 fprintf(stderr
, "\n");
191 dverbosef(const char *format _unused_
, ...)
193 /* disabled / do-nothing verbosef */
196 /* vim:set ts=3 sw=3 tw=78 expandtab: */