From owner-freebsd-audit Tue Feb 13 23: 9: 0 2001 Delivered-To: freebsd-audit@freebsd.org Received: from harmony.village.org (rover.village.org [204.144.255.66]) by hub.freebsd.org (Postfix) with ESMTP id D49D537B491 for ; Tue, 13 Feb 2001 23:08:53 -0800 (PST) Received: from harmony.village.org (localhost.village.org [127.0.0.1]) by harmony.village.org (8.11.1/8.11.1) with ESMTP id f1E78rW59181 for ; Wed, 14 Feb 2001 00:08:53 -0700 (MST) (envelope-from imp@harmony.village.org) Message-Id: <200102140708.f1E78rW59181@harmony.village.org> To: audit@freebsd.org Subject: wall -g patches for review Date: Wed, 14 Feb 2001 00:08:52 -0700 From: Warner Losh Sender: owner-freebsd-audit@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG I've gone ahead and added the wall -g functionality from OpenBSD to FreeBSD's wall. I need this for dump, but it seems to be generally useful. While I was at it, I did the register and __P thing. It seems to work for me, but I thought I'd post this for wider review since it dos run at an elevated privs (group tty). Last time this came up, people suggested that this might belong in syslog. I don't disagree that this would be useful functionality there, but wall provides a different service. syslog is for a oneline message, while wall can send arbitrary files. Anyway, I'll commit these Feb 21, 2001 if there are no objections outstanding. Warner Index: ttymsg.c =================================================================== RCS file: /home/imp/FreeBSD/CVS/src/usr.bin/wall/ttymsg.c,v retrieving revision 1.6 diff -u -r1.6 ttymsg.c --- ttymsg.c 2000/06/09 19:44:49 1.6 +++ ttymsg.c 2001/02/14 06:56:23 @@ -59,15 +59,11 @@ * ignored (exclusive-use, lack of permission, etc.). */ char * -ttymsg(iov, iovcnt, line, tmout) - struct iovec *iov; - int iovcnt; - char *line; - int tmout; +ttymsg(struct iovec *iov, int iovcnt, char *line, int tmout) { static char device[MAXNAMLEN] = _PATH_DEV; static char errbuf[1024]; - register int cnt, fd, left, wret; + int cnt, fd, left, wret; struct iovec localiov[7]; int forked = 0; Index: wall.1 =================================================================== RCS file: /home/imp/FreeBSD/CVS/src/usr.bin/wall/wall.1,v retrieving revision 1.4 diff -u -r1.4 wall.1 --- wall.1 2000/11/20 19:21:18 1.4 +++ wall.1 2001/02/14 06:59:01 @@ -40,6 +40,7 @@ .Nd write a message to users .Sh SYNOPSIS .Nm +.Op Fl g Ar group .Op Ar file .Sh DESCRIPTION .Nm Wall @@ -52,6 +53,12 @@ terminals of users who have chosen to deny messages or are using a program which automatically denies messages. +.Bl -tag -width indent +.It Fl g +Send messages to users in this group. This option may be specified +multiple times, and any user in any of the specified groups will +receive the message. +.El .Sh SEE ALSO .Xr mesg 1 , .Xr talk 1 , Index: wall.c =================================================================== RCS file: /home/imp/FreeBSD/CVS/src/usr.bin/wall/wall.c,v retrieving revision 1.16 diff -u -r1.16 wall.c --- wall.c 2000/11/26 22:36:35 1.16 +++ wall.c 2001/02/14 06:56:17 @@ -56,6 +56,7 @@ #include #include +#include #include #include #include @@ -66,9 +67,15 @@ #include #include -void makemsg __P((char *)); -static void usage __P((void)); -char *ttymsg __P((struct iovec *, int, char *, int)); +struct wallgroup { + struct wallgroup *next; + char *name; + gid_t gid; +} *grouplist; + +void makemsg(char *); +static void usage(void); +char *ttymsg(struct iovec *, int, char *, int); #define IGNOREUSER "sleeper" @@ -78,26 +85,36 @@ /* ARGSUSED */ int -main(argc, argv) - int argc; - char **argv; +main(int argc, char *argv[]) { + int ingroup = 0, ngrps, i; int ch; - struct iovec iov; - struct utmp utmp; FILE *fp; char *p; + struct wallgroup *g; + struct passwd *pw; + struct iovec iov; + struct utmp utmp; + gid_t grps[NGROUPS_MAX]; char line[sizeof(utmp.ut_line) + 1]; + char username[sizeof(utmp.ut_name) + 1]; (void)setlocale(LC_CTYPE, ""); - while ((ch = getopt(argc, argv, "n")) != -1) + while ((ch = getopt(argc, argv, "g:n")) != -1) switch (ch) { case 'n': /* undoc option for shutdown: suppress banner */ if (geteuid() == 0) nobanner = 1; break; + case 'g': + g = (struct wallgroup *)malloc(sizeof *g); + g->next = grouplist; + g->name = optarg; + g->gid = -1; + grouplist = g; + break; case '?': default: usage(); @@ -107,6 +124,14 @@ if (argc > 1) usage(); + for (g = grouplist; g; g = g->next) { + struct group *grp; + + grp = getgrnam(g->name); + if (grp) + g->gid = grp->gr_gid; + } + makemsg(*argv); if (!(fp = fopen(_PATH_UTMP, "r"))) @@ -118,6 +143,24 @@ if (!utmp.ut_name[0] || !strncmp(utmp.ut_name, IGNOREUSER, sizeof(utmp.ut_name))) continue; + if (grouplist) { + strlcpy(username, utmp.ut_name, sizeof(utmp.ut_name)); + pw = getpwnam(username); + if (!pw) + continue; + ngrps = getgroups(pw->pw_gid, grps); + for (g = grouplist; g && ingroup == 0; g = g->next) { + if (g->gid == -1) + continue; + if (g->gid == pw->pw_gid) + ingroup = 1; + for (i = 0; i < ngrps && ingroup == 0; i++) + if (g->gid == grps[i]) + ingroup = 1; + } + if (ingroup == 0) + continue; + } strncpy(line, utmp.ut_line, sizeof(utmp.ut_line)); line[sizeof(utmp.ut_line)] = '\0'; if ((p = ttymsg(&iov, 1, line, 60*5)) != NULL) @@ -134,11 +177,10 @@ } void -makemsg(fname) - char *fname; +makemsg(char *fname) { - register int cnt; - register unsigned char ch; + int cnt; + unsigned char ch; struct tm *lt; struct passwd *pw; struct stat sbuf; To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-audit" in the body of the message