err: more std behaviour, set/getprogname
authorMarko Kreen <markokr@gmail.com>
Wed, 9 Sep 2009 19:06:37 +0000 (22:06 +0300)
committerMarko Kreen <markokr@gmail.com>
Wed, 9 Sep 2009 19:06:37 +0000 (22:06 +0300)
m4/usual.m4
usual/err.c
usual/err.h

index 5c266bbeba761d54047a771c0a97f7c0e2666c85..ce03f14e72a934d1a93a573174dc37258bd996e3 100644 (file)
@@ -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
index e1f2fb5587ce1fb9c9679cbbabb0a75693c9b4d1..145c4c055d60e58d1de307e580a4a6cdea4d624d 100644 (file)
 
 #include <usual/string.h>
 
+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
 
index 148c5f83152d937a4995f712db5b05efef87a59f..15d5412b7897941509da0eadbd269872773ff011 100644 (file)
@@ -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);