diff --git a/Makefile b/Makefile
index f825ec4..8516693 100644
--- a/Makefile
+++ b/Makefile
@@ -86,10 +86,13 @@ OBJ = $(SRC:.c=.o) $(LIB)
 BIN = $(SRC:.c=)
 MAN = $(SRC:.c=.1)
 
-all: $(BIN)
+all: bin
+
+bin: util.a
+	$(MAKE) $(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..300bb23 100644
--- a/env.c
+++ b/env.c
@@ -14,7 +14,7 @@ main(int argc, char **argv)
 {
 	ARGBEGIN {
 	case 'i':
-		clearenv();
+		*environ = NULL;
 		break;
 	case 'u':
 		unsetenv(EARGF(usage()));
diff --git a/who.c b/who.c
index 08c3c2b..97f2ec3 100644
--- a/who.c
+++ b/who.c
@@ -3,7 +3,7 @@
 #include <string.h>
 #include <unistd.h>
 #include <time.h>
-#include <utmpx.h>
+#include <utmp.h>
 #include "util.h"
 
 static void usage(void);
@@ -11,21 +11,26 @@ 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:");
+	}
+	while(fread((char *)&usr, sizeof(usr), 1, ufp) == 1) {
+		if (*usr.ut_name && *usr.ut_line) {
+			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);
+		}
 	}
-	endutxent();
+	fclose(ufp);
 	return 0;
 }
 
