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:
parent
a5eb90bf99
commit
149e4bd942
@ -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>
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user