Exemple #1
0
static int process_file(void){

  struct stat statb;
  int ccb_offset = g.opt_ccbsize;
  int status = 0;
  product prod;
  ssize_t nread;
  ssize_t filedata_size;
  unsigned char *p;
  int n;
  
  status = pq_open(g.opt_pqfname, PQ_DEFAULT, &g.pq);
  if(status != 0){
    if(status == PQ_CORRUPT)
      errx(1, "The product queue %s is inconsistent.", g.opt_pqfname);
    else 
      err(1, "pq_open");
  }

  prod.info.origin = g.opt_origin;
  prod.info.feedtype = g.opt_feedtype;
  set_timestamp(&prod.info.arrival);
  prod.info.seqno = g.seq;
  prod.info.ident = g.opt_prodid;
  if(prod.info.ident == NULL)
    prod.info.ident = g.input_fname;

  /*
   * This should not happen because it has been checked in option processing.
   */
  if(prod.info.ident == NULL)
    errx(1, "No prodid specified.");

  if(g.input_fname == NULL){
    g.fd = STDIN_FILENO;
    filedata_size = g.opt_filesize;
  }else {
    g.fd = open(g.input_fname, O_RDONLY, 0);
    if(g.fd == -1)
      err(1, "open");
	
    if(g.opt_filesize == 0){
      if(fstat(g.fd, &statb) == -1)
	err(1, "fstat");
      
      filedata_size = statb.st_size;
    }else
      filedata_size = g.opt_filesize;
  }

  if(g.opt_noccb == 0){
    if(filedata_size <= g.opt_ccbsize)
      input_file_errx(1, "No data in inputfile");
    else
      filedata_size -= g.opt_ccbsize;
  }else
    ccb_offset = 0;

  prod.info.sz = filedata_size;
  if(g.opt_gempak == 1){
    prod.info.sz += GMPK_HEADER_SIZE + GMPK_TRAILER_SIZE;
  }

  if(prod.info.sz <= STATIC_POOL_SIZE)
    prod.data = (void*)static_pool;
  else
    prod.data = malloc(prod.info.sz);

  if(prod.data == NULL)
    err(1, "malloc");

  if(ccb_offset != 0){
    if(lseek(g.fd, ccb_offset, SEEK_SET) == -1)
      input_file_err(1, "lseek error in inputfile");
  }

  p = (unsigned char*)prod.data;

  if(g.opt_gempak == 1){
    n = sprintf(gmpk_header_str, gmpk_header_fmt, (int)(g.seq % 1000));
    if(n != GMPK_HEADER_SIZE)
      errx(1, "gmpk_header_fmt format error.");

    memcpy(p, gmpk_header_str, GMPK_HEADER_SIZE);
    p += GMPK_HEADER_SIZE;
  }

  /*
   * Use readn when nbsp2ldm is opened as a pipe in tcl.
   */
  nread = readn(g.fd, p, filedata_size);
  if(nread != filedata_size)
    input_file_err(1, "read() error");

  if((g.opt_seq_str != NULL) && (g.opt_md5seq == 1))
    status = calc_md5((unsigned char*)g.opt_seq_str, strlen(g.opt_seq_str),
		      prod.info.signature);
  else
    status = calc_md5(p, filedata_size, prod.info.signature);

  if (status != 0)
    errx(1, "calc_md5");

  if(g.opt_gempak == 1){
    p += filedata_size;
    memcpy(p, gmpk_trailer_str, GMPK_TRAILER_SIZE);
  }

  status = pq_insert(g.pq, &prod);    
  if(status == PQUEUE_DUP){
    status = 0;
    warnx("Product already in queue: %s.", prod.info.ident);
  }else if(status != 0)
    errx(1, "pq_insert: %d", status);

  return(status);
}
Exemple #2
0
static int process_file(void) {
  /*
   * Process a file given in the command line or its data from stdin
   */
  struct stat statb;
  int ccb_offset = g.opt_ccbsize;
  int status = 0;
  product prod;
  ssize_t nread;
  ssize_t filedata_size;
  unsigned char *p;
  int n;

#ifdef TEST
  test_print();
  return(0);
#endif
  
  prod.info.origin = g.opt_origin;
  prod.info.feedtype = g.opt_feedtype;
  set_timestamp(&prod.info.arrival);
  prod.info.seqno = g.seq;
  prod.info.ident = g.opt_prodid;
  if(prod.info.ident == NULL)
    prod.info.ident = g.input_fname;

  /*
   * This should not happen because it has been checked in option processing.
   */
  if(prod.info.ident == NULL)
    log_errx(1, "No prodid specified.");

  if(g.input_fname == NULL){
    g.fd = STDIN_FILENO;
    filedata_size = g.opt_filesize;
  } else {
    g.fd = open(g.input_fname, O_RDONLY, 0);
    if(g.fd == -1)
      input_file_err(1, "Error from open()");
	
    if(g.opt_filesize == 0){
      if(fstat(g.fd, &statb) == -1)
	input_file_err(1, "Error from fstat()");
      
      filedata_size = statb.st_size;
    }else
      filedata_size = g.opt_filesize;
  }

  if(g.opt_noccb == 0){
    if(filedata_size <= g.opt_ccbsize)
      input_file_errx(1, "No data in inputfile");
    else
      filedata_size -= g.opt_ccbsize;
  }else
    ccb_offset = 0;

  prod.info.sz = filedata_size;
  if(g.opt_gempak == 1){
    prod.info.sz += GMPK_HEADER_SIZE + GMPK_TRAILER_SIZE;
  }

  if(prod.info.sz <= STATIC_POOL_SIZE)
    prod.data = (void*)static_pool;
  else if(prod.info.sz <= g.dynamic_pool_size)
    prod.data = g.dynamic_pool;
  else {
    prod.data = malloc(prod.info.sz);
    if(prod.data == NULL)
      log_err(1, "Error frrom malloc()");

    if(g.dynamic_pool != NULL)
      free(g.dynamic_pool);
    
    g.dynamic_pool = prod.data;
    g.dynamic_pool_size = prod.info.sz;
  }

  if(ccb_offset != 0){
    if(lseek(g.fd, ccb_offset, SEEK_SET) == -1)
      input_file_err(1, "Error from lseek()");
  }

  p = (unsigned char*)prod.data;

  if(g.opt_gempak == 1){
    n = sprintf(gmpk_header_str, gmpk_header_fmt, (int)(g.seq % 1000));
    if(n != GMPK_HEADER_SIZE)
      errx(1, "gmpk_header_fmt format error.");

    memcpy(p, gmpk_header_str, GMPK_HEADER_SIZE);
    p += GMPK_HEADER_SIZE;
  }

  /*
   * Use readn when nbsp2ldm is opened as a pipe in tcl.
   */
  nread = readn(g.fd, p, filedata_size);
  if(nread != filedata_size)
    input_file_err(1, "Error from read()");

  if((g.opt_md5seq == 1) && (g.opt_seq_str != NULL))
    status = calc_md5((unsigned char*)g.opt_seq_str,
		      strlen(g.opt_seq_str),
		      prod.info.signature);
  else
    status = calc_md5(p, filedata_size, prod.info.signature);

  if (status != 0)
    log_errx(1, "Error from calc_md5()");

  if(g.opt_gempak == 1){
    p += filedata_size;
    memcpy(p, gmpk_trailer_str, GMPK_TRAILER_SIZE);
  }

  status = pq_insert(g.pq, &prod);    
  if(status == PQUEUE_DUP){
    status = 0;
    log_warnx("Product already in queue: %s.", prod.info.ident);
  }else if(status != 0)
    log_errx(1, "Error from pq_insert: %d", status);
  else if(g.opt_verbose == 1)
    log_info("Inserted %s", prod.info.ident);

  if((g.fd != -1) && (g.fd != STDIN_FILENO)){
    close(g.fd);
    g.fd = -1;
  }

  resetdefaults();    /* reset the option parameters for the next file */
  
  return(status != 0 ? 1 : 0);
}