summaryrefslogtreecommitdiffstats
path: root/usr.bin/write
diff options
context:
space:
mode:
authored <ed@FreeBSD.org>2009-12-05 20:22:26 +0000
committered <ed@FreeBSD.org>2009-12-05 20:22:26 +0000
commit84b72ef5098611dca55f69c69591e7491244c45e (patch)
tree6b6dfb0489e58e8557a4f93feaefe6b41657c743 /usr.bin/write
parentd0a68d920c409d295113cb969bbd438b42c7017d (diff)
downloadFreeBSD-src-84b72ef5098611dca55f69c69591e7491244c45e.zip
FreeBSD-src-84b72ef5098611dca55f69c69591e7491244c45e.tar.gz
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 happy.
Diffstat (limited to 'usr.bin/write')
-rw-r--r--usr.bin/write/Makefile6
-rw-r--r--usr.bin/write/write.c51
2 files changed, 29 insertions, 28 deletions
diff --git a/usr.bin/write/Makefile b/usr.bin/write/Makefile
index 8e6454b..e34a61d 100644
--- a/usr.bin/write/Makefile
+++ b/usr.bin/write/Makefile
@@ -1,7 +1,13 @@
# @(#)Makefile 8.1 (Berkeley) 6/6/93
+# $FreeBSD$
PROG= write
BINMODE=2555
BINGRP= tty
+WARNS?= 6
+
+DPADD= ${LIBULOG}
+LDADD= -lulog
+
.include <bsd.prog.mk>
diff --git a/usr.bin/write/write.c b/usr.bin/write/write.c
index 878c8c1..ed57cb1 100644
--- a/usr.bin/write/write.c
+++ b/usr.bin/write/write.c
@@ -62,8 +62,9 @@ __FBSDID("$FreeBSD$");
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#define _ULOG_POSIX_NAMES
+#include <ulog.h>
#include <unistd.h>
-#include <utmp.h>
void done(int);
void do_write(char *, char *, uid_t);
@@ -146,20 +147,17 @@ usage(void)
int
utmp_chk(char *user, char *tty)
{
- struct utmp u;
- int ufd;
-
- if ((ufd = open(_PATH_UTMP, O_RDONLY)) < 0)
- return(0); /* ignore error, shouldn't happen anyway */
-
- while (read(ufd, (char *) &u, sizeof(u)) == sizeof(u))
- if (strncmp(user, u.ut_name, sizeof(u.ut_name)) == 0 &&
- strncmp(tty, u.ut_line, sizeof(u.ut_line)) == 0) {
- (void)close(ufd);
+ struct utmpx lu, *u;
+
+ strncpy(lu.ut_line, tty, sizeof lu.ut_line);
+ setutxent();
+ while ((u = getutxline(&lu)) != NULL)
+ if (u->ut_type == USER_PROCESS &&
+ strcmp(user, u->ut_user) == 0) {
+ endutxent();
return(0);
}
-
- (void)close(ufd);
+ endutxent();
return(1);
}
@@ -177,43 +175,40 @@ utmp_chk(char *user, char *tty)
void
search_utmp(char *user, char *tty, char *mytty, uid_t myuid)
{
- struct utmp u;
+ struct utmpx *u;
time_t bestatime, atime;
- int ufd, nloggedttys, nttys, msgsok, user_is_me;
- char atty[UT_LINESIZE + 1];
-
- if ((ufd = open(_PATH_UTMP, O_RDONLY)) < 0)
- err(1, "utmp");
+ int nloggedttys, nttys, msgsok, user_is_me;
nloggedttys = nttys = 0;
bestatime = 0;
user_is_me = 0;
- while (read(ufd, (char *) &u, sizeof(u)) == sizeof(u))
- if (strncmp(user, u.ut_name, sizeof(u.ut_name)) == 0) {
+
+ setutxent();
+ while ((u = getutxent()) != NULL)
+ if (u->ut_type == USER_PROCESS &&
+ strcmp(user, u->ut_user) == 0) {
++nloggedttys;
- (void)strncpy(atty, u.ut_line, UT_LINESIZE);
- atty[UT_LINESIZE] = '\0';
- if (term_chk(atty, &msgsok, &atime, 0))
+ if (term_chk(u->ut_line, &msgsok, &atime, 0))
continue; /* bad term? skip */
if (myuid && !msgsok)
continue; /* skip ttys with msgs off */
- if (strcmp(atty, mytty) == 0) {
+ if (strcmp(u->ut_line, mytty) == 0) {
user_is_me = 1;
continue; /* don't write to yourself */
}
++nttys;
if (atime > bestatime) {
bestatime = atime;
- (void)strcpy(tty, atty);
+ (void)strlcpy(tty, u->ut_line, MAXPATHLEN);
}
}
+ endutxent();
- (void)close(ufd);
if (nloggedttys == 0)
errx(1, "%s is not logged in", user);
if (nttys == 0) {
if (user_is_me) { /* ok, so write to yourself! */
- (void)strcpy(tty, mytty);
+ (void)strlcpy(tty, mytty, MAXPATHLEN);
return;
}
errx(1, "%s has messages disabled", user);
OpenPOWER on IntegriCloud