Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 28 Dec 2009 20:54:34 +0000 (UTC)
From:      Ed Schouten <ed@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r201140 - head/usr.bin/finger
Message-ID:  <200912282054.nBSKsYj2001070@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ed
Date: Mon Dec 28 20:54:34 2009
New Revision: 201140
URL: http://svn.freebsd.org/changeset/base/201140

Log:
  Migrate finger(1) away from <utmp.h>.
  
  Unfortunately it also uses lastlog, which means we must resort to local
  extensions of the utmpx-interface. Because the user name and TTY name
  are now nul-terminated, there is no need to copy around strings as
  often.

Modified:
  head/usr.bin/finger/Makefile
  head/usr.bin/finger/extern.h
  head/usr.bin/finger/finger.c
  head/usr.bin/finger/finger.h
  head/usr.bin/finger/lprint.c
  head/usr.bin/finger/net.c
  head/usr.bin/finger/sprint.c
  head/usr.bin/finger/util.c

Modified: head/usr.bin/finger/Makefile
==============================================================================
--- head/usr.bin/finger/Makefile	Mon Dec 28 20:08:01 2009	(r201139)
+++ head/usr.bin/finger/Makefile	Mon Dec 28 20:54:34 2009	(r201140)
@@ -5,4 +5,7 @@ PROG=	finger
 SRCS=	finger.c lprint.c net.c sprint.c util.c
 MAN=	finger.1 finger.conf.5
 
+DPADD=	${LIBULOG}
+LDADD=	-lulog
+
 .include <bsd.prog.mk>

Modified: head/usr.bin/finger/extern.h
==============================================================================
--- head/usr.bin/finger/extern.h	Mon Dec 28 20:08:01 2009	(r201139)
+++ head/usr.bin/finger/extern.h	Mon Dec 28 20:54:34 2009	(r201140)
@@ -51,8 +51,8 @@ extern int invoker_root;		/* Invoked by 
 
 void	 enter_lastlog(PERSON *);
 PERSON	*enter_person(struct passwd *);
-void	 enter_where(struct utmp *, PERSON *);
-PERSON	*find_person(const char *);
+void	 enter_where(struct utmpx *, PERSON *);
+PERSON	*find_person(char *);
 int	 hide(struct passwd *);
 void	 lflag_print(void);
 int	 match(struct passwd *, const char *);

Modified: head/usr.bin/finger/finger.c
==============================================================================
--- head/usr.bin/finger/finger.c	Mon Dec 28 20:08:01 2009	(r201139)
+++ head/usr.bin/finger/finger.c	Mon Dec 28 20:54:34 2009	(r201140)
@@ -82,8 +82,9 @@ __FBSDID("$FreeBSD$");
 #include <stdlib.h>
 #include <string.h>
 #include <time.h>
+#define	_ULOG_POSIX_NAMES
+#include <ulog.h>
 #include <unistd.h>
-#include <utmp.h>
 #include <locale.h>
 
 #include "finger.h"
@@ -233,29 +234,26 @@ loginlist(void)
 	PERSON *pn;
 	DBT data, key;
 	struct passwd *pw;
-	struct utmp user;
+	struct utmpx *user;
 	int r, sflag1;
-	char name[UT_NAMESIZE + 1];
 
 	if (kflag)
 		errx(1, "can't list logins without reading utmp");
 
-	if (!freopen(_PATH_UTMP, "r", stdin))
-		err(1, "%s", _PATH_UTMP);
-	name[UT_NAMESIZE] = '\0';
-	while (fread((char *)&user, sizeof(user), 1, stdin) == 1) {
-		if (!user.ut_name[0])
+	setutxent();
+	while ((user = getutxent()) != NULL) {
+		if (user->ut_type != USER_PROCESS)
 			continue;
-		if ((pn = find_person(user.ut_name)) == NULL) {
-			bcopy(user.ut_name, name, UT_NAMESIZE);
-			if ((pw = getpwnam(name)) == NULL)
+		if ((pn = find_person(user->ut_user)) == NULL) {
+			if ((pw = getpwnam(user->ut_user)) == NULL)
 				continue;
 			if (hide(pw))
 				continue;
 			pn = enter_person(pw);
 		}
-		enter_where(&user, pn);
+		enter_where(user, pn);
 	}
+	endutxent();
 	if (db && lflag)
 		for (sflag1 = R_FIRST;; sflag1 = R_NEXT) {
 			PERSON *tmp;
@@ -275,7 +273,7 @@ userlist(int argc, char **argv)
 {
 	PERSON *pn;
 	DBT data, key;
-	struct utmp user;
+	struct utmpx *user;
 	struct passwd *pw;
 	int r, sflag1, *used, *ip;
 	char **ap, **nargv, **np, **p;
@@ -384,15 +382,15 @@ net:	for (p = nargv; *p;) {
 	 * Scan thru the list of users currently logged in, saving
 	 * appropriate data whenever a match occurs.
 	 */
-	if (!freopen(_PATH_UTMP, "r", stdin))
-		err(1, "%s", _PATH_UTMP);
-	while (fread((char *)&user, sizeof(user), 1, stdin) == 1) {
-		if (!user.ut_name[0])
+	setutxent();
+	while ((user = getutxent()) != NULL) {
+		if (user->ut_type != USER_PROCESS)
 			continue;
-		if ((pn = find_person(user.ut_name)) == NULL)
+		if ((pn = find_person(user->ut_user)) == NULL)
 			continue;
-		enter_where(&user, pn);
+		enter_where(user, pn);
 	}
+	endutxent();
 	if (db)
 		for (sflag1 = R_FIRST;; sflag1 = R_NEXT) {
 			PERSON *tmp;

Modified: head/usr.bin/finger/finger.h
==============================================================================
--- head/usr.bin/finger/finger.h	Mon Dec 28 20:08:01 2009	(r201139)
+++ head/usr.bin/finger/finger.h	Mon Dec 28 20:54:34 2009	(r201140)
@@ -62,8 +62,8 @@ typedef struct where {
 	short writable;			/* tty is writable */
 	time_t loginat;			/* time of (last) login */
 	time_t idletime;		/* how long idle (if logged in) */
-	char tty[UT_LINESIZE+1];	/* null terminated tty line */
-	char host[UT_HOSTSIZE+1];	/* null terminated remote host name */
+	char tty[sizeof ((struct utmpx *)0)->ut_line];  /* tty line */
+	char host[sizeof ((struct utmpx *)0)->ut_host]; /* host name */
 } WHERE;
 
 #define UNPRIV_NAME	"nobody"	/* Preferred privilege level */

Modified: head/usr.bin/finger/lprint.c
==============================================================================
--- head/usr.bin/finger/lprint.c	Mon Dec 28 20:08:01 2009	(r201139)
+++ head/usr.bin/finger/lprint.c	Mon Dec 28 20:54:34 2009	(r201140)
@@ -56,8 +56,9 @@ __FBSDID("$FreeBSD$");
 #include <pwd.h>
 #include <stdio.h>
 #include <string.h>
+#define	_ULOG_POSIX_NAMES
+#include <ulog.h>
 #include <unistd.h>
-#include <utmp.h>
 #include "finger.h"
 #include "pathnames.h"
 

Modified: head/usr.bin/finger/net.c
==============================================================================
--- head/usr.bin/finger/net.c	Mon Dec 28 20:08:01 2009	(r201139)
+++ head/usr.bin/finger/net.c	Mon Dec 28 20:54:34 2009	(r201140)
@@ -54,8 +54,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>
 #include "finger.h"
 
 static void cleanup(int sig);

Modified: head/usr.bin/finger/sprint.c
==============================================================================
--- head/usr.bin/finger/sprint.c	Mon Dec 28 20:08:01 2009	(r201139)
+++ head/usr.bin/finger/sprint.c	Mon Dec 28 20:54:34 2009	(r201140)
@@ -43,6 +43,7 @@ static char sccsid[] = "@(#)sprint.c	8.3
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+#include <sys/param.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <db.h>
@@ -52,7 +53,8 @@ __FBSDID("$FreeBSD$");
 #include <stdio.h>
 #include <string.h>
 #include <time.h>
-#include <utmp.h>
+#define	_ULOG_POSIX_NAMES
+#include <ulog.h>
 #include "finger.h"
 
 static void	  stimeprint(WHERE *);
@@ -88,7 +90,7 @@ sflag_print(void)
 	 */
 #define	MAXREALNAME	16
 #define MAXHOSTNAME     17      /* in reality, hosts are never longer than 16 */
-	(void)printf("%-*s %-*s%s %s\n", UT_NAMESIZE, "Login", MAXREALNAME,
+	(void)printf("%-*s %-*s%s %s\n", MAXLOGNAME, "Login", MAXREALNAME,
 	    "Name", " TTY      Idle  Login  Time  ", (gflag) ? "" :
 	    oflag ? "Office  Phone" : "Where");
 
@@ -105,7 +107,7 @@ sflag_print(void)
 			namelen = MAXREALNAME;
 			if (w->info == LOGGEDIN && !w->writable)
 				--namelen;	/* leave space before `*' */
-			(void)printf("%-*.*s %-*.*s", UT_NAMESIZE, UT_NAMESIZE,
+			(void)printf("%-*.*s %-*.*s", MAXLOGNAME, MAXLOGNAME,
 				pn->name, MAXREALNAME, namelen,
 				pn->realname ? pn->realname : "");
 			if (!w->loginat) {

Modified: head/usr.bin/finger/util.c
==============================================================================
--- head/usr.bin/finger/util.c	Mon Dec 28 20:08:01 2009	(r201139)
+++ head/usr.bin/finger/util.c	Mon Dec 28 20:54:34 2009	(r201140)
@@ -56,8 +56,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>
 #include "finger.h"
 #include "pathnames.h"
 
@@ -109,29 +110,18 @@ void
 enter_lastlog(PERSON *pn)
 {
 	WHERE *w;
-	static int opened, fd;
-	struct lastlog ll;
+	struct ulog_utmpx *ut;
 	char doit = 0;
 
-	/* some systems may not maintain lastlog, don't report errors. */
-	if (!opened) {
-		fd = open(_PATH_LASTLOG, O_RDONLY, 0);
-		opened = 1;
-	}
-	if (fd == -1 ||
-	    lseek(fd, (long)pn->uid * sizeof(ll), SEEK_SET) !=
-	    (long)pn->uid * sizeof(ll) ||
-	    read(fd, (char *)&ll, sizeof(ll)) != sizeof(ll)) {
-			/* as if never logged in */
-			ll.ll_line[0] = ll.ll_host[0] = '\0';
-			ll.ll_time = 0;
-		}
+	ulog_setutxfile(UTXI_USER, NULL);
+	ut = ulog_getutxuser(pn->name);
 	if ((w = pn->whead) == NULL)
 		doit = 1;
-	else if (ll.ll_time != 0) {
+	else if (ut != NULL && ut->ut_type == USER_PROCESS) {
 		/* if last login is earlier than some current login */
 		for (; !doit && w != NULL; w = w->next)
-			if (w->info == LOGGEDIN && w->loginat < ll.ll_time)
+			if (w->info == LOGGEDIN &&
+			    w->loginat < ut->ut_tv.tv_sec)
 				doit = 1;
 		/*
 		 * and if it's not any of the current logins
@@ -140,32 +130,29 @@ enter_lastlog(PERSON *pn)
 		 */
 		for (w = pn->whead; doit && w != NULL; w = w->next)
 			if (w->info == LOGGEDIN &&
-			    strncmp(w->tty, ll.ll_line, UT_LINESIZE) == 0)
+			    strcmp(w->tty, ut->ut_line) == 0)
 				doit = 0;
 	}
-	if (doit) {
+	if (ut != NULL && doit) {
 		w = walloc(pn);
 		w->info = LASTLOG;
-		bcopy(ll.ll_line, w->tty, UT_LINESIZE);
-		w->tty[UT_LINESIZE] = 0;
-		bcopy(ll.ll_host, w->host, UT_HOSTSIZE);
-		w->host[UT_HOSTSIZE] = 0;
-		w->loginat = ll.ll_time;
+		strcpy(w->tty, ut->ut_line);
+		strcpy(w->host, ut->ut_host);
+		w->loginat = ut->ut_tv.tv_sec;
 	}
+	ulog_endutxent();
 }
 
 void
-enter_where(struct utmp *ut, PERSON *pn)
+enter_where(struct utmpx *ut, PERSON *pn)
 {
 	WHERE *w;
 
 	w = walloc(pn);
 	w->info = LOGGEDIN;
-	bcopy(ut->ut_line, w->tty, UT_LINESIZE);
-	w->tty[UT_LINESIZE] = 0;
-	bcopy(ut->ut_host, w->host, UT_HOSTSIZE);
-	w->host[UT_HOSTSIZE] = 0;
-	w->loginat = (time_t)ut->ut_time;
+	strcpy(w->tty, ut->ut_line);
+	strcpy(w->host, ut->ut_host);
+	w->loginat = ut->ut_tv.tv_sec;
 	find_idle_and_ttywrite(w);
 }
 
@@ -205,14 +192,12 @@ enter_person(struct passwd *pw)
 }
 
 PERSON *
-find_person(const char *name)
+find_person(char *name)
 {
 	struct passwd *pw;
 
-	int cnt;
 	DBT data, key;
 	PERSON *p;
-	char buf[UT_NAMESIZE + 1];
 
 	if (!db)
 		return(NULL);
@@ -220,12 +205,8 @@ find_person(const char *name)
 	if ((pw = getpwnam(name)) && hide(pw))
 		return(NULL);
 
-	/* Name may be only UT_NAMESIZE long and not NUL terminated. */
-	for (cnt = 0; cnt < UT_NAMESIZE && *name; ++name, ++cnt)
-		buf[cnt] = *name;
-	buf[cnt] = '\0';
-	key.data = buf;
-	key.size = cnt;
+	key.data = name;
+	key.size = strlen(name);
 
 	if ((*db->get)(db, &key, &data, 0))
 		return (NULL);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200912282054.nBSKsYj2001070>