#include <ctype.h>
#include <sys/stat.h>
#include <sys/acct.h>
+#include <errno.h>
#include "myopt.h"
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;
}
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;
scandev(fnbuf,levelsleft-1);
}
}
+ if (errno)
+ fprintf(stderr, "%s: readdir: %s\n", basename, strerror(errno));
closedir(dir);
free(fnbuf);
}
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);
}
}
static void processfile(FILE *file, const char *filename) {
- fpos_t pos;
+ long pos;
struct acct as;
int r;
}
} 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);
}