From f202b762e293b75fd3aa4683c3c92ce1ae0a7454 Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Fri, 4 Jan 2013 14:50:22 +0100 Subject: [PATCH] yaz-marcdump: exit(5) for serious decoding errors --- util/marcdump.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 46 insertions(+), 9 deletions(-) diff --git a/util/marcdump.c b/util/marcdump.c index adc6cba..02dacb1 100644 --- a/util/marcdump.c +++ b/util/marcdump.c @@ -56,6 +56,8 @@ static char *prog; +static int no_errors = 0; + static void usage(const char *prog) { fprintf(stderr, "Usage: %s [-i format] [-o format] [-f from] [-t to] " @@ -139,13 +141,19 @@ static void marcdump_read_xml(yaz_marc_t mt, const char *fname) int r = yaz_marc_read_xml(mt, ptr); if (r) + { + no_errors++; fprintf(stderr, "yaz_marc_read_xml failed\n"); + } else { int write_rc = yaz_marc_write_mode(mt, wrbuf); if (write_rc) - yaz_log(YLOG_WARN, "yaz_marc_write_mode: write error: %d", write_rc); - + { + yaz_log(YLOG_WARN, "yaz_marc_write_mode: " + "write error: %d", write_rc); + no_errors++; + } fputs(wrbuf_cstr(wrbuf), stdout); wrbuf_rewind(wrbuf); } @@ -172,7 +180,10 @@ static void marcdump_read_xml(yaz_marc_t mt, const char *fname) { int r = yaz_marc_read_xml(mt, ptr); if (r) + { + no_errors++; fprintf(stderr, "yaz_marc_read_xml failed\n"); + } else { yaz_marc_write_mode(mt, wrbuf); @@ -259,23 +270,27 @@ static void dump(const char *fname, const char *from, const char *to, r = fread(buf, 1, 5, inf); if (r < 5) { - if (r && print_offset && verbose) + if (r == 0) /* normal EOF, all good */ + break; + if (print_offset && verbose) + { printf("\n", (long) r); + } break; } while (*buf < '0' || *buf > '9') { int i; long off = ftell(inf) - 5; - if (verbose || print_offset) - printf("\n", - *buf & 0xff, *buf & 0xff, - off, off); + printf("\n", + *buf & 0xff, *buf & 0xff, + off, off); for (i = 0; i<4; i++) buf[i] = buf[i+1]; r = fread(buf+4, 1, 1, inf); + no_errors++; if (r < 1) break; } @@ -295,23 +310,39 @@ static void dump(const char *fname, const char *from, const char *to, if (len < 25 || len > 100000) { long off = ftell(inf) - 5; - printf("Bad Length %ld read at offset %ld (%lx)\n", + printf("\n", (long)len, (long) off, (long) off); + no_errors++; break; } rlen = len - 5; r = fread(buf + 5, 1, rlen, inf); if (r < rlen) + { + long off = ftell(inf); + printf("\n", + (long) off, (long) off); + no_errors++; break; + } while (buf[len-1] != ISO2709_RS) { if (len > sizeof(buf)-2) + { + r = 0; break; + } r = fread(buf + len, 1, 1, inf); if (r != 1) break; len++; } + if (r < 1) + { + printf("\n"); + no_errors++; + break; + } if (split_fname) { char fname[256]; @@ -338,17 +369,21 @@ static void dump(const char *fname, const char *from, const char *to, fprintf(stderr, "Could write content to %s\n", fname); split_fname = 0; + no_errors++; } fclose(sf); } } len_result = rlen; r = yaz_marc_decode_buf(mt, buf, -1, &result, &len_result); + if (r == -1) + no_errors++; if (r > 0 && result && len_result) { if (fwrite(result, len_result, 1, stdout) != 1) { fprintf(stderr, "Write to stdout failed\n"); + no_errors++; break; } } @@ -534,6 +569,8 @@ int main (int argc, char **argv) usage(prog); exit(1); } + if (no_errors) + exit(5); exit(0); } /* -- 1.7.10.4