Commit 36520f2d authored by Dridi Boukelmoune's avatar Dridi Boukelmoune

Remove the global VUT symbol

parent 28b91058
......@@ -57,6 +57,8 @@
#define HIST_N 2000 /* how far back we remember */
#define HIST_RES 100 /* bucket resolution */
static struct VUT *vut;
static int hist_low;
static int hist_high;
static int hist_range;
......@@ -368,7 +370,7 @@ accumulate(struct VSL_data *vsl, struct VSL_transaction * const pt[],
static int __match_proto__(VUT_cb_f)
sighup(struct VUT *v)
{
assert(v == &VUT);
assert(v == vut);
quit = 1;
return (1);
}
......@@ -470,7 +472,7 @@ usage(int status)
{
const char **opt;
fprintf(stderr, "Usage: %s <options>\n\n", VUT.progname);
fprintf(stderr, "Usage: %s <options>\n\n", vut->progname);
fprintf(stderr, "Options:\n");
for (opt = vopt_spec.vopt_usage; *opt != NULL; opt += 2)
fprintf(stderr, " %-25s %s\n", *opt, *(opt + 1));
......@@ -488,7 +490,7 @@ profile_error(const char *s)
static void
vut_sighandler(int sig)
{
VUT_Signaled(&VUT, sig);
VUT_Signaled(vut, sig);
}
int
......@@ -502,7 +504,8 @@ main(int argc, char **argv)
struct profile cli_p = {0};
cli_p.name = 0;
VUT_InitProg(argc, argv, &vopt_spec);
vut = VUT_InitProg(argc, argv, &vopt_spec);
AN(vut);
AZ(pthread_cond_init(&timebend_cv, NULL));
while ((i = getopt(argc, argv, vopt_spec.vopt_optstring)) != -1) {
......@@ -565,7 +568,7 @@ main(int argc, char **argv)
" (invalid factor '%s')", optarg);
break;
default:
if (!VUT_Arg(i, optarg))
if (!VUT_Arg(vut, i, optarg))
usage(1);
}
}
......@@ -574,11 +577,11 @@ main(int argc, char **argv)
usage(1);
/* Check for valid grouping mode */
assert(VUT.g_arg < VSL_g__MAX);
if (VUT.g_arg != VSL_g_vxid && VUT.g_arg != VSL_g_request)
assert(vut->g_arg < VSL_g__MAX);
if (vut->g_arg != VSL_g_vxid && vut->g_arg != VSL_g_request)
VUT_Error(1, "Invalid grouping mode: %s"
" (only vxid and request are supported)",
VSLQ_grouping[VUT.g_arg]);
VSLQ_grouping[vut->g_arg]);
if (profile) {
for (active_profile = profiles; active_profile->name;
......@@ -593,7 +596,7 @@ main(int argc, char **argv)
assert(active_profile->VSL_arg == 'b' ||
active_profile->VSL_arg == 'c');
assert(VUT_Arg(active_profile->VSL_arg, NULL));
assert(VUT_Arg(vut, active_profile->VSL_arg, NULL));
match_tag = active_profile->tag;
fnum = active_profile->field;
hist_low = active_profile->hist_low;
......@@ -616,16 +619,16 @@ main(int argc, char **argv)
log_ten = log(10.0);
VUT_Signal(vut_sighandler);
VUT_Setup();
ident = VSM_Dup(VUT.vsm, "Arg", "-i");
VUT_Setup(vut);
ident = VSM_Dup(vut->vsm, "Arg", "-i");
if (pthread_create(&thr, NULL, do_curses, NULL) != 0)
VUT_Error(1, "pthread_create(): %s", strerror(errno));
VUT.dispatch_f = accumulate;
VUT.dispatch_priv = NULL;
VUT.sighup_f = sighup;
VUT_Main();
vut->dispatch_f = accumulate;
vut->dispatch_priv = NULL;
vut->sighup_f = sighup;
VUT_Main(vut);
end_of_file = 1;
AZ(pthread_join(thr, NULL));
VUT_Fini();
VUT_Fini(&vut);
exit(0);
}
......@@ -50,6 +50,8 @@
#include "vut.h"
#include "miniobj.h"
static struct VUT *vut;
static struct log {
/* Options */
int a_opt;
......@@ -64,7 +66,7 @@ static void __attribute__((__noreturn__))
usage(int status)
{
const char **opt;
fprintf(stderr, "Usage: %s <options>\n\n", VUT.progname);
fprintf(stderr, "Usage: %s <options>\n\n", vut->progname);
fprintf(stderr, "Options:\n");
for (opt = vopt_spec.vopt_usage; *opt != NULL; opt += 2)
fprintf(stderr, " %-25s %s\n", *opt, *(opt + 1));
......@@ -79,18 +81,18 @@ openout(int append)
if (LOG.A_opt)
LOG.fo = fopen(LOG.w_arg, append ? "a" : "w");
else
LOG.fo = VSL_WriteOpen(VUT.vsl, LOG.w_arg, append, 0);
LOG.fo = VSL_WriteOpen(vut->vsl, LOG.w_arg, append, 0);
if (LOG.fo == NULL)
VUT_Error(2, "Cannot open output file (%s)",
LOG.A_opt ? strerror(errno) : VSL_Error(VUT.vsl));
VUT.dispatch_priv = LOG.fo;
LOG.A_opt ? strerror(errno) : VSL_Error(vut->vsl));
vut->dispatch_priv = LOG.fo;
}
static int __match_proto__(VUT_cb_f)
rotateout(struct VUT *v)
{
assert(v == &VUT);
assert(v == vut);
AN(LOG.w_arg);
AN(LOG.fo);
fclose(LOG.fo);
......@@ -103,8 +105,7 @@ static int __match_proto__(VUT_cb_f)
flushout(struct VUT *v)
{
if (v != NULL)
assert(v == &VUT);
assert(v == vut);
AN(LOG.fo);
if (fflush(LOG.fo))
return (-5);
......@@ -114,14 +115,15 @@ flushout(struct VUT *v)
static int __match_proto__(VUT_cb_f)
sighup(struct VUT *v)
{
assert(v == &VUT);
assert(v == vut);
return (1);
}
static void
vut_sighandler(int sig)
{
VUT_Signaled(&VUT, sig);
AN(vut);
VUT_Signaled(vut, sig);
}
int
......@@ -129,7 +131,8 @@ main(int argc, char * const *argv)
{
int opt;
VUT_InitProg(argc, argv, &vopt_spec);
vut = VUT_InitProg(argc, argv, &vopt_spec);
AN(vut);
memset(&LOG, 0, sizeof LOG);
while ((opt = getopt(argc, argv, vopt_spec.vopt_optstring)) != -1) {
......@@ -150,7 +153,7 @@ main(int argc, char * const *argv)
REPLACE(LOG.w_arg, optarg);
break;
default:
if (!VUT_Arg(opt, optarg))
if (!VUT_Arg(vut, opt, optarg))
usage(1);
}
}
......@@ -158,28 +161,28 @@ main(int argc, char * const *argv)
if (optind != argc)
usage(1);
if (VUT.D_opt && !LOG.w_arg)
if (vut->D_opt && !LOG.w_arg)
VUT_Error(1, "Missing -w option");
/* Setup output */
if (LOG.A_opt || !LOG.w_arg)
VUT.dispatch_f = VSL_PrintTransactions;
vut->dispatch_f = VSL_PrintTransactions;
else
VUT.dispatch_f = VSL_WriteTransactions;
VUT.sighup_f = sighup;
vut->dispatch_f = VSL_WriteTransactions;
vut->sighup_f = sighup;
if (LOG.w_arg) {
openout(LOG.a_opt);
AN(LOG.fo);
if (VUT.D_opt)
VUT.sighup_f = rotateout;
if (vut->D_opt)
vut->sighup_f = rotateout;
} else
LOG.fo = stdout;
VUT.idle_f = flushout;
vut->idle_f = flushout;
VUT_Signal(vut_sighandler);
VUT_Setup();
VUT_Main();
VUT_Fini();
VUT_Setup(vut);
VUT_Main(vut);
VUT_Fini(&vut);
(void)flushout(NULL);
......
......@@ -70,6 +70,8 @@
#define TIME_FMT "[%d/%b/%Y:%T %z]"
#define FORMAT "%h %l %u %t \"%r\" %s %b \"%{Referer}i\" \"%{User-agent}i\""
static struct VUT *vut;
struct format;
enum e_frag {
......@@ -164,7 +166,7 @@ usage(int status)
{
const char **opt;
fprintf(stderr, "Usage: %s <options>\n\n", VUT.progname);
fprintf(stderr, "Usage: %s <options>\n\n", vut->progname);
fprintf(stderr, "Options:\n");
for (opt = vopt_spec.vopt_usage; *opt != NULL; opt += 2)
fprintf(stderr, " %-25s %s\n", *opt, *(opt + 1));
......@@ -186,7 +188,7 @@ static int __match_proto__(VUT_cb_f)
rotateout(struct VUT *v)
{
assert(v == &VUT);
assert(v == vut);
AN(CTX.w_arg);
AN(CTX.fo);
fclose(CTX.fo);
......@@ -199,7 +201,7 @@ static int __match_proto__(VUT_cb_f)
flushout(struct VUT *v)
{
assert(v == &VUT);
assert(v == vut);
AN(CTX.fo);
if (fflush(CTX.fo))
return (-5);
......@@ -1108,14 +1110,15 @@ dispatch_f(struct VSL_data *vsl, struct VSL_transaction * const pt[],
static int __match_proto__(VUT_cb_f)
sighup(struct VUT *v)
{
assert(v == &VUT);
assert(v == vut);
return (1);
}
static void
vut_sighandler(int sig)
{
VUT_Signaled(&VUT, sig);
AN(vut);
VUT_Signaled(vut, sig);
}
static char *
......@@ -1152,7 +1155,8 @@ main(int argc, char * const *argv)
signed char opt;
char *format = NULL;
VUT_InitProg(argc, argv, &vopt_spec);
vut = VUT_InitProg(argc, argv, &vopt_spec);
AN(vut);
memset(&CTX, 0, sizeof CTX);
VTAILQ_INIT(&CTX.format);
VTAILQ_INIT(&CTX.watch_vcl_log);
......@@ -1200,7 +1204,7 @@ main(int argc, char * const *argv)
REPLACE(CTX.w_arg, optarg);
break;
default:
if (!VUT_Arg(opt, optarg))
if (!VUT_Arg(vut, opt, optarg))
usage(1);
}
}
......@@ -1211,14 +1215,14 @@ main(int argc, char * const *argv)
if (optind != argc)
usage(1);
if (VUT.D_opt && !CTX.w_arg)
if (vut->D_opt && !CTX.w_arg)
VUT_Error(1, "Missing -w option");
/* Check for valid grouping mode */
assert(VUT.g_arg < VSL_g__MAX);
if (VUT.g_arg != VSL_g_vxid && VUT.g_arg != VSL_g_request)
assert(vut->g_arg < VSL_g__MAX);
if (vut->g_arg != VSL_g_vxid && vut->g_arg != VSL_g_request)
VUT_Error(1, "Invalid grouping mode: %s",
VSLQ_grouping[VUT.g_arg]);
VSLQ_grouping[vut->g_arg]);
/* Prepare output format */
parse_format(format);
......@@ -1226,22 +1230,22 @@ main(int argc, char * const *argv)
format = NULL;
/* Setup output */
VUT.dispatch_f = dispatch_f;
VUT.dispatch_priv = NULL;
VUT.sighup_f = sighup;
vut->dispatch_f = dispatch_f;
vut->dispatch_priv = NULL;
vut->sighup_f = sighup;
if (CTX.w_arg) {
openout(CTX.a_opt);
AN(CTX.fo);
if (VUT.D_opt)
VUT.sighup_f = rotateout;
if (vut->D_opt)
vut->sighup_f = rotateout;
} else
CTX.fo = stdout;
VUT.idle_f = flushout;
vut->idle_f = flushout;
VUT_Signal(vut_sighandler);
VUT_Setup();
VUT_Main();
VUT_Fini();
VUT_Setup(vut);
VUT_Main(vut);
VUT_Fini(&vut);
exit(0);
}
......@@ -50,6 +50,8 @@
#include "varnishstat.h"
static struct VUT *vut;
/*--------------------------------------------------------------------*/
static int __match_proto__(VSC_iter_f)
......@@ -242,7 +244,7 @@ usage(int status)
{
const char **opt;
fprintf(stderr, "Usage: %s <options>\n\n", VUT.progname);
fprintf(stderr, "Usage: %s <options>\n\n", vut->progname);
fprintf(stderr, "Options:\n");
for (opt = vopt_spec.vopt_usage; *opt != NULL; opt +=2)
fprintf(stderr, " %-25s %s\n", *opt, *(opt + 1));
......@@ -258,7 +260,8 @@ main(int argc, char * const *argv)
int i;
struct vsc *vsc;
VUT_InitProg(argc, argv, &vopt_spec);
vut = VUT_InitProg(argc, argv, &vopt_spec);
AN(vut);
vd = VSM_New();
AN(vd);
vsc = VSC_New();
......@@ -285,7 +288,7 @@ main(int argc, char * const *argv)
AN(VSC_Arg(vsc, opt, optarg));
break;
case 'V':
AN(VUT_Arg(opt, optarg));
AN(VUT_Arg(vut, opt, optarg));
break;
default:
i = VSM_Arg(vd, opt, optarg);
......
......@@ -60,6 +60,8 @@
#define AC(x) x
#endif
static struct VUT *vut;
struct top {
uint8_t tag;
const char *rec_data;
......@@ -180,7 +182,7 @@ accumulate(struct VSL_data *vsl, struct VSL_transaction * const pt[],
static int __match_proto__(VUT_cb_f)
sighup(struct VUT *v)
{
assert(v == &VUT);
assert(v == vut);
quit = 1;
return (1);
}
......@@ -188,7 +190,8 @@ sighup(struct VUT *v)
static void
vut_sighandler(int sig)
{
VUT_Signaled(&VUT, sig);
AN(vut);
VUT_Signaled(vut, sig);
}
static void
......@@ -324,7 +327,7 @@ usage(int status)
{
const char **opt;
fprintf(stderr, "Usage: %s <options>\n\n", VUT.progname);
fprintf(stderr, "Usage: %s <options>\n\n", vut->progname);
fprintf(stderr, "Options:\n");
for (opt = vopt_spec.vopt_usage; *opt != NULL; opt +=2)
fprintf(stderr, " %-25s %s\n", *opt, *(opt + 1));
......@@ -337,12 +340,13 @@ main(int argc, char **argv)
int o, once = 0;
pthread_t thr;
VUT_InitProg(argc, argv, &vopt_spec);
vut = VUT_InitProg(argc, argv, &vopt_spec);
AN(vut);
while ((o = getopt(argc, argv, vopt_spec.vopt_optstring)) != -1) {
switch (o) {
case '1':
AN(VUT_Arg('d', NULL));
AN(VUT_Arg(vut, 'd', NULL));
once = 1;
break;
case 'f':
......@@ -361,7 +365,7 @@ main(int argc, char **argv)
}
break;
default:
if (!VUT_Arg(o, optarg))
if (!VUT_Arg(vut, o, optarg))
usage(1);
}
}
......@@ -370,8 +374,8 @@ main(int argc, char **argv)
usage(1);
VUT_Signal(vut_sighandler);
VUT_Setup();
ident = VSM_Dup(VUT.vsm, "Arg", "-i");
VUT_Setup(vut);
ident = VSM_Dup(vut->vsm, "Arg", "-i");
if (!once) {
if (pthread_create(&thr, NULL, do_curses, NULL) != 0) {
fprintf(stderr, "pthread_create(): %s\n",
......@@ -379,15 +383,15 @@ main(int argc, char **argv)
exit(1);
}
}
VUT.dispatch_f = accumulate;
VUT.dispatch_priv = NULL;
VUT.sighup_f = sighup;
VUT_Main();
vut->dispatch_f = accumulate;
vut->dispatch_priv = NULL;
vut->sighup_f = sighup;
VUT_Main(vut);
end_of_file = 1;
if (once)
dump();
else
pthread_join(thr, NULL);
VUT_Fini();
VUT_Fini(&vut);
exit(0);
}
......@@ -64,22 +64,20 @@ struct VUT {
void *dispatch_priv;
};
extern struct VUT VUT;
//lint -sem(VUT_Error, r_no)
void VUT_Error(int status, const char *fmt, ...)
__v_printflike(2, 3) __attribute__((__noreturn__));
int VUT_Arg(int opt, const char *arg);
int VUT_Arg(struct VUT *, int opt, const char *arg);
#define VUT_InitProg(argc, argv, spec) VUT_Init(argv[0], argc, argv, spec)
void VUT_Init(const char *progname, int argc, char * const *argv,
struct VUT * VUT_Init(const char *progname, int argc, char * const *argv,
const struct vopt_spec *);
void VUT_Signal(VUT_sighandler_f);
void VUT_Signaled(struct VUT *, int);
void VUT_Setup(void);
int VUT_Main(void);
void VUT_Fini(void);
void VUT_Setup(struct VUT *);
int VUT_Main(struct VUT *);
void VUT_Fini(struct VUT **);
......@@ -127,7 +127,6 @@ LIBVARNISHAPI_2.0 {
VTIM_timeval;
# vut.c
VUT;
VUT_Arg;
VUT_Error;
VUT_Fini;
......
......@@ -56,8 +56,6 @@
#include "vapi/voptget.h"
struct VUT VUT;
static int vut_synopsis(const struct vopt_spec *);
static int vut_options(const struct vopt_spec *);
......@@ -86,16 +84,18 @@ static int __match_proto__(VSLQ_dispatch_f)
vut_dispatch(struct VSL_data *vsl, struct VSL_transaction * const trans[],
void *priv)
{
struct VUT *vut;
int i;
(void)priv;
if (VUT.k_arg == 0)
vut = priv;
AN(vut);
if (vut->k_arg == 0)
return (-1); /* End of file */
AN(VUT.dispatch_f);
i = VUT.dispatch_f(vsl, trans, VUT.dispatch_priv);
if (VUT.k_arg > 0)
VUT.k_arg--;
if (i >= 0 && VUT.k_arg == 0)
AN(vut->dispatch_f);
i = vut->dispatch_f(vsl, trans, vut->dispatch_priv);
if (vut->k_arg > 0)
vut->k_arg--;
if (i >= 0 && vut->k_arg == 0)
return (-1); /* End of file */
return (i);
}
......@@ -116,7 +116,7 @@ VUT_Error(int status, const char *fmt, ...)
}
int
VUT_Arg(int opt, const char *arg)
VUT_Arg(struct VUT *vut, int opt, const char *arg)
{
int i;
char *p;
......@@ -124,86 +124,90 @@ VUT_Arg(int opt, const char *arg)
switch (opt) {
case 'd':
/* Head */
VUT.d_opt = 1;
vut->d_opt = 1;
return (1);
case 'D':
/* Daemon mode */
VUT.D_opt = 1;
vut->D_opt = 1;
return (1);
case 'g':
/* Grouping */
AN(arg);
VUT.g_arg = VSLQ_Name2Grouping(arg, -1);
if (VUT.g_arg == -2)
vut->g_arg = VSLQ_Name2Grouping(arg, -1);
if (vut->g_arg == -2)
VUT_Error(1, "Ambiguous grouping type: %s", arg);
else if (VUT.g_arg < 0)
else if (vut->g_arg < 0)
VUT_Error(1, "Unknown grouping type: %s", arg);
return (1);
case 'k':
/* Log transaction limit */
AN(arg);
VUT.k_arg = (int)strtol(arg, &p, 10);
if (*p != '\0' || VUT.k_arg <= 0)
vut->k_arg = (int)strtol(arg, &p, 10);
if (*p != '\0' || vut->k_arg <= 0)
VUT_Error(1, "-k: Invalid number '%s'", arg);
return (1);
case 'n':
/* Varnish instance name */
AN(arg);
REPLACE(VUT.n_arg, arg);
REPLACE(vut->n_arg, arg);
return (1);
case 'P':
/* PID file */
AN(arg);
REPLACE(VUT.P_arg, arg);
REPLACE(vut->P_arg, arg);
return (1);
case 'q':
/* Query to use */
AN(arg);
REPLACE(VUT.q_arg, arg);
REPLACE(vut->q_arg, arg);
return (1);
case 'r':
/* Binary file input */
AN(arg);
REPLACE(VUT.r_arg, arg);
REPLACE(vut->r_arg, arg);
return (1);
case 't':
/* VSM connect timeout */
REPLACE(VUT.t_arg, arg);
REPLACE(vut->t_arg, arg);
return (1);
case 'V':
/* Print version number and exit */
VCS_Message(VUT.progname);
VCS_Message(vut->progname);
exit(0);
default:
AN(VUT.vsl);
i = VSL_Arg(VUT.vsl, opt, arg);
AN(vut->vsl);
i = VSL_Arg(vut->vsl, opt, arg);
if (i < 0)
VUT_Error(1, "%s", VSL_Error(VUT.vsl));
VUT_Error(1, "%s", VSL_Error(vut->vsl));
return (i);
}
}
void
struct VUT *
VUT_Init(const char *progname, int argc, char * const *argv,
const struct vopt_spec *voc)
{
struct VUT *vut;
AN(progname);
AN(argv);
AN(voc);
AZ(VUT.progname);
vut = calloc(1, sizeof *vut);
AN(vut);
if (argc == 2 && !strcmp(argv[1], "--synopsis"))
exit(vut_synopsis(voc));
if (argc == 2 && !strcmp(argv[1], "--options"))
exit(vut_options(voc));
VUT.progname = progname;
VUT.g_arg = VSL_g_vxid;
AZ(VUT.vsl);
VUT.vsl = VSL_New();
AN(VUT.vsl);
VUT.k_arg = -1;
vut->progname = progname;
vut->g_arg = VSL_g_vxid;
AZ(vut->vsl);
vut->vsl = VSL_New();
AN(vut->vsl);
vut->k_arg = -1;
return (vut);
}
void
......@@ -228,59 +232,60 @@ VUT_Signaled(struct VUT *vut, int sig)
}
void
VUT_Setup(void)
VUT_Setup(struct VUT *vut)
{
struct VSL_cursor *c;
AN(VUT.vsl);
AZ(VUT.vsm);
AZ(VUT.vslq);
AN(vut);
AN(vut->vsl);
AZ(vut->vsm);
AZ(vut->vslq);
/* Check input arguments (2 used for bug in FlexeLint) */
if ((VUT.n_arg == NULL ? 0 : 2) +
(VUT.r_arg == NULL ? 0 : 2) > 2)
if ((vut->n_arg == NULL ? 0 : 2) +
(vut->r_arg == NULL ? 0 : 2) > 2)
VUT_Error(1, "Only one of -n and -r options may be used");
/* Create and validate the query expression */
VUT.vslq = VSLQ_New(VUT.vsl, NULL, VUT.g_arg, VUT.q_arg);
if (VUT.vslq == NULL)
vut->vslq = VSLQ_New(vut->vsl, NULL, vut->g_arg, vut->q_arg);
if (vut->vslq == NULL)
VUT_Error(1, "Query expression error:\n%s",
VSL_Error(VUT.vsl));
VSL_Error(vut->vsl));
/* Setup input */
if (VUT.r_arg) {
c = VSL_CursorFile(VUT.vsl, VUT.r_arg, 0);
if (vut->r_arg) {
c = VSL_CursorFile(vut->vsl, vut->r_arg, 0);
if (c == NULL)
VUT_Error(1, "%s", VSL_Error(VUT.vsl));
VSLQ_SetCursor(VUT.vslq, &c);
VUT_Error(1, "%s", VSL_Error(vut->vsl));
VSLQ_SetCursor(vut->vslq, &c);
AZ(c);
} else {
VUT.vsm = VSM_New();
AN(VUT.vsm);
if (VUT.n_arg && VSM_Arg(VUT.vsm, 'n', VUT.n_arg) <= 0)
VUT_Error(1, "%s", VSM_Error(VUT.vsm));
if (VUT.t_arg && VSM_Arg(VUT.vsm, 't', VUT.t_arg) <= 0)
VUT_Error(1, "%s", VSM_Error(VUT.vsm));
if (VSM_Attach(VUT.vsm, STDERR_FILENO))
VUT_Error(1, "VSM: %s", VSM_Error(VUT.vsm));
vut->vsm = VSM_New();
AN(vut->vsm);
if (vut->n_arg && VSM_Arg(vut->vsm, 'n', vut->n_arg) <= 0)
VUT_Error(1, "%s", VSM_Error(vut->vsm));
if (vut->t_arg && VSM_Arg(vut->vsm, 't', vut->t_arg) <= 0)
VUT_Error(1, "%s", VSM_Error(vut->vsm));
if (VSM_Attach(vut->vsm, STDERR_FILENO))
VUT_Error(1, "VSM: %s", VSM_Error(vut->vsm));
// Cursor is handled in VUT_Main()
}
/* Open PID file */
if (VUT.P_arg) {
if (vut->P_arg) {
if (pfh != NULL)
VUT_Error(1, "PID file already created");
pfh = VPF_Open(VUT.P_arg, 0644, NULL);
pfh = VPF_Open(vut->P_arg, 0644, NULL);
if (pfh == NULL)
VUT_Error(1, "%s: %s", VUT.P_arg, strerror(errno));
VUT_Error(1, "%s: %s", vut->P_arg, strerror(errno));
}
/* Daemon mode */
if (VUT.D_opt && vut_daemon() == -1)
if (vut->D_opt && vut_daemon() == -1)
VUT_Error(1, "Daemon mode: %s", strerror(errno));
/* Write PID and setup exit handler */
if (VUT.P_arg) {
if (vut->P_arg) {
AN(pfh);
AZ(VPF_Write(pfh));
AZ(atexit(vut_vpf_remove));
......@@ -288,89 +293,98 @@ VUT_Setup(void)
}
void
VUT_Fini(void)
VUT_Fini(struct VUT **vutp)
{
AN(VUT.progname);
struct VUT *vut;
AN(vutp);
vut = *vutp;
*vutp = NULL;
free(VUT.n_arg);
free(VUT.P_arg);
free(VUT.q_arg);
free(VUT.r_arg);
free(VUT.t_arg);
AN(vut);
AN(vut->progname);
free(vut->n_arg);
free(vut->P_arg);
free(vut->q_arg);
free(vut->r_arg);
free(vut->t_arg);
vut_vpf_remove();
AZ(pfh);
if (VUT.vslq)
VSLQ_Delete(&VUT.vslq);
if (VUT.vsl)
VSL_Delete(VUT.vsl);
if (VUT.vsm)
VSM_Destroy(&VUT.vsm);
if (vut->vslq)
VSLQ_Delete(&vut->vslq);
if (vut->vsl)
VSL_Delete(vut->vsl);
if (vut->vsm)
VSM_Destroy(&vut->vsm);
memset(&VUT, 0, sizeof VUT);
memset(vut, 0, sizeof *vut);
free(vut);
}
int
VUT_Main(void)
VUT_Main(struct VUT *vut)
{
struct VSL_cursor *c;
int i = -1;
int hascursor = -1;
AN(VUT.vslq);
AN(vut);
AN(vut->vslq);
while (!VUT.sigint) {
if (VUT.sighup && VUT.sighup_f) {
while (!vut->sigint) {
if (vut->sighup && vut->sighup_f) {
/* sighup callback */
VUT.sighup = 0;
i = VUT.sighup_f(&VUT);
vut->sighup = 0;
i = vut->sighup_f(vut);
if (i)
break;
}
if (VUT.sigusr1) {
if (vut->sigusr1) {
/* Flush and report any incomplete records */
VUT.sigusr1 = 0;
(void)VSLQ_Flush(VUT.vslq, vut_dispatch, NULL);
vut->sigusr1 = 0;
(void)VSLQ_Flush(vut->vslq, vut_dispatch, vut);
}
// We must repeatedly call VSM_Status() when !hascursor
// to make VSM discover our segment.
if (VUT.vsm != NULL &&
(VSM_Status(VUT.vsm) & VSM_WRK_RESTARTED)) {
if (vut->vsm != NULL &&
(VSM_Status(vut->vsm) & VSM_WRK_RESTARTED)) {
if (hascursor < 1) {
fprintf(stderr, "Log abandonned\n");
VSLQ_SetCursor(VUT.vslq, NULL);
VSLQ_SetCursor(vut->vslq, NULL);
hascursor = 0;
}
}
if (VUT.vsm != NULL && hascursor < 1) {
if (vut->vsm != NULL && hascursor < 1) {
/* Reconnect VSM */
AZ(VUT.r_arg);
AZ(vut->r_arg);
VTIM_sleep(0.1);
c = VSL_CursorVSM(VUT.vsl, VUT.vsm,
(VUT.d_opt ? VSL_COPT_TAILSTOP : VSL_COPT_TAIL)
c = VSL_CursorVSM(vut->vsl, vut->vsm,
(vut->d_opt ? VSL_COPT_TAILSTOP : VSL_COPT_TAIL)
| VSL_COPT_BATCH);
if (c == NULL) {
VSL_ResetError(VUT.vsl);
VSL_ResetError(vut->vsl);
continue;
}
if (hascursor >= 0)
fprintf(stderr, "Log reacquired\n");
hascursor = 1;
VSLQ_SetCursor(VUT.vslq, &c);
VSLQ_SetCursor(vut->vslq, &c);
AZ(c);
}
i = VSLQ_Dispatch(VUT.vslq, vut_dispatch, NULL);
i = VSLQ_Dispatch(vut->vslq, vut_dispatch, vut);
if (i == 1)
/* Call again */
continue;
else if (i == 0) {
/* Nothing to do but wait */
if (VUT.idle_f) {
i = VUT.idle_f(&VUT);
if (vut->idle_f) {
i = vut->idle_f(vut);
if (i)
break;
}
......@@ -381,17 +395,17 @@ VUT_Main(void)
break;
}
if (VUT.vsm == NULL)
if (vut->vsm == NULL)
break;
/* XXX: Make continuation optional */
(void)VSLQ_Flush(VUT.vslq, vut_dispatch, NULL);
(void)VSLQ_Flush(vut->vslq, vut_dispatch, vut);
if (i == -2) {
/* Abandoned */
fprintf(stderr, "Log abandoned\n");
VSLQ_SetCursor(VUT.vslq, NULL);
VSLQ_SetCursor(vut->vslq, NULL);
hascursor = 0;
} else if (i < -2)
/* Overrun */
......
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