/* * byte-years -- * the size of a file times the length of time since * last modified, expressed in years. * Also print size, date, name */ #include #include #define YEAR (24L*60L*60L*365L) long now, year; int aflag, errflag; int consider(char *name, Dir *d) { double by; char *p; long t; t = aflag? d->atime: d->mtime; by = (double) d->length * (double) (now - t) / YEAR; print ("%12.0f %10d", by + 0.5, d->length); p = ctime (t); if (t < year) print(" %-7.7s %-4.4s ", p+4, p+20); else print(" %-12.12s ", p+4); print ("%s\n", name); return 0; } int check(char *s, int (*by) (char*, Dir*)) { Dir *d; int fd, rc; int n, i; d = dirstat (s); if (d == nil) { perror (s); return -1; } if ((d->mode&DMDIR) == 0) return by (s, d); if ((fd = open (s, OREAD)) == -1) { perror (s); return -1; } if ((n = dirreadall (fd, &d)) < 0) { perror (s); return -1; } for (i = 0; i < n; i++) if ((rc = by ((d+i)->name, d+i)) < 0) return rc; /* in case */ close (fd); return 0; } int main (int argc, char **argv) { int i; int rc = 1; ARGBEGIN { case 'a': aflag++; break; case '?': errflag++; } ARGEND if (errflag) { fprint (2, "usage: byteyears [-a] [file]...\n"); exits ("usage"); } time (&now); year = now - (YEAR/2); if (!argc) { if (check (".", consider) < 0) { fprint (2, "cannot access current directory\n"); rc++; } } else { for (i = 0; i < argc; i++) { if (check (argv[i], consider) < 0) { fprint (2, "cannot access %s\n", argv[i]); rc++; } } } return rc; }