head->headers[i][1] = sstrdup(val);
}
-int sendreq(int sock, struct hthead *req)
+int sendreq(int sock, struct hthead *req, int fd)
{
int ret, i;
- int pfds[2];
struct charbuf buf;
- if(socketpair(PF_UNIX, SOCK_STREAM, 0, pfds))
- return(-1);
bufinit(buf);
bufcatstr2(buf, req->method);
bufcatstr2(buf, req->url);
bufcatstr2(buf, req->headers[i][1]);
}
bufcatstr2(buf, "");
- ret = sendfd(sock, pfds[0], buf.b, buf.d);
+ ret = sendfd(sock, fd, buf.b, buf.d);
buffree(buf);
- close(pfds[0]);
- if(ret < 0) {
- close(pfds[1]);
+ if(ret < 0)
return(-1);
- } else {
- return(pfds[1]);
- }
+ else
+ return(0);
}
int recvreq(int sock, struct hthead **reqp)
char *getheader(struct hthead *head, char *name);
void headpreheader(struct hthead *head, const char *name, const char *val);
void headappheader(struct hthead *head, const char *name, const char *val);
-int sendreq(int sock, struct hthead *req);
+int sendreq(int sock, struct hthead *req, int fd);
int recvreq(int sock, struct hthead **reqp);
void replrest(struct hthead *head, char *rest);
vavar(int, fd);
vavar(struct sockaddr_storage, name);
int cfd;
+ int pfds[2];
char old;
char *hd, *p;
struct charbuf inbuf, outbuf;
}
if(block(plex, EV_WRITE, 60) <= 0)
goto out;
- if((cfd = sendreq(plex, req)) < 0)
+ if(socketpair(PF_UNIX, SOCK_STREAM, 0, pfds))
goto out;
+ if(sendreq(plex, req, pfds[0]))
+ goto out;
+ close(pfds[0]);
+ cfd = pfds[1];
/*
* If there is message data, pass it: