Let wall(1) use utmpx.

Because our implementation guarantees the strings inside struct utmpx to
be null terminated, we don't need to copy everything out, which makes
the code nicer to read.

Also set WARNS to 6 and add $FreeBSD$ to keep SVN silent.
This commit is contained in:
Ed Schouten 2009-12-05 20:05:25 +00:00
parent 6951e12ec7
commit bd76376f80
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=200156
2 changed files with 17 additions and 18 deletions

View file

@ -1,8 +1,14 @@
# @(#)Makefile 8.1 (Berkeley) 6/6/93
# $FreeBSD$
PROG= wall
SRCS= ttymsg.c wall.c
BINGRP= tty
BINMODE=2555
WARNS?= 6
DPADD= ${LIBULOG}
LDADD= -lulog
.include <bsd.prog.mk>

View file

@ -64,8 +64,9 @@ static const char sccsid[] = "@(#)wall.c 8.2 (Berkeley) 11/16/93";
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define _ULOG_POSIX_NAMES
#include <ulog.h>
#include <unistd.h>
#include <utmp.h>
#include "ttymsg.h"
@ -82,12 +83,12 @@ int mbufsize;
char *mbuf;
static int
ttystat(char *line, int sz)
ttystat(char *line)
{
struct stat sb;
char ttybuf[MAXPATHLEN];
(void)snprintf(ttybuf, sizeof(ttybuf), "%s%.*s", _PATH_DEV, sz, line);
(void)snprintf(ttybuf, sizeof(ttybuf), "%s%s", _PATH_DEV, line);
if (stat(ttybuf, &sb) == 0) {
return (0);
} else
@ -98,17 +99,14 @@ int
main(int argc, char *argv[])
{
struct iovec iov;
struct utmp utmp;
struct utmpx *utmp;
int ch;
int ingroup;
FILE *fp;
struct wallgroup *g;
struct group *grp;
char **np;
const char *p;
struct passwd *pw;
char line[sizeof(utmp.ut_line) + 1];
char username[sizeof(utmp.ut_name) + 1];
(void)setlocale(LC_CTYPE, "");
@ -145,20 +143,17 @@ main(int argc, char *argv[])
makemsg(*argv);
if (!(fp = fopen(_PATH_UTMP, "r")))
err(1, "cannot read %s", _PATH_UTMP);
iov.iov_base = mbuf;
iov.iov_len = mbufsize;
/* NOSTRICT */
while (fread((char *)&utmp, sizeof(utmp), 1, fp) == 1) {
if (!utmp.ut_name[0])
while ((utmp = getutxent()) != NULL) {
if (utmp->ut_type != USER_PROCESS)
continue;
if (ttystat(utmp.ut_line, UT_LINESIZE) != 0)
if (ttystat(utmp->ut_line) != 0)
continue;
if (grouplist) {
ingroup = 0;
strlcpy(username, utmp.ut_name, sizeof(utmp.ut_name));
pw = getpwnam(username);
pw = getpwnam(utmp->ut_user);
if (!pw)
continue;
for (g = grouplist; g && ingroup == 0; g = g->next) {
@ -168,7 +163,7 @@ main(int argc, char *argv[])
ingroup = 1;
else if ((grp = getgrgid(g->gid)) != NULL) {
for (np = grp->gr_mem; *np; np++) {
if (strcmp(*np, username) == 0) {
if (strcmp(*np, utmp->ut_user) == 0) {
ingroup = 1;
break;
}
@ -178,9 +173,7 @@ main(int argc, char *argv[])
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)
if ((p = ttymsg(&iov, 1, utmp->ut_line, 60*5)) != NULL)
warnx("%s", p);
}
exit(0);