diff options
Diffstat (limited to 'package/uhttpd/src')
| -rw-r--r-- | package/uhttpd/src/uhttpd-cgi.c | 1 | ||||
| -rw-r--r-- | package/uhttpd/src/uhttpd-lua.c | 1 | ||||
| -rw-r--r-- | package/uhttpd/src/uhttpd-utils.c | 3 | ||||
| -rw-r--r-- | package/uhttpd/src/uhttpd.c | 23 | ||||
| -rw-r--r-- | package/uhttpd/src/uhttpd.h | 1 | 
5 files changed, 26 insertions, 3 deletions
diff --git a/package/uhttpd/src/uhttpd-cgi.c b/package/uhttpd/src/uhttpd-cgi.c index 8336a1b71..aa7947811 100644 --- a/package/uhttpd/src/uhttpd-cgi.c +++ b/package/uhttpd/src/uhttpd-cgi.c @@ -530,6 +530,7 @@ bool uh_cgi_request(struct client *cl, struct path_info *pi,  		memset(state, 0, sizeof(*state));  		state->cl = cl; +		state->cl->pipe.fd = rfd[0];  		state->cl->proc.pid = child;  		/* close unneeded pipe ends */ diff --git a/package/uhttpd/src/uhttpd-lua.c b/package/uhttpd/src/uhttpd-lua.c index 5158534e2..10d6de402 100644 --- a/package/uhttpd/src/uhttpd-lua.c +++ b/package/uhttpd/src/uhttpd-lua.c @@ -558,6 +558,7 @@ bool uh_lua_request(struct client *cl, lua_State *L)  		memset(state, 0, sizeof(*state));  		state->cl = cl; +		state->cl->pipe.fd = rfd[0];  		state->cl->proc.pid = child;  		/* close unneeded pipe ends */ diff --git a/package/uhttpd/src/uhttpd-utils.c b/package/uhttpd/src/uhttpd-utils.c index dec952357..d31f756d1 100644 --- a/package/uhttpd/src/uhttpd-utils.c +++ b/package/uhttpd/src/uhttpd-utils.c @@ -996,6 +996,9 @@ void uh_client_remove(struct client *cl)  			if (cur->proc.pid)  				uloop_process_delete(&cur->proc); +			if (cur->pipe.fd) +				uloop_fd_delete(&cur->pipe); +  			uloop_fd_delete(&cur->fd);  			close(cur->fd.fd); diff --git a/package/uhttpd/src/uhttpd.c b/package/uhttpd/src/uhttpd.c index d5d5dfb98..73f6e03bd 100644 --- a/package/uhttpd/src/uhttpd.c +++ b/package/uhttpd/src/uhttpd.c @@ -219,7 +219,7 @@ static int uh_socket_bind(fd_set *serv_fds, int *max_fd,  		*max_fd = max(*max_fd, sock);  		l->fd.cb = uh_listener_cb; -		uloop_fd_add(&l->fd, ULOOP_READ | ULOOP_WRITE); +		uloop_fd_add(&l->fd, ULOOP_READ);  		bound++;  		continue; @@ -539,7 +539,7 @@ static void uh_listener_cb(struct uloop_fd *u, unsigned int events)  		if ((cl = uh_client_add(new_fd, serv)) != NULL)  		{  			/* add client socket to global fdset */ -			uloop_fd_add(&cl->fd, ULOOP_READ | ULOOP_WRITE); +			uloop_fd_add(&cl->fd, ULOOP_READ);  #ifdef HAVE_TLS  			/* setup client tls context */ @@ -569,6 +569,15 @@ static void uh_listener_cb(struct uloop_fd *u, unsigned int events)  	}  } +static void uh_pipe_cb(struct uloop_fd *u, unsigned int events) +{ +	struct client *cl = container_of(u, struct client, pipe); + +	D("SRV: Client(%d) pipe(%d) readable\n", cl->fd.fd, cl->pipe.fd); + +	uh_client_cb(&cl->fd, ULOOP_WRITE); +} +  static void uh_child_cb(struct uloop_process *p, int rv)  {  	struct client *cl = container_of(p, struct client, proc); @@ -686,6 +695,15 @@ static void uh_client_cb(struct uloop_fd *u, unsigned int events)  			return;  		} +		/* request handler spawned a pipe, register handler */ +		if (cl->pipe.fd) +		{ +			D("SRV: Client(%d) pipe(%d) spawned\n", u->fd, cl->pipe.fd); + +			cl->pipe.cb = uh_pipe_cb; +			uloop_fd_add(&cl->pipe, ULOOP_READ); +		} +  		/* request handler spawned a child, register handler */  		if (cl->proc.pid)  		{ @@ -701,7 +719,6 @@ static void uh_client_cb(struct uloop_fd *u, unsigned int events)  		/* header processing complete */  		D("SRV: Client(%d) dispatched\n", u->fd);  		cl->dispatched = true; -		return;  	}  	if (!cl->cb(cl)) diff --git a/package/uhttpd/src/uhttpd.h b/package/uhttpd/src/uhttpd.h index 8fa3f219b..69fe21a41 100644 --- a/package/uhttpd/src/uhttpd.h +++ b/package/uhttpd/src/uhttpd.h @@ -160,6 +160,7 @@ struct client {  	SSL *tls;  #endif  	struct uloop_fd fd; +	struct uloop_fd pipe;  	struct uloop_process proc;  	struct uloop_timeout timeout;  	bool (*cb)(struct client *);  | 
