diff --git a/usr.bin/who/utmpentry.c b/usr.bin/who/utmpentry.c index 7c42fe71e18f..8488c4c0dbab 100644 --- a/usr.bin/who/utmpentry.c +++ b/usr.bin/who/utmpentry.c @@ -1,4 +1,4 @@ -/* $NetBSD: utmpentry.c,v 1.4 2003/02/12 17:39:36 christos Exp $ */ +/* $NetBSD: utmpentry.c,v 1.5 2004/10/22 15:50:47 christos Exp $ */ /*- * Copyright (c) 2002 The NetBSD Foundation, Inc. @@ -38,7 +38,7 @@ #include #ifndef lint -__RCSID("$NetBSD: utmpentry.c,v 1.4 2003/02/12 17:39:36 christos Exp $"); +__RCSID("$NetBSD: utmpentry.c,v 1.5 2004/10/22 15:50:47 christos Exp $"); #endif #include @@ -94,6 +94,7 @@ setup(const char *fname) { int what = 3; struct stat st; + const char *sfname; if (fname == NULL) { #ifdef SUPPORT_UTMPX @@ -110,38 +111,49 @@ setup(const char *fname) if (what == 1) { #ifdef SUPPORT_UTMPX if (utmpxname(fname) == 0) - err(1, "Cannot open `%s'", fname); + warnx("Cannot set utmpx file to `%s'", + fname); #else - errx(1, "utmpx support not compiled in"); + warnx("utmpx support not compiled in"); #endif } else { #ifdef SUPPORT_UTMP if (utmpname(fname) == 0) - err(1, "Cannot open `%s'", fname); + warnx("Cannot set utmp file to `%s'", + fname); #else - errx(1, "utmp support not compiled in"); + warnx("utmp support not compiled in"); #endif } } #ifdef SUPPORT_UTMPX if (what & 1) { - (void)stat(fname ? fname : _PATH_UTMPX, &st); - if (st.st_mtime > utmpxtime) - utmpxtime = st.st_mtime; - else + sfname = fname ? fname : _PATH_UTMPX; + if (stat(sfname, &st) == -1) { + warn("Cannot stat `%s'", sfname); what &= ~1; + } else { + if (st.st_mtime > utmpxtime) + utmpxtime = st.st_mtime; + else + what &= ~1; + } } #endif #ifdef SUPPORT_UTMP if (what & 2) { - (void)stat(fname ? fname : _PATH_UTMP, &st); - if (st.st_mtime > utmptime) - utmptime = st.st_mtime; - else + sfname = fname ? fname : _PATH_UTMP; + if (stat(sfname, &st) == -1) { + warn("Cannot stat `%s'", sfname); what &= ~2; + } else { + if (st.st_mtime > utmptime) + utmptime = st.st_mtime; + else + what &= ~2; + } } #endif - return what; } #endif @@ -179,10 +191,13 @@ getutentries(const char *fname, struct utmpentry **epp) struct utmpentry *ep; int what = setup(fname); struct utmpentry **nextp = &ehead; - if (what == 0) { + switch (what) { + case 0: + /* No updates */ *epp = ehead; return numutmp; - } else { + default: + /* Need to re-scan */ ehead = NULL; numutmp = 0; } @@ -192,8 +207,10 @@ getutentries(const char *fname, struct utmpentry **epp) while ((what & 1) && (utx = getutxent()) != NULL) { if (fname == NULL && utx->ut_type != USER_PROCESS) continue; - if ((ep = calloc(1, sizeof(struct utmpentry))) == NULL) - err(1, NULL); + if ((ep = calloc(1, sizeof(struct utmpentry))) == NULL) { + warn(NULL); + return 0; + } getentryx(ep, utx); *nextp = ep; nextp = &(ep->next); @@ -213,8 +230,10 @@ getutentries(const char *fname, struct utmpentry **epp) } if (ep != NULL) continue; - if ((ep = calloc(1, sizeof(struct utmpentry))) == NULL) - err(1, NULL); + if ((ep = calloc(1, sizeof(struct utmpentry))) == NULL) { + warn(NULL); + return 0; + } getentry(ep, ut); *nextp = ep; nextp = &(ep->next);