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, ...);