X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=src%2Fwall-notify.c;h=e0d556db1386387e567bcb7967cb0fe9f1e213fb;hb=HEAD;hp=57ec37f00a60cef695e28b536055551716c4f391;hpb=d28191ac3e71802b939721c1f7b8b4fe509bde53;p=wall-notify%2Fwall-notify.git diff --git a/src/wall-notify.c b/src/wall-notify.c index 57ec37f..e0d556d 100644 --- a/src/wall-notify.c +++ b/src/wall-notify.c @@ -1,7 +1,7 @@ /* * 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 @@ -48,8 +48,13 @@ #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; @@ -164,11 +169,11 @@ static int set_utmpx(short type, int ptm) { 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 @@ -332,7 +337,7 @@ static void handle_wall(int fd, char **argv) { 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; @@ -391,6 +396,7 @@ static void usage(const char *argv0) { int main(int argc, char **argv) { int option, enable_x11, mesg_yes; + const char *argv0; int ptm, pts; char *name; @@ -400,6 +406,8 @@ int main(int argc, char **argv) { 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 @@ -416,25 +424,25 @@ int main(int argc, char **argv) { 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;