mirror of
https://github.com/zotanmew/nginx-rtmp-module.git
synced 2024-05-15 16:31:07 +02:00
implemented exec IO
This commit is contained in:
parent
6dc5b12f03
commit
f79aa206ec
|
@ -244,8 +244,8 @@ ngx_rtmp_enotify_exec(ngx_rtmp_session_t *s, ngx_rtmp_enotify_conf_t *ec)
|
|||
{
|
||||
#if !(NGX_WIN32)
|
||||
int pid, fd, maxfd;
|
||||
ngx_str_t a, *arg;
|
||||
char **args;
|
||||
ngx_str_t a, *arg_in;
|
||||
char **args, **arg_out;
|
||||
ngx_uint_t n;
|
||||
|
||||
pid = fork();
|
||||
|
@ -276,16 +276,29 @@ ngx_rtmp_enotify_exec(ngx_rtmp_session_t *s, ngx_rtmp_enotify_conf_t *ec)
|
|||
if (args == NULL) {
|
||||
exit(1);
|
||||
}
|
||||
arg = ec->args.elts;
|
||||
args[0] = (char *)ec->cmd.data;
|
||||
for (n = 0; n < ec->args.nelts; ++n, ++arg) {
|
||||
ngx_rtmp_eval(s, arg, ngx_rtmp_enotify_eval_p, &a);
|
||||
args[n + 1] = (char *) a.data;
|
||||
|
||||
arg_in = ec->args.elts;
|
||||
arg_out = args;
|
||||
|
||||
*arg_out++ = (char *) ec->cmd.data;
|
||||
|
||||
for (n = 0; n < ec->args.nelts; ++n, ++arg_in) {
|
||||
|
||||
ngx_rtmp_eval(s, arg_in, ngx_rtmp_enotify_eval_p, &a);
|
||||
|
||||
if (ngx_rtmp_eval_streams(&a) != NGX_DONE) {
|
||||
continue;
|
||||
}
|
||||
|
||||
*arg_out++ = (char *) a.data;
|
||||
}
|
||||
args[n + 1] = NULL;
|
||||
if (execvp((char *)ec->cmd.data, args) == -1) {
|
||||
|
||||
*arg_out = NULL;
|
||||
|
||||
if (execvp((char *) ec->cmd.data, args) == -1) {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
|
@ -186,3 +186,91 @@ ngx_rtmp_eval(ngx_rtmp_session_t *s, ngx_str_t *in, ngx_rtmp_eval_t **e,
|
|||
|
||||
return NGX_OK;
|
||||
}
|
||||
|
||||
|
||||
ngx_int_t
|
||||
ngx_rtmp_eval_streams(ngx_str_t *in)
|
||||
{
|
||||
ngx_int_t mode, create, v, close_src;
|
||||
ngx_fd_t dst, src;
|
||||
u_char *path;
|
||||
|
||||
path = in->data;
|
||||
|
||||
while (*path >= '0' && *path <= '9') {
|
||||
path++;
|
||||
}
|
||||
|
||||
switch ((char) *path) {
|
||||
|
||||
case '>':
|
||||
|
||||
v = (path == in->data ? 1 : ngx_atoi(in->data, path - in->data));
|
||||
if (v == NGX_ERROR) {
|
||||
return NGX_ERROR;
|
||||
}
|
||||
|
||||
dst = (ngx_fd_t) v;
|
||||
mode = NGX_FILE_WRONLY;
|
||||
create = NGX_FILE_TRUNCATE;
|
||||
path++;
|
||||
|
||||
if (*path == (u_char) '>') {
|
||||
mode = NGX_FILE_APPEND;
|
||||
create = NGX_FILE_CREATE_OR_OPEN;
|
||||
path++;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case '<':
|
||||
|
||||
v = (path == in->data ? 0 : ngx_atoi(in->data, path - in->data));
|
||||
if (v == NGX_ERROR) {
|
||||
return NGX_ERROR;
|
||||
}
|
||||
|
||||
dst = (ngx_fd_t) v;
|
||||
mode = NGX_FILE_RDONLY;
|
||||
create = NGX_FILE_OPEN;
|
||||
path++;
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
return NGX_DONE;
|
||||
}
|
||||
|
||||
if (*path == (u_char) '&') {
|
||||
|
||||
path++;
|
||||
v = ngx_atoi(path, in->data + in->len - path);
|
||||
if (v == NGX_ERROR) {
|
||||
return NGX_ERROR;
|
||||
}
|
||||
src = (ngx_fd_t) v;
|
||||
close_src = 0;
|
||||
|
||||
} else {
|
||||
|
||||
src = ngx_open_file(path, mode, create, NGX_FILE_DEFAULT_ACCESS);
|
||||
if (src == NGX_INVALID_FILE) {
|
||||
return NGX_ERROR;
|
||||
}
|
||||
close_src = 1;
|
||||
|
||||
}
|
||||
|
||||
if (src == dst) {
|
||||
return NGX_OK;
|
||||
}
|
||||
|
||||
dup2(src, dst);
|
||||
|
||||
if (close_src) {
|
||||
ngx_close_file(src);
|
||||
}
|
||||
|
||||
return NGX_OK;
|
||||
}
|
||||
|
|
|
@ -34,4 +34,7 @@ ngx_int_t ngx_rtmp_eval(ngx_rtmp_session_t *s, ngx_str_t *in,
|
|||
ngx_rtmp_eval_t **e, ngx_str_t *out);
|
||||
|
||||
|
||||
ngx_int_t ngx_rtmp_eval_streams(ngx_str_t *in);
|
||||
|
||||
|
||||
#endif /* _NGX_RTMP_EVAL_H_INCLUDED_ */
|
||||
|
|
|
@ -434,8 +434,8 @@ ngx_rtmp_exec_run(ngx_rtmp_exec_t *e)
|
|||
int pipefd[2];
|
||||
int ret;
|
||||
ngx_rtmp_exec_conf_t *ec;
|
||||
ngx_str_t *arg, a;
|
||||
char **args;
|
||||
ngx_str_t *arg_in, a;
|
||||
char **args, **arg_out;
|
||||
ngx_uint_t n;
|
||||
|
||||
ec = e->conf;
|
||||
|
@ -505,20 +505,32 @@ ngx_rtmp_exec_run(ngx_rtmp_exec_t *e)
|
|||
if (args == NULL) {
|
||||
exit(1);
|
||||
}
|
||||
arg = ec->args.elts;
|
||||
args[0] = (char *) ec->cmd.data;
|
||||
for (n = 0; n < ec->args.nelts; ++n, ++arg) {
|
||||
|
||||
arg_in = ec->args.elts;
|
||||
arg_out = args;
|
||||
*arg_out++ = (char *) ec->cmd.data;
|
||||
|
||||
for (n = 0; n < ec->args.nelts; n++, ++arg_in) {
|
||||
|
||||
if (e->session == NULL) {
|
||||
a = *arg;
|
||||
a = *arg_in;
|
||||
} else {
|
||||
ngx_rtmp_eval(e->session, arg, ngx_rtmp_exec_eval_p, &a);
|
||||
ngx_rtmp_eval(e->session, arg_in, ngx_rtmp_exec_eval_p, &a);
|
||||
}
|
||||
args[n + 1] = (char *) a.data;
|
||||
|
||||
if (ngx_rtmp_eval_streams(&a) != NGX_DONE) {
|
||||
continue;
|
||||
}
|
||||
|
||||
*arg_out++ = (char *) a.data;
|
||||
}
|
||||
args[n + 1] = NULL;
|
||||
|
||||
*arg_out = NULL;
|
||||
|
||||
if (execvp((char *) ec->cmd.data, args) == -1) {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
Loading…
Reference in a new issue