chiark / gitweb /
Bugfixes from Peter Benie.
authorian <ian>
Mon, 12 Nov 2001 12:39:04 +0000 (12:39 +0000)
committerian <ian>
Mon, 12 Nov 2001 12:39:04 +0000 (12:39 +0000)
cprogs/acctdump.c

index 2bc85f3..fbf7ead 100644 (file)
@@ -30,6 +30,7 @@
 #include <ctype.h>
 #include <sys/stat.h>
 #include <sys/acct.h>
+#include <errno.h>
 
 #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 (fnbufalloc<fnbufreq) {
       fnbufalloc= fnbufreq+10;
@@ -106,6 +111,10 @@ static void scandev(const char *basename, int levelsleft) {
     }
     sprintf(fnbuf,"%s/%s",basename,de->d_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<sizeof(as)) break;
       pos -= sizeof(as);
-      r= fsetpos(file,&pos); if (r) { perror(filename); exit(8); }
+      r= fseek(file,pos,SEEK_SET); if (r==-1) { perror(filename); exit(8); }
       r= fread(&as,1,sizeof(as),file); if (r!=sizeof(as)) { perror(filename); exit(8); }
       printrecord(&as,filename);
     }