diff options
-rw-r--r-- | src/Makefile.am | 10 | ||||
-rw-r--r-- | src/binlogcat.c | 34 | ||||
-rw-r--r-- | src/err.c | 62 | ||||
-rw-r--r-- | src/err.h | 21 | ||||
-rw-r--r-- | tests/.gitignore | 1 | ||||
-rw-r--r-- | tests/Makefile.am | 7 | ||||
-rw-r--r-- | tests/binpack.c | 86 |
7 files changed, 187 insertions, 34 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 9ce519f..4e31e89 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -18,5 +18,9 @@ AM_CPPFLAGS = -I$(VARNISHSRC)/include -I$(VARNISHSRC) +noinst_LIBRARIES = libbinlog.a +libbinlog_a_SOURCES = pack.c err.c +libbinlog_a_CFLAGS = $(AM_CFLAGS) + bin_PROGRAMS = binlogcat -binlogcat_SOURCES = binlogcat.c pack.c -binlogcat_CFLAGS = $(AM_CFLAGS) +binlogcat_SOURCES = binlogcat.c +binlogcat_LDADD = ./libbinlog.a @@ -34,3 +38,3 @@ libvmod_binlog_la_SOURCES = \ -noinst_HEADERS = pack.h +noinst_HEADERS = pack.h err.h diff --git a/src/binlogcat.c b/src/binlogcat.c index 8cdfaaa..bdeb992 100644 --- a/src/binlogcat.c +++ b/src/binlogcat.c @@ -28,4 +28,4 @@ #include "pack.h" +#include "err.h" -char *progname; char *timefmt = "%c"; @@ -36,30 +36,2 @@ int timediff_option; void -verror(const char *fmt, va_list ap) -{ - fprintf(stderr, "%s: ", progname); - vfprintf(stderr, fmt, ap); - fputc('\n', stderr); -} - -void -error(const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - verror(fmt, ap); - va_end(ap); -} - -void -packerror(const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - verror(fmt, ap); - va_end(ap); -} - -void catlog(const char *fname) @@ -100,3 +72,3 @@ catlog(const char *fname) if (header.version != BINLOG_VERSION) { - error("%s: unknown version", progname, fname); + error("%s: unknown version", fname); exit(1); @@ -178,5 +150,5 @@ main(int argc, char **argv) { - progname = argv[0]; int c; + setprogname(argv[0]); while ((c = getopt(argc, argv, "dht:nv")) != EOF) diff --git a/src/err.c b/src/err.c new file mode 100644 index 0000000..73aaba7 --- /dev/null +++ b/src/err.c @@ -0,0 +1,62 @@ +/* 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 <stdio.h> +#include <stdarg.h> +#include <string.h> +#include "err.h" + +const char *progname; + +void +setprogname(const char *arg) +{ + char *p = strrchr(arg, '/'); + if (p) + progname = p + 1; + else + progname = arg; +} + +void +verror(const char *fmt, va_list ap) +{ + fprintf(stderr, "%s: ", progname); + vfprintf(stderr, fmt, ap); + fputc('\n', stderr); +} + +void +error(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + verror(fmt, ap); + va_end(ap); +} + +void +packerror(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + verror(fmt, ap); + va_end(ap); +} + diff --git a/src/err.h b/src/err.h new file mode 100644 index 0000000..69139fd --- /dev/null +++ b/src/err.h @@ -0,0 +1,21 @@ +/* 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/>. +*/ +extern const char *progname; + +void setprogname(const char *); +void error(const char *fmt, ...); +void packerror(const char *fmt, ...); diff --git a/tests/.gitignore b/tests/.gitignore index 93f8f46..f689f0d 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -2,2 +2,3 @@ atconfig atlocal +binpack package.m4 diff --git a/tests/Makefile.am b/tests/Makefile.am index 7f24aeb..4e3bc7b 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -67,2 +67,9 @@ check-local: atconfig atlocal $(TESTSUITE) +check_PROGRAMS = binpack +binpack_SOURCES = binpack.c +binpack_LDADD = ../src/libbinlog.a + +binpack_CFLAGS = $(AM_CFLAGS) + +AM_CPPFLAGS = -I$(top_srcdir)/src diff --git a/tests/binpack.c b/tests/binpack.c new file mode 100644 index 0000000..b54ed80 --- /dev/null +++ b/tests/binpack.c @@ -0,0 +1,86 @@ +/* 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 <unistd.h> +#include <stdlib.h> +#include <stdio.h> +#include <stdarg.h> +#include "pack.h" +#include "err.h" + +int +main(int argc, char **argv) +{ + enum { mode_packin, mode_packout } mode = mode_packin; + struct packinst *pi; + struct packenv *env; + char *end; + int c; + + setprogname(argv[0]); + + while ((c = getopt(argc, argv, "d")) != EOF) { + switch (c) { + case 'd': + mode = mode_packout; + break; + default: + exit(1); + } + } + + argc -= optind; + argv += optind; + + if (argc == 0) { + error("not enough arguments"); + exit(1); + } + + pi = packcomp(argv[0], &end); + if (!pi) { + error("out of memory"); + abort(); + } + if (*end) { + error("compile error near %s", end); + exit(1); + } + env = packenv_create(packsize(pi)); + if (!env) { + error("out of memory"); + abort(); + } + + switch (mode) { + case mode_packin: + env->argv = argv + 1; + env->argc = argc - 1; + packin(pi, env); + fwrite(env->buf_base, env->buf_size, 1, stdout); + break; + + case mode_packout: + env->fp = stdout; + fread(env->buf_base, env->buf_size, 1, stdin); + packout(pi, env); + fputc('\n', stdout); + break; + } + + packenv_free(env); + packfree(pi); +} |