Parts read_parts_file(char *infile, int(*process_records)(Parts, FILE *, off_t)) { FILE *istream; if ((istream = fopen(infile, "rb")) == NULL) { print_error(__FILE__, infile); return NULL; } struct stat infile_stat; if (stat(infile, &infile_stat) != 0) { print_error(__FILE__, infile); return NULL; } off_t record_size = (off_t)get_part_record_size(); if (infile_stat.st_size % record_size) { fprintf(stderr, "Corrupt file '%s': size must be multiple of %ld\n", infile, (size_t)record_size); return NULL; } Parts db = new_db(infile_stat.st_size / record_size); if (process_records(db, istream, record_size) !=0) { print_error(__FILE__, infile); return NULL; } if (fclose(istream) == EOF) { print_error(__FILE__, infile); return NULL; } return db; }
int main(int argc, const char *argv[]) { int rc = parse_options(argc, argv); switch (rc) { case 1: /* User asked usage to be printed */ return 0; case 0: break; default: return rc; } do { int fd = open(*filenames, O_RDONLY); if (fd < 0) { rc = EX_NOINPUT; } else { rc = lseek64(fd, record_range[0] * TRACE_RECORD_SIZE, SEEK_SET); if (rc < 0) { fprintf(stderr, "Could not seek to record %lu in %s due to %s", record_range[0], *filenames, strerror(errno)); rc = EX_DATAERR; } else { rc = process_records(fd); } } } while((0 == rc) && (*(filenames++) != NULL)); return rc; }