+static void proc_write_cb(struct uloop_fd *fd, unsigned int events)
+{
+ struct client *cl = container_of(fd, struct client, dispatch.proc.wrfd);
+
+ client_poll_post_data(cl);
+}
+
+static int proc_data_send(struct client *cl, const char *data, int len)
+{
+ struct dispatch_proc *p = &cl->dispatch.proc;
+ int retlen = 0;
+ int ret;
+
+ while (len) {
+ ret = write(p->wrfd.fd, data, len);
+
+ if (ret < 0) {
+ if (errno == EINTR)
+ continue;
+
+ if (errno == EAGAIN || errno == EWOULDBLOCK)
+ break;
+
+ /* error, no retry */
+ len = 0;
+ break;
+ }
+
+ if (!ret)
+ break;
+
+ retlen += ret;
+ len -= ret;
+ data += ret;
+ }
+
+ if (len)
+ uloop_fd_add(&p->wrfd, ULOOP_WRITE);
+ else
+ uloop_fd_delete(&p->wrfd);
+
+ return retlen;
+}
+