all repos — slstatus @ a4fe8c97414f07dd8b891e0d325dd2733195151d

my build of slstatus (tools.suckless.org/slstatus/)

Audit slstatus.c

 1) Remove setlocale() (locales are harmful and any 'issues' shall
    be fixed in different ways that are expected).
 2) Disable buffering on stdout with setbuf() rather than flushing
    it each time.
 3) Make error messages more consistent.
 4) Add error checks where applicable.
 5) Make code a bit more readable where res is assigned.
 6) Use XFlush() rather than XSync() (we don't need to wait for the
    XServer to react, which could lead to long hangs on our side).
Laslo Hunhold dev@frign.de
Fri, 18 May 2018 10:07:50 +0200
commit

a4fe8c97414f07dd8b891e0d325dd2733195151d

parent

c83b388a3f8f7a8c8d5a5cfddb6ab397005371a1

1 files changed, 35 insertions(+), 13 deletions(-)

jump to
M slstatus.cslstatus.c

@@ -1,6 +1,5 @@

/* See LICENSE file for copyright and license details. */ #include <errno.h> -#include <locale.h> #include <signal.h> #include <stdio.h> #include <stdlib.h>

@@ -56,6 +55,7 @@ struct timespec start, current, diff, intspec, wait;

size_t i, len; int sflag, ret; char status[MAXLEN]; + const char *res; sflag = 0; ARGBEGIN {

@@ -70,25 +70,31 @@ if (argc) {

usage(); } - setlocale(LC_ALL, ""); - memset(&act, 0, sizeof(act)); act.sa_handler = terminate; sigaction(SIGINT, &act, NULL); sigaction(SIGTERM, &act, NULL); + if (sflag) { + setbuf(stdout, NULL); + } + if (!sflag && !(dpy = XOpenDisplay(NULL))) { - fprintf(stderr, "Cannot open display"); + fprintf(stderr, "XOpenDisplay: Failed to open display\n"); return 1; } while (!done) { - clock_gettime(CLOCK_MONOTONIC, &start); + if (clock_gettime(CLOCK_MONOTONIC, &start) < 0) { + fprintf(stderr, "clock_gettime: %s\n", strerror(errno)); + return 1; + } status[0] = '\0'; for (i = len = 0; i < LEN(args); i++) { - const char * res = args[i].func(args[i].args); - res = (res == NULL) ? unknown_str : res; + if (!(res = args[i].func(args[i].args))) { + res = unknown_str; + } if ((ret = snprintf(status + len, sizeof(status) - len, args[i].fmt, res)) < 0) { fprintf(stderr, "snprintf: %s\n",

@@ -103,14 +109,21 @@ }

if (sflag) { printf("%s\n", status); - fflush(stdout); } else { - XStoreName(dpy, DefaultRootWindow(dpy), status); - XSync(dpy, False); + if (XStoreName(dpy, DefaultRootWindow(dpy), status) < 0) { + fprintf(stderr, + "XStoreName: Allocation failed\n"); + return 1; + } + XFlush(dpy); } if (!done) { - clock_gettime(CLOCK_MONOTONIC, &current); + if (clock_gettime(CLOCK_MONOTONIC, &current) < 0) { + fprintf(stderr, "clock_gettime: %s\n", + strerror(errno)); + return 1; + } difftimespec(&diff, &current, &start); intspec.tv_sec = interval / 1000;

@@ -118,14 +131,23 @@ intspec.tv_nsec = (interval % 1000) * 1000000;

difftimespec(&wait, &intspec, &diff); if (wait.tv_sec >= 0) { - nanosleep(&wait, NULL); + if (nanosleep(&wait, NULL) < 0 && + errno != EINTR) { + fprintf(stderr, "nanosleep: %s\n", + strerror(errno)); + return 1; + } } } } if (!sflag) { XStoreName(dpy, DefaultRootWindow(dpy), NULL); - XCloseDisplay(dpy); + if (XCloseDisplay(dpy) < 0) { + fprintf(stderr, + "XCloseDisplay: Failed to close display\n"); + return 1; + } } return 0;