X-Git-Url: http://www.dolda2000.com/gitweb/?a=blobdiff_plain;f=lib%2Freq.c;h=8ff26e06b6b8aedcae50f61068d3f1c4efa00d9f;hb=d9f67feaea01146d7ea10abfff2dc59ff8946ced;hp=64944bf56b1c93a949526615faf01f4c14047144;hpb=608f4ac7a840277f9754d8fe0410a31727057d3f;p=ashd.git diff --git a/lib/req.c b/lib/req.c index 64944bf..8ff26e0 100644 --- a/lib/req.c +++ b/lib/req.c @@ -23,6 +23,7 @@ #include #include #include +#include #ifdef HAVE_CONFIG_H #include @@ -105,12 +106,16 @@ int parseheaders(struct hthead *head, FILE *in) { int c, state; struct charbuf name, val; + size_t tsz; bufinit(name); bufinit(val); state = 0; + tsz = 0; while(1) { c = fgetc(in); + if(++tsz >= 65536) + goto fail; again: if(state == 0) { if(c == '\r') { @@ -159,6 +164,72 @@ fail: return(-1); } +struct hthead *parseresponse(FILE *in) +{ + struct hthead *req; + int code; + struct charbuf ver, msg; + int c; + + req = NULL; + bufinit(ver); + bufinit(msg); + code = 0; + while(1) { + c = getc(in); + if(c == ' ') { + break; + } else if((c == EOF) || (c < 32) || (c >= 128)) { + goto fail; + } else { + bufadd(ver, c); + if(ver.d >= 128) + goto fail; + } + } + while(1) { + c = getc(in); + if(c == ' ') { + break; + } else if((c == EOF) || (c < '0') || (c > '9')) { + goto fail; + } else { + code = (code * 10) + (c - '0'); + if(code >= 10000) + goto fail; + } + } + while(1) { + c = getc(in); + if(c == 10) { + break; + } else if(c == 13) { + } else if((c == EOF) || (c < 32)) { + goto fail; + } else { + bufadd(msg, c); + if(msg.d >= 512) + goto fail; + } + } + bufadd(msg, 0); + bufadd(ver, 0); + req = mkresp(code, msg.b, ver.b); + if(parseheaders(req, in)) + goto fail; + goto out; + +fail: + if(req != NULL) { + freehthead(req); + req = NULL; + } +out: + buffree(msg); + buffree(ver); + return(req); +} + void replrest(struct hthead *head, char *rest) { char *tmp; @@ -219,7 +290,7 @@ int writeresp(FILE *out, struct hthead *resp) return(0); } -int sendreq(int sock, struct hthead *req, int fd) +int sendreq2(int sock, struct hthead *req, int fd, int flags) { int ret, i; struct charbuf buf; @@ -234,7 +305,7 @@ int sendreq(int sock, struct hthead *req, int fd) bufcatstr2(buf, req->headers[i][1]); } bufcatstr2(buf, ""); - ret = sendfd(sock, fd, buf.b, buf.d); + ret = sendfd2(sock, fd, buf.b, buf.d, flags); buffree(buf); if(ret < 0) return(-1); @@ -242,6 +313,11 @@ int sendreq(int sock, struct hthead *req, int fd) return(0); } +int sendreq(int sock, struct hthead *req, int fd) +{ + return(sendreq2(sock, req, fd, MSG_NOSIGNAL | MSG_DONTWAIT)); +} + int recvreq(int sock, struct hthead **reqp) { int fd; @@ -254,6 +330,7 @@ int recvreq(int sock, struct hthead **reqp) if((fd = recvfd(sock, &buf.b, &buf.d)) < 0) { return(-1); } + fcntl(fd, F_SETFD, FD_CLOEXEC); buf.s = buf.d; p = buf.b; l = buf.d;