sigaction(SIGUSR2, &action, NULL);
}
-static int open_tty(void) {
+static int open_tty(int public) {
int ptm;
const char *name;
/* Prevent write access for other users so they can't use wall to send
* messages to this program. */
+ if (!public) {
name = ptsname(ptm);
if (!name) {
return -1;
if (chmod(name, S_IRUSR | S_IWUSR) != 0) {
return -1;
}
+ }
if (unlockpt(ptm) != 0) {
return -1;
#endif
static void usage(const char *argv0) {
- fprintf(stderr, "usage: %s [-X] <cmd args..>\n", argv0);
+ fprintf(stderr, "usage: %s [-X] [-m] <cmd args..>\n", argv0);
fprintf(stderr, "Pass wall messages to <cmd args..>.\n");
fprintf(stderr, "\n");
fprintf(stderr, "-X quit when the current X session terminates\n");
+ fprintf(stderr, "-m allow messages from normal users (like `mesg y`)\n");
#ifdef DONT_USE_X11
fprintf(stderr, "\n");
fprintf(stderr, "compiled without X11 support, -X disabled\n");
int main(int argc, char **argv) {
- int option, enable_x11;
+ int option, enable_x11, mesg_yes;
int ptm, pts;
char *name;
opterr = 0;
enable_x11 = 0;
+ mesg_yes = 0;
/*
* Glibc violates POSIX by default and skips over non-option arguments and
* the optstring with "+" fixes this behaver. This is not POSIX
* compatible, but the option should be ignored on other systems.
*/
- while ((option = getopt(argc, argv, "+Xh")) != -1) {
+ while ((option = getopt(argc, argv, "+Xmh")) != -1) {
switch (option) {
case 'X':
enable_x11 = 1;
break;
+ case 'm':
+ mesg_yes = 1;
case 'h':
usage(argv[0]);
break;
/* Arguments for notification program. */
argv += optind;
- ptm = open_tty();
+ ptm = open_tty(mesg_yes);
if (ptm < 0) {
perror("open_tty");
exit(EXIT_FAILURE);