X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=cprogs%2Facctdump.c;h=98fab9c55d4f96d0d782500894c99a5c1f62b4d1;hb=4279c63e7667011e81eeba843c9b634ec2265115;hp=2bc85f350269806a3359131da082551a21e717fa;hpb=c3db12b88fda05670222f143a68755bb673c0a31;p=chiark-utils.git diff --git a/cprogs/acctdump.c b/cprogs/acctdump.c index 2bc85f3..98fab9c 100644 --- a/cprogs/acctdump.c +++ b/cprogs/acctdump.c @@ -28,8 +28,13 @@ #include #include #include +#include #include -#include + +typedef unsigned long long u64; +#include "acct.h" +/*#include */ +typedef struct acct_v3 struct_acct; #include "myopt.h" @@ -91,12 +96,16 @@ static void scandev(const char *basename, int levelsleft) { if (levelsleft==0) return; - dir= opendir(basename); if (!dir) return; + dir= opendir(basename); + if (!dir) { + fprintf(stderr, "%s: opendir: %s\n", basename, strerror(errno)); + return; + } fnbufalloc= 0; fnbuf= 0; basel= strlen(basename); - while ((de= readdir(dir))) { + while ((errno=0, de= readdir(dir))) { fnbufreq= basel+1+strlen(de->d_name)+1; if (fnbufallocd_name); r= lstat(fnbuf,&stab); + if (r) { + fprintf(stderr, "%s: %s\n", fnbuf, strerror(errno)); + continue; + } if (S_ISCHR(stab.st_mode)) { if (de_used >= de_allocd) { nallocd= (de_allocd+10)<<1; @@ -122,6 +135,8 @@ static void scandev(const char *basename, int levelsleft) { scandev(fnbuf,levelsleft-1); } } + if (errno) + fprintf(stderr, "%s: readdir: %s\n", basename, strerror(errno)); closedir(dir); free(fnbuf); } @@ -150,7 +165,7 @@ static void printbanner(void) { checkstdout(); } -static void printrecord(const struct acct *as, const char *filename) { +static void printrecord(const struct_acct *as, const char *filename) { static int walkeddev; int i, dc, r; @@ -160,11 +175,13 @@ static void printrecord(const struct acct *as, const char *filename) { struct deventry *deve, devlookfor; struct passwd *pw; struct group *gr; + time_t btime; if (raw) { printf("%10lu ",(unsigned long)as->ac_btime); } else { - tm= localtime(&as->ac_btime); + btime= as->ac_btime; + tm= localtime(&btime); strftime(buf,sizeof(buf),"%Y-%m-%d %H:%M:%S",tm); buf[sizeof(buf)-1]= 0; printf("%19s ",buf); } @@ -180,13 +197,13 @@ static void printrecord(const struct acct *as, const char *filename) { else printf("%-8ld ",(long)as->ac_gid); if (raw) { - if (as->ac_tty == (dev_t)-1) { + if (!(as->ac_tty + 1) /* check for -1 without knowing type */) { printf("- "); } else { printf("%08lx ",(unsigned long)as->ac_tty); } } else { - if (as->ac_tty == (dev_t)-1) { + if (!(as->ac_tty + 1)) { printf("- "); } else { if (!walkeddev) { @@ -206,11 +223,11 @@ static void printrecord(const struct acct *as, const char *filename) { } r= as->ac_flag; - for (i=1, fp= "FSDX"; *fp; fp++, i<<=1) { + for (i=1, fp= "FS4DX"; *fp; fp++, i<<=1) { if (r&i) { putchar(*fp); r &= ~i; - } else { + } else if (!isdigit(*fp)) { putchar(' '); } } @@ -263,8 +280,8 @@ static void printrecord(const struct acct *as, const char *filename) { } static void processfile(FILE *file, const char *filename) { - fpos_t pos; - struct acct as; + struct_acct as; + long pos; int r; if (forwards) { @@ -272,14 +289,21 @@ static void processfile(FILE *file, const char *filename) { printrecord(&as,filename); } } else { + long seekdist= -(long)sizeof(as); r= fseek(file,0,SEEK_END); if (r) { perror(filename); exit(8); } - r= fgetpos(file,&pos); if (r) { perror(filename); exit(8); } + pos= ftell(file); if (pos==-1) { perror(filename); exit(8); } + if (pos % sizeof(as)) { + fprintf(stderr, "%s: File size is not an integral number " + "of accounting records", filename); + exit(8); + } for (;;) { if (pos"); } else if (!*argv) {