예제 #1
0
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;
}
예제 #2
0
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;
}