Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
varnish-cache
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Commits
Open sidebar
varnishcache
varnish-cache
Commits
36520f2d
Commit
36520f2d
authored
Sep 05, 2017
by
Dridi Boukelmoune
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Remove the global VUT symbol
parent
28b91058
Changes
8
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
207 additions
and
179 deletions
+207
-179
varnishhist.c
bin/varnishhist/varnishhist.c
+19
-16
varnishlog.c
bin/varnishlog/varnishlog.c
+24
-21
varnishncsa.c
bin/varnishncsa/varnishncsa.c
+24
-20
varnishstat.c
bin/varnishstat/varnishstat.c
+6
-3
varnishtop.c
bin/varnishtop/varnishtop.c
+17
-13
vut.h
include/vut.h
+5
-7
libvarnishapi.map
lib/libvarnishapi/libvarnishapi.map
+0
-1
vut.c
lib/libvarnishapi/vut.c
+112
-98
No files found.
bin/varnishhist/varnishhist.c
View file @
36520f2d
...
...
@@ -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
);
}
bin/varnishlog/varnishlog.c
View file @
36520f2d
...
...
@@ -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
);
...
...
bin/varnishncsa/varnishncsa.c
View file @
36520f2d
...
...
@@ -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
);
}
bin/varnishstat/varnishstat.c
View file @
36520f2d
...
...
@@ -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
);
...
...
bin/varnishtop/varnishtop.c
View file @
36520f2d
...
...
@@ -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
);
}
include/vut.h
View file @
36520f2d
...
...
@@ -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
**
);
lib/libvarnishapi/libvarnishapi.map
View file @
36520f2d
...
...
@@ -127,7 +127,6 @@ LIBVARNISHAPI_2.0 {
VTIM_timeval;
# vut.c
VUT;
VUT_Arg;
VUT_Error;
VUT_Fini;
...
...
lib/libvarnishapi/vut.c
View file @
36520f2d
...
...
@@ -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 */
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment