/*
* Receive wall messages and pass them to a notification program via stdin.
*
- * Copyright (C) 2014 Simon Ruderich
+ * Copyright (C) 2014-2015 Simon Ruderich
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
#endif
+static sig_atomic_t signaled = 0;
+
+
static void sig_handler(int signal) {
(void)signal;
+
+ signaled = 1;
}
static void setup_signals(void) {
struct sigaction action;
static int login(int ptm) {
#if defined(USE_UTEMPTER)
int result = utempter_add_record(ptm, NULL);
- /* Exit value of utempter_*() is not correct on all systems, e.g.
- * FreeBSD() always returns 0. Checking the utmpx database manually is
- * difficult because we don't know the exact values for ut_id and ut_line,
- * therefore we only check the return value on systems known to return a
- * useful value. */
+ /* Exit value of utempter_*() is not correct on all systems, e.g. FreeBSD
+ * always returns 0. Checking the utmpx database manually is difficult
+ * because we don't know the exact values for ut_id and ut_line, therefore
+ * we only check the return value on systems known to return a useful
+ * value. */
# ifndef __linux
result = 1;
# endif
ssize_t r;
assert(SSIZE_MAX <= SIZE_MAX);
- while ((r = read(fd, buffer, sizeof(buffer))) > 0) {
+ while (!signaled && (r = read(fd, buffer, sizeof(buffer))) > 0) {
size_t space;
ssize_t r2;
int main(int argc, char **argv) {
int option, enable_x11, mesg_yes;
+ const char *argv0;
int ptm, pts;
char *name;
enable_x11 = 0;
mesg_yes = 0;
+ argv0 = argv[0];
+
/*
* Glibc violates POSIX by default and skips over non-option arguments and
* parses later arguments which look like options as well. But we want to
mesg_yes = 1;
break;
case 'h':
- usage(argv[0]);
+ usage(argv0);
break;
case 'v':
printf("%s%s\n",
PACKAGE_STRING,
strlen(GIT_VERSION) ? " (Git " GIT_VERSION ")" : "");
- exit(0);
+ exit(EXIT_SUCCESS);
break;
default:
fprintf(stderr, "%s: unknown option '%s'!\n\n",
- argv[0], argv[optind - 1]);
- usage(argv[0]);
+ argv0, argv[optind - 1]);
+ usage(argv0);
break;
}
}
/* No arguments remaining, abort. */
if (!argv[optind]) {
- usage(argv[0]);
+ usage(argv0);
}
/* Arguments for notification program. */
argv += optind;