diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2013-10-11 00:12:43 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2013-10-11 12:22:57 +0300 |
commit | df83b714395d41b096f7ad8cc3a090c9341f7598 (patch) | |
tree | 1c3bcc412e633d3fc678e2cc083ea947e5dcd8e8 /src/binlogcat.c | |
download | vmod-binlog-df83b714395d41b096f7ad8cc3a090c9341f7598.tar.gz vmod-binlog-df83b714395d41b096f7ad8cc3a090c9341f7598.tar.bz2 |
Initial commit
Diffstat (limited to 'src/binlogcat.c')
-rw-r--r-- | src/binlogcat.c | 134 |
1 files changed, 134 insertions, 0 deletions
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 <http://www.gnu.org/licenses/>. +*/ + +#include <config.h> +#include <unistd.h> +#include <stdio.h> +#include <stdlib.h> +#include <errno.h> +#include <time.h> +#include <string.h> +#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; +} + |