From 5b45a4a953bf9d04b1cc16a1781a9b5f887d1fb0 Mon Sep 17 00:00:00 2001 From: Marko Kreen Date: Wed, 9 Sep 2009 22:06:37 +0300 Subject: [PATCH] err: more std behaviour, set/getprogname --- m4/usual.m4 | 2 +- usual/err.c | 64 +++++++++++++++++++++++++++++++++++++++++------------ usual/err.h | 6 +++++ 3 files changed, 57 insertions(+), 15 deletions(-) diff --git a/m4/usual.m4 b/m4/usual.m4 index 5c266bb..ce03f14 100644 --- a/m4/usual.m4 +++ b/m4/usual.m4 @@ -132,7 +132,7 @@ AC_DEFUN([AC_USUAL_FUNCTION_CHECK], [ ### Functions provided if missing AC_CHECK_FUNCS(basename strlcpy strlcat getpeereid sigaction) AC_CHECK_FUNCS(inet_ntop poll getline) -AC_CHECK_FUNCS(err errx warn warnx) +AC_CHECK_FUNCS(err errx warn warnx getprogname setprogname) ### Functions provided only on win32 AC_CHECK_FUNCS(localtime_r recvmsg sendmsg) ### Functions used by libusual itself diff --git a/usual/err.c b/usual/err.c index e1f2fb5..145c4c0 100644 --- a/usual/err.c +++ b/usual/err.c @@ -24,15 +24,22 @@ #include +static const char *progname; + #ifndef HAVE_ERR void err(int e, const char *fmt, ...) { char buf[1024], ebuf[256]; va_list ap; - va_start(ap, fmt); - vsnprintf(buf, sizeof(buf), fmt, ap); - va_end(ap); - errx(e, "%s: %s", buf, strerror_r(e, ebuf, sizeof(ebuf))); + int olderrno = errno; + if (fmt) { + va_start(ap, fmt); + vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + errx(e, "%s: %s", buf, strerror_r(olderrno, ebuf, sizeof(ebuf))); + } else { + errx(e, "%s", strerror_r(olderrno, ebuf, sizeof(ebuf))); + } } #endif @@ -40,9 +47,14 @@ void err(int e, const char *fmt, ...) void errx(int e, const char *fmt, ...) { va_list ap; - va_start(ap, fmt); - vfprintf(stderr, fmt, ap); - va_end(ap); + if (progname) + fprintf(stderr, "%s: ", progname); + if (fmt) { + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + } + fprintf(stderr, "\n"); exit(e); } #endif @@ -52,10 +64,15 @@ void warn(const char *fmt, ...) { char buf[1024], ebuf[256]; va_list ap; - va_start(ap, fmt); - vsnprintf(buf, sizeof(buf), fmt, ap); - va_end(ap); - warnx("%s: %s", buf, strerror_r(e, ebuf, sizeof(ebuf))); + int olderrno = errno; + if (fmt) { + va_start(ap, fmt); + vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + warnx("%s: %s", buf, strerror_r(olderrno, ebuf, sizeof(ebuf))); + } else { + warnx("%s", strerror_r(olderrno, ebuf, sizeof(ebuf))); + } } #endif @@ -63,9 +80,28 @@ void warn(const char *fmt, ...) void warnx(const char *fmt, ...) { va_list ap; - va_start(ap, fmt); - vfprintf(stderr, fmt, ap); - va_end(ap); + if (progname) + fprintf(stderr, "%s: ", progname); + if (fmt) { + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + } +} +#endif + +#ifndef HAVE_SETPROGNAME +void setprogname(const char *s) +{ + const char *ss = strrchr(s, '/'); + progname = ss ? (ss + 1) : s; +} +#endif + +#ifndef HAVE_GETPROGNAME +const char *getprogname(void) +{ + return progname; } #endif diff --git a/usual/err.h b/usual/err.h index 148c5f8..15d5412 100644 --- a/usual/err.h +++ b/usual/err.h @@ -37,6 +37,12 @@ void warn(const char *fmt, ...); #ifndef HAVE_WARNX void warnx(const char *fmt, ...); #endif +#ifndef HAVE_SETPROGNAME +void setprogname(const char *s); +#endif +#ifndef HAVE_GETPROGNAME +const char *getprogname(void); +#endif void *xmalloc(size_t len); void *xrealloc(void *p, size_t len); -- 2.39.5