static void proc_close_fds(struct client *cl)
{
- close(cl->dispatch.proc.r.sfd.fd.fd);
+ struct dispatch_proc *p = &cl->dispatch.proc;
+
+ close(p->r.sfd.fd.fd);
+ if (p->wrfd.fd >= 0)
+ close(p->wrfd.fd);
}
static void proc_handle_close(struct relay *r, int ret)
static void proc_free(struct client *cl)
{
+ struct dispatch_proc *p = &cl->dispatch.proc;
+ blob_buf_free(&p->hdr);
proc_write_close(cl);
- uh_relay_free(&cl->dispatch.proc.r);
+ uh_relay_free(&p->r);
}
static void proc_write_cb(struct uloop_fd *fd, unsigned int events)
client_poll_post_data(cl);
}
+static void proc_relay_write_cb(struct client *cl)
+{
+ struct dispatch_proc *p = &cl->dispatch.proc;
+
+ if (ustream_pending_data(cl->us, true))
+ return;
+
+ ustream_set_read_blocked(&p->r.sfd.stream, false);
+}
+
static int proc_data_send(struct client *cl, const char *data, int len)
{
struct dispatch_proc *p = &cl->dispatch.proc;
return retlen;
}
-bool uh_create_process(struct client *cl, struct path_info *pi,
- void (*cb)(struct client *cl, struct path_info *pi))
+bool uh_create_process(struct client *cl, struct path_info *pi, const char *url,
+ void (*cb)(struct client *cl, struct path_info *pi, const char *url))
{
struct dispatch *d = &cl->dispatch;
struct dispatch_proc *proc = &d->proc;
close(wfd[1]);
uh_close_fds();
- cb(cl, pi);
+ cb(cl, pi, url);
exit(0);
}
d->close_fds = proc_close_fds;
d->data_send = proc_data_send;
d->data_done = proc_write_close;
+ d->write_cb = proc_relay_write_cb;
proc->r.header_cb = proc_handle_header;
proc->r.header_end = proc_handle_header_end;
proc->r.close = proc_handle_close;