allow the whole header to be passed into magic commands. previously, -R did not work because c->header is inconsistently maintained and parseheader always forced a read. this is fatal to some types of redirection. Reference: /n/sources/patch/maybe/httpd-magic Date: Fri Nov 7 14:23:11 CET 2008 Signed-off-by: quanstro@quanstro.net --- /sys/src/cmd/ip/httpd/init.c Thu Jul 15 21:32:36 2010 +++ /sys/src/cmd/ip/httpd/init.c Fri Nov 7 14:17:15 2008 @@ -6,7 +6,7 @@ void usage(void) { - fprint(2, "usage: httpd [-b inbuf] [-d domain] [-r remoteip] [-w webroot] [-N netdir] [-R reqline] [-L logfd0 logfd1] method version uri [search]\n"); + fprint(2, "usage: httpd [-b inbuf] [-d domain] [-r remoteip] [-w webroot] [-N netdir] [-R header] [-L logfd0 logfd1] method version uri [search]\n"); exits("usage"); } @@ -50,12 +50,13 @@ netdir = EARGF(usage()); break; case 'L': - logall[0] = strtol(EARGF(usage()), nil, 10); - logall[1] = strtol(EARGF(usage()), nil, 10); + logall[0] = atoi(EARGF(usage())); + logall[1] = atoi(EARGF(usage())); break; case 'R': s = EARGF(usage()); - snprint((char*)connect.header, sizeof(connect.header), "%s", s); + connect.hin.stop = connect.hin.start + + snprint((char*)connect.hin.start, sizeof connect.hin.buf, "%s", s); break; default: usage(); --- /sys/src/libhttpd/gethead.c Fri Nov 7 14:17:26 2008 +++ /sys/src/libhttpd/gethead.c Fri Nov 7 14:17:24 2008 @@ -12,14 +12,15 @@ { Hio *hin; char *s, *p, *pp; - int n; + int n, end; hin = &c->hin; for(;;){ + end = 0; s = (char*)hin->pos; pp = s; while(p = memchr(pp, '\n', (char*)hin->stop - pp)){ - if(!many || p == pp || (p == pp + 1 && *pp == '\r')){ + if(!many || (end = (p == pp || (p == pp + 1 && *pp == '\r')))){ pp = p + 1; break; } @@ -32,7 +33,7 @@ memmove(c->hstop, s, n); c->hstop += n; *c->hstop = '\0'; - if(p != nil) + if(p != nil || end) return 0; if(hreadbuf(hin, hin->pos) == nil || hin->state == Hend) return -1;