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).
This commit is contained in:
parent
c83b388a3f
commit
a4fe8c9741
48
slstatus.c
48
slstatus.c
|
@ -1,6 +1,5 @@
|
||||||
/* See LICENSE file for copyright and license details. */
|
/* See LICENSE file for copyright and license details. */
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <locale.h>
|
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -56,6 +55,7 @@ main(int argc, char *argv[])
|
||||||
size_t i, len;
|
size_t i, len;
|
||||||
int sflag, ret;
|
int sflag, ret;
|
||||||
char status[MAXLEN];
|
char status[MAXLEN];
|
||||||
|
const char *res;
|
||||||
|
|
||||||
sflag = 0;
|
sflag = 0;
|
||||||
ARGBEGIN {
|
ARGBEGIN {
|
||||||
|
@ -70,25 +70,31 @@ main(int argc, char *argv[])
|
||||||
usage();
|
usage();
|
||||||
}
|
}
|
||||||
|
|
||||||
setlocale(LC_ALL, "");
|
|
||||||
|
|
||||||
memset(&act, 0, sizeof(act));
|
memset(&act, 0, sizeof(act));
|
||||||
act.sa_handler = terminate;
|
act.sa_handler = terminate;
|
||||||
sigaction(SIGINT, &act, NULL);
|
sigaction(SIGINT, &act, NULL);
|
||||||
sigaction(SIGTERM, &act, NULL);
|
sigaction(SIGTERM, &act, NULL);
|
||||||
|
|
||||||
|
if (sflag) {
|
||||||
|
setbuf(stdout, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
if (!sflag && !(dpy = XOpenDisplay(NULL))) {
|
if (!sflag && !(dpy = XOpenDisplay(NULL))) {
|
||||||
fprintf(stderr, "Cannot open display");
|
fprintf(stderr, "XOpenDisplay: Failed to open display\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (!done) {
|
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';
|
status[0] = '\0';
|
||||||
for (i = len = 0; i < LEN(args); i++) {
|
for (i = len = 0; i < LEN(args); i++) {
|
||||||
const char * res = args[i].func(args[i].args);
|
if (!(res = args[i].func(args[i].args))) {
|
||||||
res = (res == NULL) ? unknown_str : res;
|
res = unknown_str;
|
||||||
|
}
|
||||||
if ((ret = snprintf(status + len, sizeof(status) - len,
|
if ((ret = snprintf(status + len, sizeof(status) - len,
|
||||||
args[i].fmt, res)) < 0) {
|
args[i].fmt, res)) < 0) {
|
||||||
fprintf(stderr, "snprintf: %s\n",
|
fprintf(stderr, "snprintf: %s\n",
|
||||||
|
@ -103,14 +109,21 @@ main(int argc, char *argv[])
|
||||||
|
|
||||||
if (sflag) {
|
if (sflag) {
|
||||||
printf("%s\n", status);
|
printf("%s\n", status);
|
||||||
fflush(stdout);
|
|
||||||
} else {
|
} else {
|
||||||
XStoreName(dpy, DefaultRootWindow(dpy), status);
|
if (XStoreName(dpy, DefaultRootWindow(dpy), status) < 0) {
|
||||||
XSync(dpy, False);
|
fprintf(stderr,
|
||||||
|
"XStoreName: Allocation failed\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
XFlush(dpy);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!done) {
|
if (!done) {
|
||||||
clock_gettime(CLOCK_MONOTONIC, ¤t);
|
if (clock_gettime(CLOCK_MONOTONIC, ¤t) < 0) {
|
||||||
|
fprintf(stderr, "clock_gettime: %s\n",
|
||||||
|
strerror(errno));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
difftimespec(&diff, ¤t, &start);
|
difftimespec(&diff, ¤t, &start);
|
||||||
|
|
||||||
intspec.tv_sec = interval / 1000;
|
intspec.tv_sec = interval / 1000;
|
||||||
|
@ -118,14 +131,23 @@ main(int argc, char *argv[])
|
||||||
difftimespec(&wait, &intspec, &diff);
|
difftimespec(&wait, &intspec, &diff);
|
||||||
|
|
||||||
if (wait.tv_sec >= 0) {
|
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) {
|
if (!sflag) {
|
||||||
XStoreName(dpy, DefaultRootWindow(dpy), NULL);
|
XStoreName(dpy, DefaultRootWindow(dpy), NULL);
|
||||||
XCloseDisplay(dpy);
|
if (XCloseDisplay(dpy) < 0) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"XCloseDisplay: Failed to close display\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue