From 0fcb939408ceeeae238e596c6f4ef06193b36949 Mon Sep 17 00:00:00 2001 From: David Galos Date: Thu, 18 Jul 2013 15:28:08 -0400 Subject: [PATCH] Compatibility with OpenBSD. Thanks, Steve Dee! --- Makefile | 8 ++++++-- env.c | 3 ++- who.1 | 6 +----- who.c | 22 +++++++++++++--------- 4 files changed, 22 insertions(+), 17 deletions(-) diff --git a/Makefile b/Makefile index 2bb244d..bd0c38c 100644 --- a/Makefile +++ b/Makefile @@ -88,10 +88,14 @@ OBJ = $(SRC:.c=.o) $(LIB) BIN = $(SRC:.c=) MAN = $(SRC:.c=.1) -all: $(BIN) +all: binlib + +binlib: util.a + $(MAKE) bin + +bin: $(BIN) $(OBJ): util.h config.mk -$(BIN): util.a cat.o fold.o grep.o nl.o sort.o tail.o uniq.o: text.h cp.o mv.o rm.o: fs.h diff --git a/env.c b/env.c index 718b13e..ca497e9 100644 --- a/env.c +++ b/env.c @@ -14,7 +14,8 @@ main(int argc, char **argv) { ARGBEGIN { case 'i': - clearenv(); + if(environ) + *environ = NULL; break; case 'u': unsetenv(EARGF(usage())); diff --git a/who.1 b/who.1 index 68ca7f1..d9c9f47 100644 --- a/who.1 +++ b/who.1 @@ -15,10 +15,6 @@ relies on the utmp file to be updated responsibly. This doesn't always happen, which can cause who to print completely bogus data. -musl\-libc currently implements all utmpx functions as stubs Obviously, -this command cannot work under such conditions. - .SH SEE ALSO -.IR getutxent (3) -.IR utmpx (5) +.IR utmp (5) diff --git a/who.c b/who.c index 08c3c2b..dfc3c1e 100644 --- a/who.c +++ b/who.c @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include "util.h" static void usage(void); @@ -11,21 +11,25 @@ static void usage(void); int main(int argc, char **argv) { - struct utmpx *ut; + struct utmp usr; + FILE *ufp; time_t t; char timebuf[sizeof "yyyy-mm-dd hh:mm"]; if(argc!=1) usage(); - while((ut=getutxent())) { - if(ut->ut_type != USER_PROCESS) - continue; - t = ut->ut_tv.tv_sec; - strftime(timebuf, sizeof timebuf, "%Y-%m-%d %H:%M", localtime(&t)); - printf("%-8s %-12s %-16s\n", ut->ut_user, ut->ut_line, timebuf); + if (!(ufp = fopen(_PATH_UTMP, "r"))) { + eprintf("fopen:"); } - endutxent(); + while(fread((char *)&usr, sizeof(usr), 1, ufp) == 1) { + if (!*usr.ut_name || !*usr.ut_line) + continue; + t = usr.ut_time; + strftime(timebuf, sizeof timebuf, "%Y-%m-%d %H:%M", localtime(&t)); + printf("%-8s %-12s %-16s\n", usr.ut_name, usr.ut_line, timebuf); + } + fclose(ufp); return 0; }