}
static void processfile(FILE *file, const char *filename) {
- struct acct as;
+ struct_acct as;
+ long pos;
int r;
if (forwards) {
printrecord(&as,filename);
}
} else {
+ long seekdist= -(long)sizeof(as);
r= fseek(file,0,SEEK_END); 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 (;;) {
- r= fseek(file,seekdist,SEEK_CUR);
- if (r) {
- if (errno=EINVAL) break;
- perror(filename); exit(8);
- }
- r= fread(&as,1,sizeof(as),file);
- if (r!=sizeof(as)) { perror(filename); exit(8); }
+ if (pos<sizeof(as)) break;
+ pos -= sizeof(as);
+ 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);
+ seekdist= -2*(long)sizeof(as);
}
}
if (ferror(file) || fclose(file)) { perror(filename); exit(8); }