diff --git a/libexec/comsat/comsat.8 b/libexec/comsat/comsat.8 index 0b660352cd70..dd1c47de6f48 100644 --- a/libexec/comsat/comsat.8 +++ b/libexec/comsat/comsat.8 @@ -76,6 +76,13 @@ or .Dq Subject lines are not included in the displayed message. .Pp +If the +.Em user +specified is logged in to the system and the associated terminal has +the group execute bit turned on (by a +.Dq Li biff b ) , +two bell characters (ASCII \\007) are printed on the user's terminal. +.Pp If mailbox-name omitted, standard mailbox assumed. .Sh FILES .Bl -tag -width /var/mail/user -compact diff --git a/libexec/comsat/comsat.c b/libexec/comsat/comsat.c index a966002f28af..1221566c7736 100644 --- a/libexec/comsat/comsat.c +++ b/libexec/comsat/comsat.c @@ -211,7 +211,7 @@ notify(struct utmp *utp, char file[], off_t offset, int folder) syslog(LOG_AUTH | LOG_NOTICE, "'/' in \"%s\"", tty); return; } - if (stat(tty, &stb) || !(stb.st_mode & S_IEXEC)) { + if (stat(tty, &stb) || !(stb.st_mode & (S_IXUSR | S_IXGRP))) { dsyslog(LOG_DEBUG, "%s: wrong mode on %s", utp->ut_name, tty); return; } @@ -228,11 +228,25 @@ notify(struct utmp *utp, char file[], off_t offset, int folder) cr = ((tio.c_oflag & (OPOST|ONLCR)) == (OPOST|ONLCR)) ? "\n" : "\n\r"; (void)strncpy(name, utp->ut_name, sizeof(utp->ut_name)); name[sizeof(name) - 1] = '\0'; - (void)fprintf(tp, "%s\007New mail for %s@%.*s\007 has arrived%s%s%s:%s----%s", - cr, name, (int)sizeof(hostname), hostname, - folder ? cr : "", folder ? "to " : "", folder ? file : "", - cr, cr); - jkfprintf(tp, name, file, offset); + switch (stb.st_mode & (S_IXUSR | S_IXGRP)) { + case S_IXUSR: + case (S_IXUSR | S_IXGRP): + (void)fprintf(tp, + "%s\007New mail for %s@%.*s\007 has arrived%s%s%s:%s----%s", + cr, name, (int)sizeof(hostname), hostname, + folder ? cr : "", folder ? "to " : "", folder ? file : "", + cr, cr); + jkfprintf(tp, name, file, offset); + break; + case S_IXGRP: + (void)fprintf(tp, "\007"); + (void)fflush(tp); + (void)sleep(1); + (void)fprintf(tp, "\007"); + break; + default: + break; + } (void)fclose(tp); _exit(0); } diff --git a/usr.bin/biff/biff.1 b/usr.bin/biff/biff.1 index c19a0b182279..49d711d668df 100644 --- a/usr.bin/biff/biff.1 +++ b/usr.bin/biff/biff.1 @@ -40,7 +40,7 @@ .Nd "be notified if mail arrives and who it is from" .Sh SYNOPSIS .Nm -.Op Cm n | y +.Op Cm n | y | b .Sh DESCRIPTION The .Nm @@ -52,11 +52,13 @@ The following options are available: .It Cm n Disable notification. .It Cm y -Enable notification. +Enable header notification. +.It Cm b +Enable bell notification. .El .Pp -When mail notification is enabled, the header and first few lines of -the message will be printed on your screen whenever mail arrives. +When header notification is enabled, the header and first few lines of +the message will be printed on your terminal whenever mail arrives. A .Dq Li biff y command is often included in the file @@ -65,6 +67,9 @@ or .Pa \&.profile to be executed at each login. .Pp +When bell notification is enabled, only two bell characters (ASCII \\007) +will be printed on your terminal whenever mail arrives. +.Pp The .Nm utility operates asynchronously. diff --git a/usr.bin/biff/biff.c b/usr.bin/biff/biff.c index 67341bac8ee9..ccbc32ab6c9a 100644 --- a/usr.bin/biff/biff.c +++ b/usr.bin/biff/biff.c @@ -81,28 +81,35 @@ main(argc, argv) err(2, "stat"); if (*argv == NULL) { - (void)printf("is %s\n", sb.st_mode & S_IXUSR ? "y" : "n"); - return(sb.st_mode & S_IXUSR ? 0 : 1); + (void)printf("is %s%s\n", + sb.st_mode & S_IXUSR ? "y" : + sb.st_mode & S_IXGRP ? "b" : "n"); + return(sb.st_mode & (S_IXUSR | S_IXGRP) ? 0 : 1); + } switch(argv[0][0]) { case 'n': - if (chmod(name, sb.st_mode & ~S_IXUSR) < 0) + if (chmod(name, sb.st_mode & ~(S_IXUSR | S_IXGRP)) < 0) err(2, "%s", name); break; case 'y': - if (chmod(name, sb.st_mode | S_IXUSR) < 0) + if (chmod(name, (sb.st_mode & ~(S_IXUSR | S_IXGRP)) | S_IXUSR) < 0) + err(2, "%s", name); + break; + case 'b': + if (chmod(name, (sb.st_mode & ~(S_IXUSR | S_IXGRP)) | S_IXGRP) < 0) err(2, "%s", name); break; default: usage(); } - return(sb.st_mode & S_IXUSR ? 0 : 1); + return(sb.st_mode & (S_IXUSR | S_IXGRP) ? 0 : 1); } static void usage() { - (void)fprintf(stderr, "usage: biff [y | n]\n"); + (void)fprintf(stderr, "usage: biff [n | y | b]\n"); exit(2); }