[package] uhttpd: do not subscribe to epoll write events
[openwrt.git] / package / uhttpd / src / uhttpd.c
index d5d5dfb..73f6e03 100644 (file)
@@ -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))