From df83b714395d41b096f7ad8cc3a090c9341f7598 Mon Sep 17 00:00:00 2001 From: Sergey Poznyakoff Date: Fri, 11 Oct 2013 00:12:43 +0300 Subject: Initial commit --- src/binlogcat.c | 134 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 src/binlogcat.c (limited to 'src/binlogcat.c') diff --git a/src/binlogcat.c b/src/binlogcat.c new file mode 100644 index 0000000..c51125b --- /dev/null +++ b/src/binlogcat.c @@ -0,0 +1,134 @@ +/* This file is part of vmod-binlog + Copyright (C) 2013 Sergey Poznyakoff + + Vmod-binlog is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + Vmod-binlog is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with vmod-binlog. If not, see . +*/ + +#include +#include +#include +#include +#include +#include +#include +#include "vmod-binlog.h" + +char *progname; +char *timefmt = "%c"; +int number_option; +int verbose_option; + +void +catlog(const char *fname) +{ + FILE *fp; + union binlog_header header; + struct binlog_record rec; + char timebuf[128]; + size_t i; + + if (strcmp(fname, "-") == 0) + fp = stdin; + else { + fp = fopen(fname, "r"); + if (!fp) { + fprintf(stderr, "%s: cannot open %s: %s\n", + progname, fname, strerror(errno)); + exit(1); + } + } + + if (fread(&header, sizeof(header), 1, fp) != 1) { + fprintf(stderr, "%s: error reading header of %s: %s\n", + progname, fname, strerror(errno)); + exit(1); + } + + if (memcmp(header.hdr.magic, BINLOG_MAGIC_STR, BINLOG_MAGIC_LEN)) { + fprintf(stderr, "%s: %s is not a binlog file\n", + progname, fname); + exit(1); + } + + if (header.hdr.version != BINLOG_VERSION) { + fprintf(stderr, "%s: %s: unknown version\n", + progname, fname); + exit(1); + } + + if (header.hdr.recsize != sizeof(struct binlog_record)) { + fprintf(stderr, "%s: %s: record length mismatch\n", + progname, fname); + exit(1); + } + + if (verbose_option) + printf("# %s; %lu records\n", fname, header.hdr.recnum); + + for (i = 0; i < header.hdr.recnum; i++) { + if (fread(&rec, sizeof(rec), 1, fp) != 1) { + fprintf(stderr, "%s: %s: unexpected eof\n", + progname, fname); + break; + } + + 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); + } + + fclose(fp); +} + +void +help() +{ + printf("usage: %s [-hnv] [t FORMAT] [FILE...]\n"); +} + +int +main(int argc, char **argv) +{ + progname = argv[0]; + int c; + + while ((c = getopt(argc, argv, "ht:nv")) != EOF) + switch (c) { + case 'h': + help(); + return 0; + case 't': + timefmt = optarg; + break; + case 'n': + number_option = 1; + break; + case 'v': + verbose_option = 1; + break; + default: + exit(1); + } + + argc -= optind; + argv += optind; + + if (argc == 0) + catlog("-"); + else while (argc--) + catlog(*(argv++)); + return 0; +} + -- cgit v1.2.1