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); }
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); }