svn commit: r200160 - head/usr.bin/write

Ed Schouten ed at FreeBSD.org
Sat Dec 5 20:22:26 UTC 2009


Author: ed
Date: Sat Dec  5 20:22:26 2009
New Revision: 200160
URL: http://svn.freebsd.org/changeset/base/200160

Log:
  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.

Modified:
  head/usr.bin/write/Makefile
  head/usr.bin/write/write.c

Modified: head/usr.bin/write/Makefile
==============================================================================
--- head/usr.bin/write/Makefile	Sat Dec  5 20:17:04 2009	(r200159)
+++ head/usr.bin/write/Makefile	Sat Dec  5 20:22:26 2009	(r200160)
@@ -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>

Modified: head/usr.bin/write/write.c
==============================================================================
--- head/usr.bin/write/write.c	Sat Dec  5 20:17:04 2009	(r200159)
+++ head/usr.bin/write/write.c	Sat Dec  5 20:22:26 2009	(r200160)
@@ -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;
+	struct utmpx lu, *u;
 
-	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);
+	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);


More information about the svn-src-head mailing list