diff options
author | Felix Fietkau <nbd@openwrt.org> | 2013-01-19 19:06:25 +0100 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2013-01-19 19:31:21 +0100 |
commit | 3560e89406c81814254bdb45db19498387265cb7 (patch) | |
tree | 7f59528922a1f9c4c1d5f1e5d8823df02d8b965a | |
parent | 78f9f35e22c60d5748f0d69a202ca541c517f0bb (diff) |
implement support for script timeout for cgi/lua
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
-rw-r--r-- | proc.c | 15 | ||||
-rw-r--r-- | relay.c | 9 | ||||
-rw-r--r-- | uhttpd.h | 2 |
3 files changed, 26 insertions, 0 deletions
@@ -214,9 +214,11 @@ static void proc_handle_header(struct relay *r, const char *name, const char *va static void proc_handle_header_end(struct relay *r) { struct client *cl = r->cl; + struct dispatch_proc *p = &cl->dispatch.proc; struct blob_attr *cur; int rem; + uloop_timeout_cancel(&p->timeout); uh_http_header(cl, cl->dispatch.proc.status_code, cl->dispatch.proc.status_msg); blob_for_each_attr(cur, cl->dispatch.proc.hdr.head, rem) ustream_printf(cl->us, "%s: %s\r\n", blobmsg_name(cur), blobmsg_data(cur)); @@ -239,6 +241,8 @@ static void proc_write_close(struct client *cl) static void proc_free(struct client *cl) { struct dispatch_proc *p = &cl->dispatch.proc; + + uloop_timeout_cancel(&p->timeout); blob_buf_free(&p->hdr); proc_write_close(cl); uh_relay_free(&p->r); @@ -298,6 +302,14 @@ static int proc_data_send(struct client *cl, const char *data, int len) return retlen; } +static void proc_timeout_cb(struct uloop_timeout *timeout) +{ + struct dispatch_proc *proc = container_of(timeout, struct dispatch_proc, timeout); + struct client *cl = container_of(proc, struct client, dispatch.proc); + + uh_relay_kill(cl, &proc->r); +} + bool uh_create_process(struct client *cl, struct path_info *pi, char *url, void (*cb)(struct client *cl, struct path_info *pi, char *url)) { @@ -352,6 +364,9 @@ bool uh_create_process(struct client *cl, struct path_info *pi, char *url, proc->r.header_end = proc_handle_header_end; proc->r.close = proc_handle_close; proc->wrfd.cb = proc_write_cb; + proc->timeout.cb = proc_timeout_cb; + if (conf.script_timeout > 0) + uloop_timeout_set(&proc->timeout, conf.script_timeout * 1000); return true; @@ -162,6 +162,15 @@ static void relay_proc_cb(struct uloop_process *proc, int ret) relay_close_if_done(r); } +void uh_relay_kill(struct client *cl, struct relay *r) +{ + struct ustream *us = &r->sfd.stream; + + kill(r->proc.pid, SIGKILL); + us->eof = true; + ustream_state_change(us); +} + void uh_relay_open(struct client *cl, struct relay *r, int fd, int pid) { struct ustream *us = &r->sfd.stream; @@ -157,6 +157,7 @@ struct relay { }; struct dispatch_proc { + struct uloop_timeout timeout; struct blob_buf hdr; struct uloop_fd wrfd; struct relay r; @@ -286,6 +287,7 @@ void uh_dispatch_add(struct dispatch_handler *d); void uh_relay_open(struct client *cl, struct relay *r, int fd, int pid); void uh_relay_close(struct relay *r, int ret); void uh_relay_free(struct relay *r); +void uh_relay_kill(struct client *cl, struct relay *r); struct env_var *uh_get_process_vars(struct client *cl, struct path_info *pi); bool uh_create_process(struct client *cl, struct path_info *pi, char *url, |