1#include <err.h>
2#include <stdarg.h>
3#include <stdio.h>
4#include <stdlib.h>
5
6extern char* __progname;
7
8void vwarn(const char* fmt, va_list ap) {
9    fprintf(stderr, "%s: ", __progname);
10    if (fmt) {
11        vfprintf(stderr, fmt, ap);
12        fputs(": ", stderr);
13    }
14    perror(0);
15}
16
17void vwarnx(const char* fmt, va_list ap) {
18    fprintf(stderr, "%s: ", __progname);
19    if (fmt)
20        vfprintf(stderr, fmt, ap);
21    putc('\n', stderr);
22}
23
24_Noreturn void verr(int status, const char* fmt, va_list ap) {
25    vwarn(fmt, ap);
26    exit(status);
27}
28
29_Noreturn void verrx(int status, const char* fmt, va_list ap) {
30    vwarnx(fmt, ap);
31    exit(status);
32}
33
34void warn(const char* fmt, ...) {
35    va_list ap;
36    va_start(ap, fmt);
37    vwarn(fmt, ap);
38    va_end(ap);
39}
40
41void warnx(const char* fmt, ...) {
42    va_list ap;
43    va_start(ap, fmt);
44    vwarnx(fmt, ap);
45    va_end(ap);
46}
47
48_Noreturn void err(int status, const char* fmt, ...) {
49    va_list ap;
50    va_start(ap, fmt);
51    verr(status, fmt, ap);
52    va_end(ap);
53}
54
55_Noreturn void errx(int status, const char* fmt, ...) {
56    va_list ap;
57    va_start(ap, fmt);
58    verrx(status, fmt, ap);
59    va_end(ap);
60}
61