|  | #include <u.h> | 
|  | #include <libc.h> | 
|  | #include <bin.h> | 
|  | #include <httpd.h> | 
|  |  | 
|  | /* | 
|  | * read in some header lines, either one or all of them. | 
|  | * copy results into header log buffer. | 
|  | */ | 
|  | int | 
|  | hgethead(HConnect *c, int many) | 
|  | { | 
|  | Hio *hin; | 
|  | char *s, *p, *pp; | 
|  | int n; | 
|  |  | 
|  | hin = &c->hin; | 
|  | for(;;){ | 
|  | s = (char*)hin->pos; | 
|  | pp = s; | 
|  | while(p = memchr(pp, '\n', (char*)hin->stop - pp)){ | 
|  | if(!many || p == pp || (p == pp + 1 && *pp == '\r')){ | 
|  | pp = p + 1; | 
|  | break; | 
|  | } | 
|  | pp = p + 1; | 
|  | } | 
|  | hin->pos = (uchar*)pp; | 
|  | n = pp - s; | 
|  | if(c->hstop + n > &c->header[HBufSize]) | 
|  | return -1; | 
|  | memmove(c->hstop, s, n); | 
|  | c->hstop += n; | 
|  | *c->hstop = '\0'; | 
|  | if(p != nil) | 
|  | return 0; | 
|  | if(hreadbuf(hin, hin->pos) == nil || hin->state == Hend) | 
|  | return -1; | 
|  | } | 
|  | } |