diff options
Diffstat (limited to 'src/binlogcat.c')
-rw-r--r-- | src/binlogcat.c | 71 |
1 files changed, 57 insertions, 14 deletions
diff --git a/src/binlogcat.c b/src/binlogcat.c index 219f78c..ee8837a 100644 --- a/src/binlogcat.c +++ b/src/binlogcat.c @@ -19,2 +19,3 @@ #include <unistd.h> +#include <stddef.h> #include <stdio.h> @@ -25,2 +26,3 @@ #include "vmod-binlog.h" +#include "pack.h" @@ -36,4 +38,4 @@ catlog(const char *fname) FILE *fp; - union binlog_header header; - struct binlog_record rec; + struct binlog_file_header header; + struct binlog_record *rec; char timebuf[128]; @@ -41,2 +43,7 @@ catlog(const char *fname) time_t start_ts; + char *dataspec; + size_t size; + struct packenv *env; + struct packinst *inst; + char *p; @@ -59,3 +66,3 @@ catlog(const char *fname) - if (memcmp(header.hdr.magic, BINLOG_MAGIC_STR, BINLOG_MAGIC_LEN)) { + if (memcmp(header.magic, BINLOG_MAGIC_STR, BINLOG_MAGIC_LEN)) { fprintf(stderr, "%s: %s is not a binlog file\n", @@ -65,3 +72,3 @@ catlog(const char *fname) - if (header.hdr.version != BINLOG_VERSION) { + if (header.version != BINLOG_VERSION) { fprintf(stderr, "%s: %s: unknown version\n", @@ -71,5 +78,12 @@ catlog(const char *fname) - if (header.hdr.recsize != sizeof(struct binlog_record)) { - fprintf(stderr, "%s: %s: record length mismatch\n", - progname, fname); + size = header.hdrsize - sizeof(header); + dataspec = malloc(size); + if (!dataspec) { + fprintf(stderr, "%s: not enough memory", progname); + abort(); + } + + if (fread(dataspec, size, 1, fp) != 1) { + fprintf(stderr, "%s: error reading header of %s: %s\n", + progname, fname, strerror(errno)); exit(1); @@ -78,6 +92,24 @@ catlog(const char *fname) if (verbose_option) - printf("# %s; %lu records\n", fname, header.hdr.recnum); + printf("# %s; format=%s; recsize=%lu; recnum=%lu\n", + fname, dataspec, header.recsize, header.recnum); - for (i = 0; i < header.hdr.recnum; i++) { - if (fread(&rec, sizeof(rec), 1, fp) != 1) { + inst = packcomp(dataspec, &p); + if (*p) { + fprintf(stderr, "%s: %s: bad dataspec near %s", + progname, dataspec, p); + exit(1); + } + free(dataspec); + + rec = malloc(header.recsize); + if (!rec) { + fprintf(stderr, "%s: not enough memory", progname); + abort(); + } + env = packenv_create(header.recsize - + offsetof(struct binlog_record,data)); + env->fp = stdout; + + for (i = 0; i < header.recnum; i++) { + if (fread(rec, header.recsize, 1, fp) != 1) { fprintf(stderr, "%s: %s: unexpected eof\n", @@ -89,12 +121,23 @@ catlog(const char *fname) if (i == 0) - start_ts = rec.ts; - rec.ts -= start_ts; + start_ts = rec->ts; + rec->ts -= start_ts; } - strftime(timebuf, sizeof timebuf, timefmt, localtime(&rec.ts)); + strftime(timebuf, sizeof timebuf, timefmt, + localtime(&rec->ts)); if (number_option) printf("%lu ", (unsigned long) i); - printf("%s %ld %ld\n", timebuf, rec.nid, rec.aid); + printf("%s ", timebuf); + + memcpy(env->buf_base, rec->data, env->buf_size); + env->buf_pos = 0; + + packout(inst, env); + fputc('\n', stdout); } + free(rec); + packenv_free(env); + packfree(inst); + fclose(fp); |