implemented exec IO

This commit is contained in:
Roman Arutyunyan 2013-04-24 16:08:15 +04:00
parent 6dc5b12f03
commit f79aa206ec
4 changed files with 134 additions and 18 deletions

View file

@ -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:

View file

@ -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;
}

View file

@ -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_ */

View file

@ -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: