#include <errno.h>
#include <ctype.h>
#include <stdio.h>
+#include <fcntl.h>
#ifdef HAVE_CONFIG_H
#include <config.h>
for(p = buf->b; (p - buf->b < buf->d) && isspace(*p); p++);
memmove(buf->b, p, buf->d -= (p - buf->b));
- for(p = buf->b + buf->d - 1; (p > buf->b) && isspace(*p); p--, buf->d--);
+ if(buf->d > 0)
+ for(p = buf->b + buf->d - 1; (p > buf->b) && isspace(*p); p--, buf->d--);
}
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') {
head->headers[i][1] = sstrdup(val);
}
+void headrmheader(struct hthead *head, const char *name)
+{
+ int i;
+
+ for(i = 0; i < head->noheaders; i++) {
+ if(!strcasecmp(head->headers[i][0], name)) {
+ free(head->headers[i][0]);
+ free(head->headers[i][1]);
+ free(head->headers[i]);
+ memmove(head->headers + i, head->headers + i + 1, sizeof(head->headers) * (--head->noheaders - i));
+ return;
+ }
+ }
+}
+
int writeresp(FILE *out, struct hthead *resp)
{
int i;
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;