Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
libvdfp-pipe
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
uplex-varnish
libvdfp-pipe
Commits
b1dea62c
Commit
b1dea62c
authored
Aug 06, 2020
by
Geoff Simmons
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add the bufsz argument to the vdp constructor.
parent
076c3426
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
60 additions
and
29 deletions
+60
-29
README.rst
README.rst
+6
-2
vdp.vtc
src/tests/vdp.vtc
+21
-0
vdfp_pipe.c
src/vdfp_pipe.c
+32
-26
vdfp_pipe.vcc
src/vdfp_pipe.vcc
+1
-1
No files found.
README.rst
View file @
b1dea62c
...
...
@@ -56,8 +56,12 @@ XXX ...
.. _pipe.vdp():
new xvdp = pipe.vdp(STRING name=0, STRING path)
-----------------------------------------------
new xvdp = pipe.vdp(STRING path, STRING name, BYTES bufsz)
----------------------------------------------------------
::
new xvdp = pipe.vdp(STRING path, STRING name=0, BYTES bufsz=0)
XXX ...
...
...
src/tests/vdp.vtc
View file @
b1dea62c
...
...
@@ -117,6 +117,27 @@ logexpect l1 -v v1 -g vxid -d 1 -q {Notice ~ "^vdfp_pipe: vdp cat:"} {
expect * = End
} -run
server s1 -wait
server s1 -start
varnish v1 -vcl+backend {
import ${vmod_pipe};
sub vcl_init {
new cat = pipe.vdp(path="${cat}", bufsz=16k);
}
sub vcl_backend_response {
set beresp.uncacheable = true;
}
sub vcl_deliver {
set resp.filters = "cat";
}
}
client c1 -run
varnish v1 -vcl { backend b None; }
# Tests the discard event, with removal of VDPs.
...
...
src/vdfp_pipe.c
View file @
b1dea62c
...
...
@@ -68,6 +68,7 @@ struct VPFX(pipe_vdp) {
char
*
name
;
char
*
path
;
struct
vdp
*
vdp
;
size_t
bufsz
;
};
struct
vdp_map
{
...
...
@@ -165,6 +166,7 @@ vdp_init(struct req *req, void **priv)
CHECK_OBJ_NOTNULL
(
map
,
PIPE_VDP_MAP_MAGIC
);
CHECK_OBJ_NOTNULL
(
map
->
obj
,
PIPE_VDP_MAGIC
);
obj
=
map
->
obj
;
AN
(
obj
->
bufsz
);
errno
=
0
;
ALLOC_OBJ
(
state
,
PIPE_VDP_STATE_MAGIC
);
...
...
@@ -173,10 +175,10 @@ vdp_init(struct req *req, void **priv)
"state: %s"
,
obj
->
name
,
vstrerror
(
errno
));
return
(
-
1
);
}
state
->
buf
=
malloc
(
DEFAULT_BUFSZ
);
state
->
buf
=
malloc
(
obj
->
bufsz
);
if
(
state
->
buf
==
NULL
)
{
VSLb
(
req
->
vsl
,
SLT_Error
,
"vdfp_pipe: vdp %s: cannot allocate "
"buffer size %zd: %s"
,
obj
->
name
,
DEFAULT_BUFSZ
,
"buffer size %zd: %s"
,
obj
->
name
,
obj
->
bufsz
,
vstrerror
(
errno
));
return
(
-
1
);
}
...
...
@@ -306,14 +308,17 @@ vdp_bytes(struct req *req, enum vdp_action act, void **priv, const void *ptr,
struct
pollfd
*
fds
;
int
retval
;
ssize_t
nbytes
;
struct
VPFX
(
pipe_vdp
)
*
obj
;
CHECK_OBJ_NOTNULL
(
req
,
REQ_MAGIC
);
assert
(
len
>=
0
);
AN
(
priv
);
CAST_OBJ_NOTNULL
(
state
,
*
priv
,
PIPE_VDP_STATE_MAGIC
);
CHECK_OBJ_NOTNULL
(
state
->
obj
,
PIPE_VDP_MAGIC
);
AN
(
state
->
obj
->
name
);
AN
(
state
->
obj
->
path
);
obj
=
state
->
obj
;
AN
(
obj
->
name
);
AN
(
obj
->
path
);
AN
(
obj
->
bufsz
);
fds
=
state
->
fds
;
if
(
act
==
VDP_END
&&
len
==
0
)
...
...
@@ -332,8 +337,7 @@ vdp_bytes(struct req *req, enum vdp_action act, void **priv, const void *ptr,
}
if
(
retval
==
0
&&
len
>
0
)
{
VSLb
(
req
->
vsl
,
SLT_Error
,
"vdfp_pipe: vdp %s: timeout "
"waiting for %s"
,
state
->
obj
->
name
,
state
->
obj
->
path
);
"waiting for %s"
,
obj
->
name
,
obj
->
path
);
return
(
-
1
);
}
else
if
(
retval
==
0
)
...
...
@@ -345,8 +349,8 @@ vdp_bytes(struct req *req, enum vdp_action act, void **priv, const void *ptr,
AZ
(
fds
[
i
].
revents
&
POLLNVAL
);
if
(
fds
[
i
].
revents
&
POLLERR
)
{
VSLb
(
req
->
vsl
,
SLT_Error
,
"vdfp_pipe: vdp %s: "
"error polling %s %s"
,
state
->
obj
->
name
,
state
->
obj
->
path
,
stream_name
[
i
]);
"error polling %s %s"
,
obj
->
name
,
obj
->
path
,
stream_name
[
i
]);
close_all
(
fds
);
return
(
-
1
);
}
...
...
@@ -364,9 +368,8 @@ vdp_bytes(struct req *req, enum vdp_action act, void **priv, const void *ptr,
if
(
nbytes
<
0
)
{
VSLb
(
req
->
vsl
,
SLT_Error
,
"vdfp_pipe: vdp %s: error writing "
"to %s stdin: %s"
,
state
->
obj
->
name
,
state
->
obj
->
path
,
vstrerror
(
errno
));
"to %s stdin: %s"
,
obj
->
name
,
obj
->
path
,
vstrerror
(
errno
));
close_all
(
fds
);
return
(
-
1
);
}
...
...
@@ -386,12 +389,12 @@ vdp_bytes(struct req *req, enum vdp_action act, void **priv, const void *ptr,
continue
;
}
errno
=
0
;
nbytes
=
read
(
fds
[
i
].
fd
,
state
->
buf
,
DEFAULT_BUFSZ
);
nbytes
=
read
(
fds
[
i
].
fd
,
state
->
buf
,
obj
->
bufsz
);
if
(
nbytes
<
0
)
{
VSLb
(
req
->
vsl
,
SLT_Error
,
"vdfp_pipe: vdp %s:"
" error reading %s from %s: %s"
,
state
->
obj
->
name
,
stream_name
[
i
]
,
state
->
obj
->
path
,
vstrerror
(
errno
));
obj
->
name
,
stream_name
[
i
],
obj
->
path
,
vstrerror
(
errno
));
close_all
(
fds
);
return
(
-
1
);
}
...
...
@@ -413,7 +416,7 @@ vdp_bytes(struct req *req, enum vdp_action act, void **priv, const void *ptr,
}
// XXX write one line at a time
VSLb
(
req
->
vsl
,
SLT_Error
,
"vdfp_pipe: vdp %s: %s "
"stderr ..."
,
state
->
obj
->
name
,
state
->
obj
->
path
);
"stderr ..."
,
obj
->
name
,
obj
->
path
);
VSLb_bin
(
req
->
vsl
,
SLT_Error
,
nbytes
,
state
->
buf
);
}
if
(
act
==
VDP_END
)
{
...
...
@@ -500,7 +503,7 @@ vmod_event(VRT_CTX, struct vmod_priv *priv, enum vcl_event_e e)
VCL_VOID
vmod_vdp__init
(
VRT_CTX
,
struct
VPFX
(
pipe_vdp
)
**
vdpp
,
const
char
*
obj_name
,
VCL_STRING
vdp_name
,
VCL_STRING
path
)
VCL_STRING
path
,
VCL_STRING
vdp_name
,
VCL_BYTES
bufsz
)
{
struct
VPFX
(
pipe_vdp
)
*
vdp_obj
;
struct
vdp
*
vdp
;
...
...
@@ -511,6 +514,16 @@ vmod_vdp__init(VRT_CTX, struct VPFX(pipe_vdp) **vdpp, const char *obj_name,
AZ
(
*
vdpp
);
AN
(
obj_name
);
if
(
path
==
NULL
||
*
path
==
'\0'
)
{
VDPFAIL
(
ctx
,
"new %s: path is empty"
,
path
);
return
;
}
errno
=
0
;
if
(
access
(
path
,
X_OK
)
!=
0
)
{
VDPFAIL
(
ctx
,
"new %s: cannot execute %s: %s"
,
obj_name
,
path
,
vstrerror
(
errno
));
return
;
}
if
(
vdp_name
==
NULL
||
*
vdp_name
==
'\0'
)
vdp_name
=
obj_name
;
...
...
@@ -531,16 +544,8 @@ vmod_vdp__init(VRT_CTX, struct VPFX(pipe_vdp) **vdpp, const char *obj_name,
CHK_NAME
(
"V1B"
);
CHK_NAME
(
"H2B"
);
if
(
path
==
NULL
||
*
path
==
'\0'
)
{
VDPFAIL
(
ctx
,
"new %s: path is empty"
,
path
);
return
;
}
errno
=
0
;
if
(
access
(
path
,
X_OK
)
!=
0
)
{
VDPFAIL
(
ctx
,
"new %s: cannot execute %s: %s"
,
obj_name
,
path
,
vstrerror
(
errno
));
return
;
}
if
(
bufsz
==
0
)
bufsz
=
DEFAULT_BUFSZ
;
errno
=
0
;
ALLOC_OBJ
(
vdp_obj
,
PIPE_VDP_MAGIC
);
...
...
@@ -552,6 +557,7 @@ vmod_vdp__init(VRT_CTX, struct VPFX(pipe_vdp) **vdpp, const char *obj_name,
*
vdpp
=
vdp_obj
;
vdp_obj
->
name
=
strdup
(
obj_name
);
vdp_obj
->
path
=
strdup
(
path
);
vdp_obj
->
bufsz
=
bufsz
;
errno
=
0
;
vdp
=
malloc
(
sizeof
(
*
vdp
));
...
...
src/vdfp_pipe.vcc
View file @
b1dea62c
...
...
@@ -50,7 +50,7 @@ external commands.
XXX ...
$Object vdp(STRING
name=0, STRING path
)
$Object vdp(STRING
path, STRING name=0, BYTES bufsz=0
)
XXX ...
...
...
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