[Samba] utmp update for bsd systems

Michael Shalayeff mickey at lucifier.net
Wed Mar 30 20:49:12 GMT 2005


re
this is a patch against samba-2.2.12p0 and adds support
for updating utmp on bsds. code similarly ripped from
openbsd's ftpd (;
cu
-- 
    paranoic mickey       (my employers have changed but, the name has remained)

--- utmp.c	Thu Aug 12 14:24:20 2004
+++ /home/mickey/utmp.c	Wed Mar 30 15:51:40 2005
@@ -261,6 +261,7 @@
 }
 
 #ifndef HAVE_PUTUTLINE
+#include <ttyent.h>
 
 /****************************************************************************
  Update utmp file directly.  No subroutine interface: probably a BSD system.
@@ -268,8 +269,50 @@
 
 static void pututline_my(pstring uname, struct utmp *u, BOOL claim)
 {
-	DEBUG(1,("pututline_my: not yet implemented\n"));
-	/* BSD implementor: may want to consider (or not) adjusting "lastlog" */
+	int fd, topslot;
+	struct utmp ubuf;
+
+	if ((fd = open(uname, O_RDWR, 0)) < 0)
+		return;
+
+	if (!setttyent())
+		return;
+
+	for (topslot = 0; getttyent() != (struct ttyent *)NULL; )
+		topslot++;
+
+	if (!endttyent())
+		return;
+
+	(void) lseek(fd, (off_t)(topslot * sizeof(struct utmp)), SEEK_SET);
+
+	DEBUG(1,("pututline(%s, %s, %d); topslot=%d\n",
+	    u->ut_line, u->ut_name, claim, topslot));
+
+	while (1) {
+		if (read(fd, &ubuf, sizeof(ubuf)) == sizeof(ubuf)) {
+			if ((claim && !ubuf.ut_name[0]) ||
+			    (!claim && ubuf.ut_name[0] &&
+			     !strncmp(ubuf.ut_line, u->ut_line, UT_LINESIZE))) {
+				(void) lseek(fd, -(off_t)sizeof(struct utmp),
+				    SEEK_CUR);
+				break;
+			}
+			topslot++;
+		} else {
+			(void) lseek(fd, (off_t)(topslot *
+			    sizeof(struct utmp)), SEEK_SET);
+			break;
+		}
+	}
+
+	if (! claim) {
+		memset((char *)&u->ut_name, '\0', sizeof(u->ut_name));
+		memset((char *)&u->ut_host, '\0', sizeof(u->ut_host));
+	}
+	(void) write(fd, u, sizeof(struct utmp));
+
+	(void) close(fd);
 }
 #endif /* HAVE_PUTUTLINE */
 



More information about the samba mailing list