4.3bsd version
[unix-history] / usr / src / usr.bin / lastcomm / lastcomm.c
index 0c6c868..1ee2077 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)lastcomm.c  4.7 (Berkeley) %G%";
+static char *sccsid = "@(#)lastcomm.c  4.14 (Berkeley) %G%";
 #endif
 
 /*
 #endif
 
 /*
@@ -37,8 +37,8 @@ main(argc, argv)
                exit(1);
        }
        fstat(fd, &sb);
                exit(1);
        }
        fstat(fd, &sb);
-       for (bn = btodb(sb.st_size) - 1; bn >= 0; bn--) {
-               lseek(fd, bn * DEV_BSIZE, L_SET);
+       for (bn = btodb(sb.st_size); bn >= 0; bn--) {
+               lseek(fd, dbtob(bn), L_SET);
                cc = read(fd, buf, DEV_BSIZE);
                if (cc < 0) {
                        perror("read");
                cc = read(fd, buf, DEV_BSIZE);
                if (cc < 0) {
                        perror("read");
@@ -47,24 +47,24 @@ main(argc, argv)
                acp = buf + (cc / sizeof (buf[0])) - 1;
                for (; acp >= buf; acp--) {
                        register char *cp;
                acp = buf + (cc / sizeof (buf[0])) - 1;
                for (; acp >= buf; acp--) {
                        register char *cp;
-                       time_t x =
-                           expand(acp->ac_utime) + expand(acp->ac_stime);
+                       time_t x;
 
 
-                       acp->ac_comm[10] = '\0';
-                       if (*acp->ac_comm == '\0')
+                       if (acp->ac_comm[0] == '\0')
                                strcpy(acp->ac_comm, "?");
                                strcpy(acp->ac_comm, "?");
-                       for (cp = acp->ac_comm; *cp; cp++)
-                               if (iscntrl(*cp))
+                       for (cp = &acp->ac_comm[0];
+                            cp < &acp->ac_comm[fldsiz(acct, ac_comm)] && *cp;
+                            cp++)
+                               if (!isascii(*cp) || iscntrl(*cp))
                                        *cp = '?';
                                        *cp = '?';
-                       if (!ok(argc, argv, acp) && argc != 1)
+                       if (argc > 1 && !ok(argc, argv, acp))
                                continue;
                                continue;
-                       printf("%-*s %s %-*s %-*s %4d sec%s %.16s\n",
+                       x = expand(acp->ac_utime) + expand(acp->ac_stime);
+                       printf("%-*s %s %-*s %-*s %6.2f secs %.16s\n",
                                fldsiz(acct, ac_comm), acp->ac_comm,
                                flagbits(acp->ac_flag),
                                fldsiz(utmp, ut_name), getname(acp->ac_uid),
                                fldsiz(utmp, ut_line), getdev(acp->ac_tty),
                                fldsiz(acct, ac_comm), acp->ac_comm,
                                flagbits(acp->ac_flag),
                                fldsiz(utmp, ut_name), getname(acp->ac_uid),
                                fldsiz(utmp, ut_line), getdev(acp->ac_tty),
-                               x, x > 1 || x == 0 ? "s" : " ",
-                               ctime(&acp->ac_btime));
+                               x / (double)AHZ, ctime(&acp->ac_btime));
                }
        }
 }
                }
        }
 }
@@ -111,7 +111,7 @@ ok(argc, argv, acp)
        for (j = 1; j < argc; j++)
                if (strcmp(getname(acp->ac_uid), argv[j]) &&
                    strcmp(getdev(acp->ac_tty), argv[j]) &&
        for (j = 1; j < argc; j++)
                if (strcmp(getname(acp->ac_uid), argv[j]) &&
                    strcmp(getdev(acp->ac_tty), argv[j]) &&
-                   strcmp(acp->ac_comm, argv[j]))
+                   strncmp(acp->ac_comm, argv[j], fldsiz(acct, ac_comm)))
                        break;
        return (j == argc);
 }
                        break;
        return (j == argc);
 }
@@ -146,7 +146,7 @@ getname(uid)
                        if (pw->pw_uid != uid)
                                continue;
                        outrangeuid = pw->pw_uid;
                        if (pw->pw_uid != uid)
                                continue;
                        outrangeuid = pw->pw_uid;
-                       strncpy(outrangename, pw->pw_name, NUID);
+                       strncpy(outrangename, pw->pw_name, NMAX);
                        endpwent();
                        return (outrangename);
                }
                        endpwent();
                        return (outrangename);
                }
@@ -159,7 +159,7 @@ getname(uid)
                if (pw->pw_uid < 0 || pw->pw_uid >= NUID) {
                        if (pw->pw_uid == uid) {
                                outrangeuid = pw->pw_uid;
                if (pw->pw_uid < 0 || pw->pw_uid >= NUID) {
                        if (pw->pw_uid == uid) {
                                outrangeuid = pw->pw_uid;
-                               strncpy(outrangename, pw->pw_name, NUID);
+                               strncpy(outrangename, pw->pw_name, NMAX);
                                return (outrangename);
                        }
                        continue;
                                return (outrangename);
                        }
                        continue;
@@ -203,6 +203,7 @@ setupdevs()
        hashtab = (struct devhash *)malloc(NDEVS * sizeof(struct devhash));
        if (hashtab == (struct devhash *)0) {
                fprintf(stderr, "No mem for dev table\n");
        hashtab = (struct devhash *)malloc(NDEVS * sizeof(struct devhash));
        if (hashtab == (struct devhash *)0) {
                fprintf(stderr, "No mem for dev table\n");
+               closedir(fd);
                return;
        }
        while (dp = readdir(fd)) {
                return;
        }
        while (dp = readdir(fd)) {
@@ -230,7 +231,7 @@ getdev(dev)
        char name[fldsiz(devhash, dev_name) + 6];
        static dev_t lastdev = (dev_t) -1;
        static char *lastname;
        char name[fldsiz(devhash, dev_name) + 6];
        static dev_t lastdev = (dev_t) -1;
        static char *lastname;
-       int init = 0;
+       static int init = 0;
 
        if (dev == NODEV)
                return ("__");
 
        if (dev == NODEV)
                return ("__");