diff options
author | ed <ed@FreeBSD.org> | 2009-12-03 16:42:18 +0000 |
---|---|---|
committer | ed <ed@FreeBSD.org> | 2009-12-03 16:42:18 +0000 |
commit | 03da910d8db01460d044c3ff90cc30e8a00c63d0 (patch) | |
tree | 8863e43534c3b960cae0dde5cccc298b542aee40 /usr.bin | |
parent | de31befa07736fae7671f0dbe5d0561a438271da (diff) | |
download | FreeBSD-src-03da910d8db01460d044c3ff90cc30e8a00c63d0.zip FreeBSD-src-03da910d8db01460d044c3ff90cc30e8a00c63d0.tar.gz |
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.
Diffstat (limited to 'usr.bin')
-rw-r--r-- | usr.bin/users/Makefile | 3 | ||||
-rw-r--r-- | usr.bin/users/users.c | 46 |
2 files changed, 27 insertions, 22 deletions
diff --git a/usr.bin/users/Makefile b/usr.bin/users/Makefile index 3d6524b..53274b9 100644 --- a/usr.bin/users/Makefile +++ b/usr.bin/users/Makefile @@ -3,4 +3,7 @@ PROG= users +DPADD= ${LIBULOG} +LDADD= -lulog + .include <bsd.prog.mk> diff --git a/usr.bin/users/users.c b/usr.bin/users/users.c index c90bfbd..73dd619 100644 --- a/usr.bin/users/users.c +++ b/usr.bin/users/users.c @@ -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)); } |