diff --git a/include/err.h b/include/err.h index 9f5cb6b..3dffbae 100644 --- a/include/err.h +++ b/include/err.h @@ -12,11 +12,15 @@ void warn(const char *, ...); void vwarn(const char *, va_list); void warnx(const char *, ...); void vwarnx(const char *, va_list); +void warnc(int, const char *, ...); +void vwarnc(int, const char *, va_list); _Noreturn void err(int, const char *, ...); _Noreturn void verr(int, const char *, va_list); _Noreturn void errx(int, const char *, ...); _Noreturn void verrx(int, const char *, va_list); +_Noreturn void errc(int, int, const char *, ...); +_Noreturn void verrc(int, int, const char *, va_list); #ifdef __cplusplus } diff --git a/src/legacy/err.c b/src/legacy/err.c index 0d6ab52..a7e1bdf 100644 --- a/src/legacy/err.c +++ b/src/legacy/err.c @@ -1,18 +1,26 @@ #include +#include #include #include #include +#include extern char *__progname; -void vwarn(const char *fmt, va_list ap) +void vwarnc(int error, const char *fmt, va_list ap) { fprintf (stderr, "%s: ", __progname); if (fmt) { vfprintf(stderr, fmt, ap); fputs (": ", stderr); } - perror(0); + fputs(strerror(error), stderr); + fputc('\n', stderr); +} + +void vwarn(const char *fmt, va_list ap) +{ + vwarnc(errno, fmt, ap); } void vwarnx(const char *fmt, va_list ap) @@ -22,6 +30,12 @@ void vwarnx(const char *fmt, va_list ap) putc('\n', stderr); } +_Noreturn void verrc(int status, int error, const char *fmt, va_list ap) +{ + vwarnc(error, fmt, ap); + exit(status); +} + _Noreturn void verr(int status, const char *fmt, va_list ap) { vwarn(fmt, ap); @@ -34,6 +48,14 @@ _Noreturn void verrx(int status, const char *fmt, va_list ap) exit(status); } +void warnc(int error, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + vwarnc(error, fmt, ap); + va_end(ap); +} + void warn(const char *fmt, ...) { va_list ap; @@ -50,6 +72,14 @@ void warnx(const char *fmt, ...) va_end(ap); } +_Noreturn void errc(int status, int error, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + verrc(status, error, fmt, ap); + va_end(ap); +} + _Noreturn void err(int status, const char *fmt, ...) { va_list ap;