diff options
author | Rainer Gerhards <rgerhards@adiscon.com> | 2013-03-23 14:59:50 +0100 |
---|---|---|
committer | Rainer Gerhards <rgerhards@adiscon.com> | 2013-03-23 14:59:50 +0100 |
commit | 0b77585a10062117d1904c8c08db1fc4520ab16d (patch) | |
tree | 0e921ff64f29700f2682511558ffa43f1ed1bf60 /tools/rsgtutil.c | |
parent | c77a77a6c7919d17936e6ba2f71b0903cac9c890 (diff) | |
download | rsyslog-0b77585a10062117d1904c8c08db1fc4520ab16d.tar.gz rsyslog-0b77585a10062117d1904c8c08db1fc4520ab16d.tar.bz2 rsyslog-0b77585a10062117d1904c8c08db1fc4520ab16d.zip |
rsgtutil: basic plumbing for extend mode
does not contain actual implementation
Diffstat (limited to 'tools/rsgtutil.c')
-rw-r--r-- | tools/rsgtutil.c | 39 |
1 files changed, 33 insertions, 6 deletions
diff --git a/tools/rsgtutil.c b/tools/rsgtutil.c index c78671c7..f65c46fd 100644 --- a/tools/rsgtutil.c +++ b/tools/rsgtutil.c @@ -35,7 +35,7 @@ typedef unsigned char uchar; static enum { MD_DUMP, MD_DETECT_FILE_TYPE, MD_SHOW_SIGBLK_PARAMS, - MD_VERIFY + MD_VERIFY, MD_EXTEND } mode = MD_DUMP; static int verbose = 0; @@ -155,7 +155,12 @@ doVerifyRec(FILE *logfp, FILE *sigfp, block_sig_t *bs, gtfile gf, gterrctx_t *ec char rec[128*1024]; if(fgets(rec, sizeof(rec), logfp) == NULL) { - r = feof(logfp) ? RSGTE_EOF : RSGTE_IO; + if(feof(logfp)) { + r = RSGTE_EOF; + } else { + perror("log file input"); + r = RSGTE_IO; + } goto done; } lenRec = strlen(rec); @@ -176,21 +181,27 @@ done: return r; } -/* note: here we need to have the LOG file name, not signature! */ +/* We handle both verify and extend with the same function as they + * are very similiar. + * + * note: here we need to have the LOG file name, not signature! + */ static void verify(char *name) { - FILE *logfp = NULL, *sigfp = NULL; + FILE *logfp = NULL, *sigfp = NULL, *nsigfp = NULL; block_sig_t *bs = NULL; gtfile gf; uint8_t bHasRecHashes, bHasIntermedHashes; uint8_t bInBlock; int r = 0; char sigfname[4096]; + char nsigfname[4096]; gterrctx_t ectx; if(!strcmp(name, "-")) { - fprintf(stderr, "verify mode cannot work on stdin\n"); + fprintf(stderr, "%s mode cannot work on stdin\n", + mode == MD_VERIFY ? "verify" : "extend"); goto err; } else { snprintf(sigfname, sizeof(sigfname), "%s.gtsig", name); @@ -200,9 +211,17 @@ verify(char *name) goto err; } if((sigfp = fopen(sigfname, "r")) == NULL) { - perror(name); + perror(sigfname); goto err; } + if(mode == MD_EXTEND) { + snprintf(nsigfname, sizeof(nsigfname), "%s.gtsig.new", name); + nsigfname[sizeof(nsigfname)-1] = '\0'; + if((nsigfp = fopen(nsigfname, "w")) == NULL) { + perror(nsigfname); + goto err; + } + } } rsgtInit("rsyslog rsgtutil " VERSION); @@ -245,6 +264,7 @@ verify(char *name) fclose(logfp); fclose(sigfp); + fclose(nsigfp); rsgtExit(); rsgt_errctxExit(&ectx); return; @@ -253,6 +273,8 @@ err: fclose(logfp); if(sigfp != NULL) fclose(sigfp); + if(nsigfp != NULL) + fclose(nsigfp); if(r != RSGTE_EOF) fprintf(stderr, "error %d processing file %s\n", r, name); rsgtExit(); @@ -273,6 +295,7 @@ processFile(char *name) showSigblkParams(name); break; case MD_VERIFY: + case MD_EXTEND: verify(name); break; } @@ -287,6 +310,7 @@ static struct option long_options[] = {"detect-file-type", no_argument, NULL, 'T'}, {"show-sigblock-params", no_argument, NULL, 'B'}, {"verify", no_argument, NULL, 't'}, /* 't' as in "test signatures" */ + {"extend", no_argument, NULL, 'e'}, {"publications-server", optional_argument, NULL, 'P'}, {"show-verified", no_argument, NULL, 's'}, {NULL, 0, NULL, 0} @@ -327,6 +351,9 @@ main(int argc, char *argv[]) case 't': mode = MD_VERIFY; break; + case 'e': + mode = MD_EXTEND; + break; case '?': break; default:fprintf(stderr, "getopt_long() returns unknown value %d\n", opt); |