From: ian Date: Mon, 12 Nov 2001 12:39:04 +0000 (+0000) Subject: Bugfixes from Peter Benie. X-Git-Tag: debian/4.4.0~8^2~6^2 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=chiark-utils.git;a=commitdiff_plain;h=94ace4a83f8455a2623604ae96e22eef2abd952d;hp=c3db12b88fda05670222f143a68755bb673c0a31 Bugfixes from Peter Benie. --- diff --git a/cprogs/acctdump.c b/cprogs/acctdump.c index 2bc85f3..fbf7ead 100644 --- a/cprogs/acctdump.c +++ b/cprogs/acctdump.c @@ -30,6 +30,7 @@ #include #include #include +#include #include "myopt.h" @@ -91,12 +92,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 +131,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); } @@ -164,7 +175,8 @@ static void printrecord(const struct acct *as, const char *filename) { if (raw) { printf("%10lu ",(unsigned long)as->ac_btime); } else { - tm= localtime(&as->ac_btime); + time_t 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); } @@ -263,7 +275,7 @@ static void printrecord(const struct acct *as, const char *filename) { } static void processfile(FILE *file, const char *filename) { - fpos_t pos; + long pos; struct acct as; int r; @@ -273,11 +285,16 @@ static void processfile(FILE *file, const char *filename) { } } else { 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