Date: Thu, 3 Dec 2009 16:42:19 +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: r200066 - head/usr.bin/users Message-ID: <200912031642.nB3GgJHh019817@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: ed Date: Thu Dec 3 16:42:18 2009 New Revision: 200066 URL: http://svn.freebsd.org/changeset/base/200066 Log: Port users(1) to libulog. Instead of digging through the utmp database by hand, use proper API calls to do so. Instead of parsing entries with a non-empty ut_user, we now look at LOGIN_PROCESS entries. Modified: head/usr.bin/users/Makefile head/usr.bin/users/users.c Modified: head/usr.bin/users/Makefile ============================================================================== --- head/usr.bin/users/Makefile Thu Dec 3 16:33:47 2009 (r200065) +++ head/usr.bin/users/Makefile Thu Dec 3 16:42:18 2009 (r200066) @@ -3,4 +3,7 @@ PROG= users +DPADD= ${LIBULOG} +LDADD= -lulog + .include <bsd.prog.mk> Modified: head/usr.bin/users/users.c ============================================================================== --- head/usr.bin/users/users.c Thu Dec 3 16:33:47 2009 (r200065) +++ head/usr.bin/users/users.c Thu Dec 3 16:42:18 2009 (r200066) @@ -45,15 +45,16 @@ static const char rcsid[] = "$FreeBSD$"; #endif /* not lint */ +#include <sys/param.h> #include <sys/types.h> #include <err.h> #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <ulog.h> #include <unistd.h> -#include <utmp.h> -typedef char namebuf[UT_NAMESIZE]; +typedef char namebuf[MAXLOGNAME]; int scmp(const void *, const void *); static void usage(void); @@ -65,7 +66,7 @@ main(int argc, char **argv) int ncnt = 0; int nmax = 0; int cnt; - struct utmp utmp; + struct ulog_utmpx *ut; int ch; while ((ch = getopt(argc, argv, "")) != -1) @@ -77,28 +78,28 @@ main(int argc, char **argv) argc -= optind; argv += optind; - if (!freopen(_PATH_UTMP, "r", stdin)) - errx(1, "can't open %s", _PATH_UTMP); - while (fread((char *)&utmp, sizeof(utmp), 1, stdin) == 1) { - if (*utmp.ut_name) { - if (ncnt >= nmax) { - nmax += 32; - names = realloc(names, sizeof (*names) * nmax); - if (!names) { - errx(1, "realloc"); - /* NOTREACHED */ - } + ulog_setutxent(); + while ((ut = ulog_getutxent()) != NULL) { + if (ut->ut_type != LOGIN_PROCESS) + continue; + if (ncnt >= nmax) { + nmax += 32; + names = realloc(names, sizeof(*names) * nmax); + if (!names) { + errx(1, "realloc"); + /* NOTREACHED */ } - (void)strncpy(names[ncnt], utmp.ut_name, UT_NAMESIZE); - ++ncnt; } + (void)strlcpy(names[ncnt], ut->ut_user, sizeof(*names)); + ++ncnt; } - if (ncnt) { - qsort(names, ncnt, UT_NAMESIZE, scmp); - (void)printf("%.*s", UT_NAMESIZE, names[0]); + ulog_endutxent(); + if (ncnt > 0) { + qsort(names, ncnt, sizeof(namebuf), scmp); + (void)printf("%s", names[0]); for (cnt = 1; cnt < ncnt; ++cnt) - if (strncmp(names[cnt], names[cnt - 1], UT_NAMESIZE)) - (void)printf(" %.*s", UT_NAMESIZE, names[cnt]); + if (strcmp(names[cnt], names[cnt - 1]) != 0) + (void)printf(" %s", names[cnt]); (void)printf("\n"); } exit(0); @@ -114,5 +115,6 @@ usage(void) int scmp(const void *p, const void *q) { - return(strncmp(p, q, UT_NAMESIZE)); + + return (strcmp(p, q)); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200912031642.nB3GgJHh019817>