- for (bl--; bl >= 0; bl--) {
- lseek(wtmp, bl * sizeof (buf), 0);
- bp = &buf[read(wtmp, buf, sizeof (buf)) / sizeof(buf[0]) - 1];
- for ( ; bp >= buf; bp--) {
- print = want(bp);
- if (print) {
- ct = ctime(&bp->ut_time);
- printf("%-*.*s %-*.*s %10.10s %5.5s ",
- NMAX, NMAX, bp->ut_name,
- LMAX, LMAX, bp->ut_line, ct, 11+ct);
+ wtmp();
+ exit(0);
+}
+
+/*
+ * wtmp --
+ * read through the wtmp file
+ */
+void
+wtmp()
+{
+ struct utmp *bp; /* current structure */
+ TTY *T; /* tty list entry */
+ struct stat stb; /* stat of file for size */
+ long bl, delta; /* time difference */
+ int bytes, wfd;
+ char *ct, *crmsg;
+
+ if ((wfd = open(file, O_RDONLY, 0)) < 0 || fstat(wfd, &stb) == -1)
+ err(1, "%s", file);
+ bl = (stb.st_size + sizeof(buf) - 1) / sizeof(buf);
+
+ (void)time(&buf[0].ut_time);
+ (void)signal(SIGINT, onintr);
+ (void)signal(SIGQUIT, onintr);
+
+ while (--bl >= 0) {
+ if (lseek(wfd, (off_t)(bl * sizeof(buf)), L_SET) == -1 ||
+ (bytes = read(wfd, buf, sizeof(buf))) == -1)
+ err(1, "%s", file);
+ for (bp = &buf[bytes / sizeof(buf[0]) - 1]; bp >= buf; --bp) {
+ /*
+ * if the terminal line is '~', the machine stopped.
+ * see utmp(5) for more info.
+ */
+ if (bp->ut_line[0] == '~' && !bp->ut_line[1]) {
+ /* everybody just logged out */
+ for (T = ttylist; T; T = T->next)
+ T->logout = -bp->ut_time;
+ currentout = -bp->ut_time;
+ crmsg = strncmp(bp->ut_name, "shutdown",
+ UT_NAMESIZE) ? "crash" : "shutdown";
+ if (want(bp, NO)) {
+ ct = ctime(&bp->ut_time);
+ printf("%-*.*s %-*.*s %-*.*s %10.10s %5.5s \n",
+ UT_NAMESIZE, UT_NAMESIZE,
+ bp->ut_name, UT_LINESIZE,
+ UT_LINESIZE, bp->ut_line,
+ UT_HOSTSIZE, UT_HOSTSIZE,
+ bp->ut_host, ct, ct + 11);
+ if (maxrec != -1 && !--maxrec)
+ return;
+ }
+ continue;