From 80fc20d1d69b14f36ad9bb64d8af38481cbf1ff5 Mon Sep 17 00:00:00 2001 From: Laslo Hunhold Date: Fri, 18 May 2018 10:59:05 +0200 Subject: Add warn() and die() Given slstatus is a tool that runs in the background, most likely run from .xinitrc, it's important to prepend the name of the tool to error messages so it becomes clear where the error is coming from. To make this much more consistent, this commit adds warn() and die() utility functions consistent with other suckless projects and adapts all calls to fprintf(stderr, *) to the warn() and die() functions, greatly increasing the readability of the code. --- components/battery.c | 10 ++++----- components/cpu.c | 4 ++-- components/datetime.c | 2 +- components/disk.c | 8 +++---- components/hostname.c | 2 +- components/ip.c | 8 +++---- components/kernel_release.c | 2 +- components/keyboard_indicators.c | 2 +- components/load_avg.c | 2 +- components/num_files.c | 2 +- components/run_command.c | 2 +- components/swap.c | 12 +++++----- components/temperature.c | 3 +-- components/uptime.c | 2 +- components/user.c | 2 +- components/volume.c | 8 +++---- components/wifi.c | 20 ++++++----------- slstatus.c | 31 ++++++++------------------ util.c | 48 +++++++++++++++++++++++++++++++++++++--- util.h | 5 +++++ 20 files changed, 99 insertions(+), 76 deletions(-) diff --git a/components/battery.c b/components/battery.c index 49f43e6..807a7e6 100644 --- a/components/battery.c +++ b/components/battery.c @@ -59,13 +59,12 @@ fd = open("/dev/apm", O_RDONLY); if (fd < 0) { - fprintf(stderr, "open '/dev/apm': %s\n", strerror(errno)); + warn("open '/dev/apm':"); return NULL; } if (ioctl(fd, APM_IOC_GETPOWER, &apm_info) < 0) { - fprintf(stderr, "ioctl 'APM_IOC_GETPOWER': %s\n", - strerror(errno)); + warn("ioctl 'APM_IOC_GETPOWER':"); close(fd); return NULL; } @@ -90,13 +89,12 @@ fd = open("/dev/apm", O_RDONLY); if (fd < 0) { - fprintf(stderr, "open '/dev/apm': %s\n", strerror(errno)); + warn("open '/dev/apm':"); return NULL; } if (ioctl(fd, APM_IOC_GETPOWER, &apm_info) < 0) { - fprintf(stderr, "ioctl 'APM_IOC_GETPOWER': %s\n", - strerror(errno)); + warn("ioctl 'APM_IOC_GETPOWER':"); close(fd); return NULL; } diff --git a/components/cpu.c b/components/cpu.c index 02e7671..b9b3924 100644 --- a/components/cpu.c +++ b/components/cpu.c @@ -57,7 +57,7 @@ size = sizeof(freq); if (sysctl(mib, 2, &freq, &size, NULL, 0) < 0) { - fprintf(stderr, "sysctl 'HW_CPUSPEED': %s\n", strerror(errno)); + warn("sysctl 'HW_CPUSPEED':"); return NULL; } @@ -80,7 +80,7 @@ memcpy(b, a, sizeof(b)); if (sysctl(mib, 2, &a, &size, NULL, 0) < 0) { - fprintf(stderr, "sysctl 'KERN_CPTIME': %s\n", strerror(errno)); + warn("sysctl 'KERN_CPTIME':"); return NULL; } if (!valid) { diff --git a/components/datetime.c b/components/datetime.c index 12d7717..c3efae3 100644 --- a/components/datetime.c +++ b/components/datetime.c @@ -11,7 +11,7 @@ datetime(const char *fmt) t = time(NULL); if (!strftime(buf, sizeof(buf), fmt, localtime(&t))) { - fprintf(stderr, "strftime: Result string exceeds buffer size\n"); + warn("strftime: Result string exceeds buffer size"); return NULL; } diff --git a/components/disk.c b/components/disk.c index bf69875..f4031ea 100644 --- a/components/disk.c +++ b/components/disk.c @@ -12,7 +12,7 @@ disk_free(const char *mnt) struct statvfs fs; if (statvfs(mnt, &fs) < 0) { - fprintf(stderr, "statvfs '%s': %s\n", mnt, strerror(errno)); + warn("statvfs '%s':", mnt); return NULL; } @@ -26,7 +26,7 @@ disk_perc(const char *mnt) struct statvfs fs; if (statvfs(mnt, &fs) < 0) { - fprintf(stderr, "statvfs '%s': %s\n", mnt, strerror(errno)); + warn("statvfs '%s':", mnt); return NULL; } @@ -40,7 +40,7 @@ disk_total(const char *mnt) struct statvfs fs; if (statvfs(mnt, &fs) < 0) { - fprintf(stderr, "statvfs '%s': %s\n", mnt, strerror(errno)); + warn("statvfs '%s':", mnt); return NULL; } @@ -54,7 +54,7 @@ disk_used(const char *mnt) struct statvfs fs; if (statvfs(mnt, &fs) < 0) { - fprintf(stderr, "statvfs '%s': %s\n", mnt, strerror(errno)); + warn("statvfs '%s':", mnt); return NULL; } diff --git a/components/hostname.c b/components/hostname.c index d41465f..dc3bbf1 100644 --- a/components/hostname.c +++ b/components/hostname.c @@ -10,7 +10,7 @@ const char * hostname(void) { if (gethostname(buf, sizeof(buf)) < 0) { - fprintf(stderr, "gethostbyname: %s\n", strerror(errno)); + warn("gethostbyname:"); return NULL; } diff --git a/components/ip.c b/components/ip.c index 85ac15e..fce2b66 100644 --- a/components/ip.c +++ b/components/ip.c @@ -19,7 +19,7 @@ ipv4(const char *iface) char host[NI_MAXHOST]; if (getifaddrs(&ifaddr) < 0) { - fprintf(stderr, "getifaddrs: %s\n", strerror(errno)); + warn("getifaddrs:"); return NULL; } @@ -32,7 +32,7 @@ ipv4(const char *iface) if (!strcmp(ifa->ifa_name, iface) && (ifa->ifa_addr->sa_family == AF_INET)) { if (s != 0) { - fprintf(stderr, "getnameinfo: %s\n", gai_strerror(s)); + warn("getnameinfo: %s", gai_strerror(s)); return NULL; } return bprintf("%s", host); @@ -52,7 +52,7 @@ ipv6(const char *iface) char host[NI_MAXHOST]; if (getifaddrs(&ifaddr) < 0) { - fprintf(stderr, "getifaddrs: %s\n", strerror(errno)); + warn("getifaddrs:"); return NULL; } @@ -65,7 +65,7 @@ ipv6(const char *iface) if (!strcmp(ifa->ifa_name, iface) && (ifa->ifa_addr->sa_family == AF_INET6)) { if (s != 0) { - fprintf(stderr, "getnameinfo: %s\n", gai_strerror(s)); + warn("getnameinfo: %s", gai_strerror(s)); return NULL; } return bprintf("%s", host); diff --git a/components/kernel_release.c b/components/kernel_release.c index 4e67a28..531014c 100644 --- a/components/kernel_release.c +++ b/components/kernel_release.c @@ -12,7 +12,7 @@ kernel_release(void) struct utsname udata; if (uname(&udata) < 0) { - fprintf(stderr, "uname: %s\n", strerror(errno)); + warn("uname:"); return NULL; } diff --git a/components/keyboard_indicators.c b/components/keyboard_indicators.c index 2f831c8..73ba32e 100644 --- a/components/keyboard_indicators.c +++ b/components/keyboard_indicators.c @@ -11,7 +11,7 @@ keyboard_indicators(void) XKeyboardState state; if (!(dpy = XOpenDisplay(NULL))) { - fprintf(stderr, "Cannot open display\n"); + warn("XOpenDisplay: Failed to open display"); return NULL; } XGetKeyboardControl(dpy, &state); diff --git a/components/load_avg.c b/components/load_avg.c index 526dc71..ea7bc2c 100644 --- a/components/load_avg.c +++ b/components/load_avg.c @@ -10,7 +10,7 @@ load_avg(const char *fmt) double avgs[3]; if (getloadavg(avgs, 3) < 0) { - fprintf(stderr, "getloadavg: Could not obtain load average.\n"); + warn("getloadavg: Failed to obtain load average"); return NULL; } diff --git a/components/num_files.c b/components/num_files.c index 327a64d..9179037 100644 --- a/components/num_files.c +++ b/components/num_files.c @@ -14,7 +14,7 @@ num_files(const char *dir) int num; if (!(fd = opendir(dir))) { - fprintf(stderr, "opendir '%s': %s\n", dir, strerror(errno)); + warn("opendir '%s':", dir); return NULL; } diff --git a/components/run_command.c b/components/run_command.c index 1aaae20..b5eeff0 100644 --- a/components/run_command.c +++ b/components/run_command.c @@ -12,7 +12,7 @@ run_command(const char *cmd) FILE *fp; if (!(fp = popen(cmd, "r"))) { - fprintf(stderr, "popen '%s': %s\n", cmd, strerror(errno)); + warn("popen '%s':", cmd); return NULL; } p = fgets(buf, sizeof(buf) - 1, fp); diff --git a/components/swap.c b/components/swap.c index caa4788..234e7d1 100644 --- a/components/swap.c +++ b/components/swap.c @@ -13,11 +13,11 @@ size_t bytes_read; if (!(fp = fopen(path, "r"))) { - fprintf(stderr, "fopen '%s': %s\n", path, strerror(errno)); + warn("fopen '%s':", path); return 0; } if (!(bytes_read = fread(buf, sizeof(char), bufsiz, fp))) { - fprintf(stderr, "fread '%s': %s\n", path, strerror(errno)); + warn("fread '%s':", path); fclose(fp); return 0; } @@ -139,21 +139,21 @@ nswap = swapctl(SWAP_NSWAP, 0, 0); if (nswap < 1) { - fprintf(stderr, "swaptctl 'SWAP_NSWAP': %s\n", strerror(errno)); + warn("swaptctl 'SWAP_NSWAP':"); } fsep = sep = calloc(nswap, sizeof(*sep)); if (!sep) { - fprintf(stderr, "calloc 'nswap': %s\n", strerror(errno)); + warn("calloc 'nswap':"); } rnswap = swapctl(SWAP_STATS, (void *)sep, nswap); if (rnswap < 0) { - fprintf(stderr, "swapctl 'SWAP_STATA': %s\n", strerror(errno)); + warn("swapctl 'SWAP_STATA':"); } if (nswap != rnswap) { - fprintf(stderr, "SWAP_STATS != SWAP_NSWAP\n"); + warn("getstats: SWAP_STATS != SWAP_NSWAP"); } *total = 0; diff --git a/components/temperature.c b/components/temperature.c index 812ae77..64199f5 100644 --- a/components/temperature.c +++ b/components/temperature.c @@ -36,8 +36,7 @@ size = sizeof(temp); if (sysctl(mib, 5, &temp, &size, NULL, 0) < 0) { - fprintf(stderr, "sysctl 'SENSOR_TEMP': %s\n", - strerror(errno)); + warn("sysctl 'SENSOR_TEMP':"); return NULL; } diff --git a/components/uptime.c b/components/uptime.c index 981f3cd..45e12db 100644 --- a/components/uptime.c +++ b/components/uptime.c @@ -50,7 +50,7 @@ format(int uptime) size = sizeof(boottime); if (sysctl(mib, 2, &boottime, &size, NULL, 0) < 0) { - fprintf(stderr, "sysctl 'KERN_BOOTTIME': %s\n", strerror(errno)); + warn("sysctl 'KERN_BOOTTIME':"); return NULL; } diff --git a/components/user.c b/components/user.c index 8ab6db9..cd503f6 100644 --- a/components/user.c +++ b/components/user.c @@ -20,7 +20,7 @@ username(void) struct passwd *pw; if (!(pw = getpwuid(geteuid()))) { - fprintf(stderr, "getpwuid '%d': %s\n", geteuid(), strerror(errno)); + warn("getpwuid '%d':", geteuid()); return NULL; } diff --git a/components/volume.c b/components/volume.c index aa46446..8674211 100644 --- a/components/volume.c +++ b/components/volume.c @@ -21,21 +21,19 @@ vol_perc(const char *card) char *vnames[] = SOUND_DEVICE_NAMES; if ((afd = open(card, O_RDONLY | O_NONBLOCK)) < 0) { - fprintf(stderr, "open '%s': %s\n", card, strerror(errno)); + warn("open '%s':", card); return NULL; } if (ioctl(afd, (int)SOUND_MIXER_READ_DEVMASK, &devmask) < 0) { - fprintf(stderr, "ioctl 'SOUND_MIXER_READ_DEVMASK': %s\n", - strerror(errno)); + warn("ioctl 'SOUND_MIXER_READ_DEVMASK':"); close(afd); return NULL; } for (i = 0; i < LEN(vnames); i++) { if (devmask & (1 << i) && !strcmp("vol", vnames[i])) { if (ioctl(afd, MIXER_READ(i), &v) < 0) { - fprintf(stderr, "ioctl 'MIXER_READ(%ld)': %s\n", i, - strerror(errno)); + warn("ioctl 'MIXER_READ(%ld)':", i); close(afd); return NULL; } diff --git a/components/wifi.c b/components/wifi.c index 414d533..591f6ad 100644 --- a/components/wifi.c +++ b/components/wifi.c @@ -26,8 +26,7 @@ snprintf(path, sizeof(path), "%s%s%s", "/sys/class/net/", iface, "/operstate"); if (!(fp = fopen(path, "r"))) { - fprintf(stderr, "fopen '%s': %s\n", path, - strerror(errno)); + warn("fopen '%s':", path); return NULL; } p = fgets(status, 5, fp); @@ -37,8 +36,7 @@ } if (!(fp = fopen("/proc/net/wireless", "r"))) { - fprintf(stderr, "fopen '/proc/net/wireless': %s\n", - strerror(errno)); + warn("fopen '/proc/net/wireless':"); return NULL; } @@ -74,13 +72,12 @@ snprintf(wreq.ifr_name, sizeof(wreq.ifr_name), "%s", iface); if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { - fprintf(stderr, "socket 'AF_INET': %s\n", - strerror(errno)); + warn("socket 'AF_INET':"); return NULL; } wreq.u.essid.pointer = id; if (ioctl(sockfd,SIOCGIWESSID, &wreq) < 0) { - fprintf(stderr, "ioctl 'SIOCGIWESSID': %s\n", strerror(errno)); + warn("ioctl 'SIOCGIWESSID':"); close(sockfd); return NULL; } @@ -111,22 +108,19 @@ memset(&bssid, 0, sizeof(bssid)); memset(nr, 0, sizeof(struct ieee80211_nodereq)); if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { - fprintf(stderr, "socket 'AF_INET': %s\n", - strerror(errno)); + warn("socket 'AF_INET':"); return 0; } strlcpy(bssid.i_name, iface, sizeof(bssid.i_name)); if ((ioctl(sockfd, SIOCG80211BSSID, &bssid)) < 0) { - fprintf(stderr, "ioctl 'SIOCG80211BSSID': %s\n", - strerror(errno)); + warn("ioctl 'SIOCG80211BSSID':"); close(sockfd); return 0; } strlcpy(nr->nr_ifname, iface, sizeof(nr->nr_ifname)); memcpy(&nr->nr_macaddr, bssid.i_bssid, sizeof(nr->nr_macaddr)); if ((ioctl(sockfd, SIOCG80211NODE, nr)) < 0 && nr->nr_rssi) { - fprintf(stderr, "ioctl 'SIOCG80211NODE': %s\n", - strerror(errno)); + warn("ioctl 'SIOCG80211NODE':"); close(sockfd); return 0; } diff --git a/slstatus.c b/slstatus.c index 7ff323f..0c4605f 100644 --- a/slstatus.c +++ b/slstatus.c @@ -17,7 +17,6 @@ struct arg { const char *args; }; -char *argv0; char buf[1024]; static int done; static Display *dpy; @@ -43,8 +42,7 @@ difftimespec(struct timespec *res, struct timespec *a, struct timespec *b) static void usage(void) { - fprintf(stderr, "usage: %s [-s]\n", argv0); - exit(1); + die("usage: %s [-s]", argv0); } int @@ -80,14 +78,12 @@ main(int argc, char *argv[]) } if (!sflag && !(dpy = XOpenDisplay(NULL))) { - fprintf(stderr, "XOpenDisplay: Failed to open display\n"); - return 1; + die("XOpenDisplay: Failed to open display"); } while (!done) { if (clock_gettime(CLOCK_MONOTONIC, &start) < 0) { - fprintf(stderr, "clock_gettime: %s\n", strerror(errno)); - return 1; + die("clock_gettime:"); } status[0] = '\0'; @@ -97,11 +93,10 @@ main(int argc, char *argv[]) } if ((ret = snprintf(status + len, sizeof(status) - len, args[i].fmt, res)) < 0) { - fprintf(stderr, "snprintf: %s\n", - strerror(errno)); + warn("snprintf:"); break; } else if ((size_t)ret >= sizeof(status) - len) { - fprintf(stderr, "snprintf: Output truncated\n"); + warn("snprintf: Output truncated"); break; } len += ret; @@ -111,18 +106,14 @@ main(int argc, char *argv[]) printf("%s\n", status); } else { if (XStoreName(dpy, DefaultRootWindow(dpy), status) < 0) { - fprintf(stderr, - "XStoreName: Allocation failed\n"); - return 1; + die("XStoreName: Allocation failed"); } XFlush(dpy); } if (!done) { if (clock_gettime(CLOCK_MONOTONIC, ¤t) < 0) { - fprintf(stderr, "clock_gettime: %s\n", - strerror(errno)); - return 1; + die("clock_gettime:"); } difftimespec(&diff, ¤t, &start); @@ -133,9 +124,7 @@ main(int argc, char *argv[]) if (wait.tv_sec >= 0) { if (nanosleep(&wait, NULL) < 0 && errno != EINTR) { - fprintf(stderr, "nanosleep: %s\n", - strerror(errno)); - return 1; + die("nanosleep:"); } } } @@ -144,9 +133,7 @@ main(int argc, char *argv[]) if (!sflag) { XStoreName(dpy, DefaultRootWindow(dpy), NULL); if (XCloseDisplay(dpy) < 0) { - fprintf(stderr, - "XCloseDisplay: Failed to close display\n"); - return 1; + die("XCloseDisplay: Failed to close display"); } } diff --git a/util.c b/util.c index 6113049..08f14ff 100644 --- a/util.c +++ b/util.c @@ -2,10 +2,52 @@ #include #include #include +#include #include #include "util.h" +char *argv0; + +static void +verr(const char *fmt, va_list ap) +{ + if (argv0 && strncmp(fmt, "usage", sizeof("usage") - 1)) { + fprintf(stderr, "%s: ", argv0); + } + + vfprintf(stderr, fmt, ap); + + if (fmt[0] && fmt[strlen(fmt) - 1] == ':') { + fputc(' ', stderr); + perror(NULL); + } else { + fputc('\n', stderr); + } +} + +void +warn(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + verr(fmt, ap); + va_end(ap); +} + +void +die(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + verr(fmt, ap); + va_end(ap); + + exit(1); +} + const char * bprintf(const char *fmt, ...) { @@ -14,9 +56,9 @@ bprintf(const char *fmt, ...) va_start(ap, fmt); if ((ret = vsnprintf(buf, sizeof(buf), fmt, ap)) < 0) { - fprintf(stderr, "vsnprintf: %s\n", strerror(errno)); + warn("vsnprintf:"); } else if ((size_t)ret >= sizeof(buf)) { - fprintf(stderr, "vsnprintf: Output truncated\n"); + warn("vsnprintf: Output truncated"); } va_end(ap); @@ -31,7 +73,7 @@ pscanf(const char *path, const char *fmt, ...) int n; if (!(fp = fopen(path, "r"))) { - fprintf(stderr, "fopen '%s': %s\n", path, strerror(errno)); + warn("fopen '%s':", path); return -1; } va_start(ap, fmt); diff --git a/util.h b/util.h index e90c29d..a73b103 100644 --- a/util.h +++ b/util.h @@ -3,5 +3,10 @@ extern char buf[1024]; #define LEN(x) (sizeof (x) / sizeof *(x)) +extern char *argv0; + +void warn(const char *, ...); +void die(const char *, ...); + const char *bprintf(const char *fmt, ...); int pscanf(const char *path, const char *fmt, ...); -- cgit v1.2.3