static int acct_load(char *pn, int wr) { struct acct ac; struct cmdinfo ci; ssize_t rv; int fd, i; /* * open the file */ fd = open(pn, wr ? O_RDWR : O_RDONLY, 0); if (fd == -1) { warn("open %s %s", pn, wr ? "for read/write" : "read-only"); return (-1); } /* * read all we can; don't stat and open because more processes * could exit, and we'd miss them */ while (1) { /* get one accounting entry and punt if there's an error */ rv = read(fd, &ac, sizeof(struct acct)); if (rv == -1) warn("error reading %s", pn); else if (rv > 0 && rv < sizeof(struct acct)) warnx("short read of accounting data in %s", pn); if (rv != sizeof(struct acct)) break; /* decode it */ ci.ci_calls = 1; for (i = 0; i < sizeof(ac.ac_comm) && ac.ac_comm[i] != '\0'; i++) { unsigned char c = ac.ac_comm[i]; if (!isascii(c) || iscntrl(c)) { ci.ci_comm[i] = '?'; ci.ci_flags |= CI_UNPRINTABLE; } else ci.ci_comm[i] = c; } if (ac.ac_flag & AFORK) ci.ci_comm[i++] = '*'; ci.ci_comm[i++] = '\0'; ci.ci_etime = decode_comp_t(ac.ac_etime); ci.ci_utime = decode_comp_t(ac.ac_utime); ci.ci_stime = decode_comp_t(ac.ac_stime); ci.ci_uid = ac.ac_uid; ci.ci_mem = ac.ac_mem; ci.ci_io = decode_comp_t(ac.ac_io) / AHZ; if (!uflag) { /* and enter it into the usracct and pacct databases */ if (sflag || (!mflag && !qflag)) pacct_add(&ci); if (sflag || (mflag && !qflag)) usracct_add(&ci); } else if (!qflag) printf("%6u %12.2f cpu %12lluk mem %12llu io %s\n", ci.ci_uid, (ci.ci_utime + ci.ci_stime) / (double) AHZ, ci.ci_mem, ci.ci_io, ci.ci_comm); } /* finally, return the file descriptor for possible truncation */ return (fd); }
static FILE * acct_load(const char *pn, int wr) { struct acctv2 ac; struct cmdinfo ci; ssize_t rv; FILE *f; int i; /* * open the file */ f = fopen(pn, wr ? "r+" : "r"); if (f == NULL) { warn("open %s %s", pn, wr ? "for read/write" : "read-only"); return (NULL); } /* * read all we can; don't stat and open because more processes * could exit, and we'd miss them */ while (1) { /* get one accounting entry and punt if there's an error */ rv = readrec_forward(f, &ac); if (rv != 1) { if (rv == EOF) warn("error reading %s", pn); break; } /* decode it */ ci.ci_calls = 1; for (i = 0; i < (int)sizeof ac.ac_comm && ac.ac_comm[i] != '\0'; i++) { char c = ac.ac_comm[i]; if (!isascii(c) || iscntrl(c)) { ci.ci_comm[i] = '?'; ci.ci_flags |= CI_UNPRINTABLE; } else ci.ci_comm[i] = c; } if (ac.ac_flagx & AFORK) ci.ci_comm[i++] = '*'; ci.ci_comm[i++] = '\0'; ci.ci_etime = ac.ac_etime; ci.ci_utime = ac.ac_utime; ci.ci_stime = ac.ac_stime; ci.ci_uid = ac.ac_uid; ci.ci_mem = ac.ac_mem; ci.ci_io = ac.ac_io; if (!uflag) { /* and enter it into the usracct and pacct databases */ if (sflag || (!mflag && !qflag)) pacct_add(&ci); if (sflag || (mflag && !qflag)) usracct_add(&ci); } else if (!qflag) printf("%6u %12.3lf cpu %12.0lfk mem %12.0lf io %s\n", ci.ci_uid, (ci.ci_utime + ci.ci_stime) / 1000000, ci.ci_mem, ci.ci_io, ci.ci_comm); } /* Finally, return the file stream for possible truncation. */ return (f); }