Commit b5fa8c5f authored by Martin Blix Grydeland's avatar Martin Blix Grydeland

Move all output handling from VUT to the individual utilities.

parent fed96be0
......@@ -49,9 +49,20 @@
#include "vsb.h"
#include "vtim.h"
#include "vut.h"
#include "miniobj.h"
static const char progname[] = "varnishlog";
struct log {
/* Options */
int a_opt;
int B_opt;
char *w_arg;
/* State */
FILE *fo;
} LOG;
static void
usage(int status)
{
......@@ -63,17 +74,68 @@ usage(int status)
exit(status);
}
static void
openout(int append)
{
AN(LOG.w_arg);
if (LOG.B_opt)
LOG.fo = VSL_WriteOpen(VUT.vsl, LOG.w_arg, append, VUT.u_opt);
else
LOG.fo = fopen(LOG.w_arg, append ? "a" : "w");
if (LOG.fo == NULL)
VUT_Error(1, "Can't open output file (%s)",
LOG.B_opt ? VSL_Error(VUT.vsl) : strerror(errno));
VUT.dispatch_priv = LOG.fo;
}
static int __match_proto__(VUT_cb_f)
rotateout(void)
{
AN(LOG.w_arg);
AN(LOG.fo);
fclose(LOG.fo);
openout(0);
AN(LOG.fo);
return (0);
}
static int __match_proto__(VUT_cb_f)
flushout(void)
{
AN(LOG.fo);
if (fflush(LOG.fo))
return (-5);
return (0);
}
int
main(int argc, char * const *argv)
{
char opt;
memset(&LOG, 0, sizeof LOG);
VUT_Init(progname);
while ((opt = getopt(argc, argv, vopt_optstring)) != -1) {
switch (opt) {
case 'a':
/* Append to file */
LOG.a_opt = 1;
break;
case 'B':
/* Binary output */
LOG.B_opt = 1;
break;
case 'h':
/* Usage help */
usage(0);
case 'w':
/* Write to file */
REPLACE(LOG.w_arg, optarg);
break;
default:
if (!VUT_Arg(opt, optarg))
usage(1);
......@@ -83,9 +145,24 @@ main(int argc, char * const *argv)
if (optind != argc)
usage(1);
/* Setup output */
if (LOG.B_opt)
VUT.dispatch_f = &VSL_WriteTransactions;
else
VUT.dispatch_f = &VSL_PrintTransactions;
if (LOG.w_arg) {
openout(LOG.a_opt);
AN(LOG.fo);
VUT.sighup_f = &rotateout;
} else
LOG.fo = stdout;
VUT.idle_f = &flushout;
VUT_Setup();
VUT_Main(NULL, NULL);
VUT_Main();
VUT_Fini();
(void)flushout();
exit(0);
}
......@@ -30,8 +30,28 @@
#include "vapi/vapi_options.h"
#include "vut_options.h"
VUT_OPT_a
#define LOG_OPT_a \
VOPT("a", "[-a]", "Append to file", \
"When writing output to a file, append to it rather than" \
" overwrite it." \
)
#define LOG_OPT_B \
VOPT("B", "[-B]", "Binary output", \
"Output binary data suitable for reading with -r." \
)
#define LOG_OPT_w \
VOPT("w:", "[-w filename]", "Output filename", \
"Redirect output to file. The file will be overwritten" \
" unless the -a option was specified. If the application" \
" receives a SIGHUP the file will be reopened allowing" \
" the old one to be rotated away." \
)
LOG_OPT_a
VSL_OPT_b
LOG_OPT_B
VSL_OPT_c
VSL_OPT_C
VUT_OPT_d
......@@ -50,6 +70,6 @@ VSL_OPT_T
VUT_OPT_u
VSL_OPT_v
VUT_OPT_V
VUT_OPT_w
LOG_OPT_w
VSL_OPT_x
VSL_OPT_X
......@@ -31,11 +31,12 @@
#include "vdef.h"
typedef int VUT_cb_f(void);
struct VUT {
const char *progname;
/* Options */
int a_opt;
int d_opt;
int D_opt;
int g_arg;
......@@ -43,17 +44,21 @@ struct VUT {
char *q_arg;
char *r_arg;
int u_opt;
char *w_arg;
/* State */
struct VSL_data *vsl;
struct VSM_data *vsm;
struct VSLQ *vslq;
FILE *fo;
struct vpf_fh *pfh;
int sighup;
int sigint;
int sigusr1;
/* Callback functions */
VUT_cb_f *idle_f;
VUT_cb_f *sighup_f;
VSLQ_dispatch_f *dispatch_f;
void *dispatch_priv;
};
extern struct VUT VUT;
......@@ -71,4 +76,4 @@ void VUT_Init(const char *progname);
void VUT_Fini(void);
int VUT_Main(VSLQ_dispatch_f *func, void *priv);
int VUT_Main(void);
......@@ -29,12 +29,6 @@
/* VUT options */
#define VUT_OPT_a \
VOPT("a", "[-a]", "Append binary file output", \
"When writing binary output to a file, append to it rather" \
" than overwrite it." \
)
#define VUT_OPT_d \
VOPT("d", "[-d]", "Process old log entries on startup", \
"Start processing log records at the head of the log" \
......@@ -93,12 +87,3 @@
VOPT("V", "[-V]", "Version", \
"Print version information and exit." \
)
#define VUT_OPT_w \
VOPT("w:", "[-w filename]", "Binary output filename", \
"Write log entries to this file instead of displaying" \
" them. The file will be overwritten unless the -a option" \
" was specified. If the application receives a SIGHUP" \
" while writing to a file, it will reopen the file" \
" allowing the old one to be rotated away." \
)
......@@ -116,10 +116,6 @@ VUT_Arg(int opt, const char *arg)
int i;
switch (opt) {
case 'a':
/* Binary file append */
VUT.a_opt = 1;
return (1);
case 'd':
/* Head */
VUT.d_opt = 1;
......@@ -168,10 +164,6 @@ VUT_Arg(int opt, const char *arg)
/* Print version number and exit */
VCS_Message(VUT.progname);
exit(1);
case 'w':
/* Binary file output */
REPLACE(VUT.w_arg, arg);
return (1);
default:
AN(VUT.vsl);
i = VSL_Arg(VUT.vsl, opt, arg);
......@@ -218,16 +210,6 @@ VUT_Setup(void)
if (c == NULL)
VUT_Error(1, "Can't open log (%s)", VSL_Error(VUT.vsl));
/* Output */
if (VUT.w_arg) {
VUT.fo = VSL_WriteOpen(VUT.vsl, VUT.w_arg, VUT.a_opt,
VUT.u_opt);
if (VUT.fo == NULL)
VUT_Error(1, "Can't open output file (%s)",
VSL_Error(VUT.vsl));
} else
VUT.fo = stdout;
/* Create query */
VUT.vslq = VSLQ_New(VUT.vsl, &c, VUT.g_arg, VUT.q_arg);
if (VUT.vslq == NULL)
......@@ -265,9 +247,6 @@ VUT_Fini(void)
free(VUT.r_arg);
free(VUT.P_arg);
if (VUT.fo != NULL)
fflush(VUT.fo);
vut_vpf_remove();
AZ(VUT.pfh);
......@@ -282,40 +261,28 @@ VUT_Fini(void)
}
int
VUT_Main(VSLQ_dispatch_f *func, void *priv)
VUT_Main(void)
{
struct VSL_cursor *c;
int i = -1;
AN(VUT.vslq);
if (func == NULL) {
if (VUT.w_arg)
func = VSL_WriteTransactions;
else
func = VSL_PrintTransactions;
AN(VUT.fo);
priv = VUT.fo;
}
while (!VUT.sigint) {
if (VUT.w_arg && VUT.sighup) {
/* Rotate log */
if (VUT.sighup && VUT.sighup_f) {
/* sighup callback */
VUT.sighup = 0;
AN(VUT.fo);
fclose(VUT.fo);
VUT.fo = VSL_WriteOpen(VUT.vsl, VUT.w_arg, 0,
VUT.u_opt);
if (VUT.fo == NULL)
VUT_Error(1, "Can't open output file (%s)",
VSL_Error(VUT.vsl));
i = (VUT.sighup_f)();
if (i)
break;
}
if (VUT.sigusr1) {
/* Flush and report any incomplete records */
VUT.sigusr1 = 0;
if (VUT.vslq != NULL)
VSLQ_Flush(VUT.vslq, func, priv);
VSLQ_Flush(VUT.vslq, VUT.dispatch_f,
VUT.dispatch_priv);
}
if (VUT.vslq == NULL) {
......@@ -340,14 +307,17 @@ VUT_Main(VSLQ_dispatch_f *func, void *priv)
VUT_Error(0, "Log reaquired");
}
i = VSLQ_Dispatch(VUT.vslq, func, priv);
i = VSLQ_Dispatch(VUT.vslq, VUT.dispatch_f, VUT.dispatch_priv);
if (i == 1)
/* Call again */
continue;
else if (i == 0) {
/* Nothing to do but wait */
if (VUT.fo)
fflush(VUT.fo);
if (VUT.idle_f) {
i = (VUT.idle_f)();
if (i)
break;
}
VTIM_sleep(0.01);
continue;
} else if (i == -1) {
......@@ -360,7 +330,7 @@ VUT_Main(VSLQ_dispatch_f *func, void *priv)
/* XXX: Make continuation optional */
VSLQ_Flush(VUT.vslq, func, priv);
VSLQ_Flush(VUT.vslq, VUT.dispatch_f, VUT.dispatch_priv);
VSLQ_Delete(&VUT.vslq);
AZ(VUT.vslq);
......@@ -374,8 +344,5 @@ VUT_Main(VSLQ_dispatch_f *func, void *priv)
}
}
if (VUT.fo)
fflush(VUT.fo);
return (i);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment