// Try to identify format of drives with headers in cylinder head sector // format (CHS). // Head will be left at specified cylinder on return // // drive_params: Drive parameters determined so far and return what we have determined // deltas: MFM delta time transition data to analyze (filled after read) // max_delta: Size of deltas array // cyl: cylinder to test // head: head to test int analyze_chs(DRIVE_PARAMS *drive_params, void *deltas, int max_deltas, int cyl, int head) { int rc; rc = analyze_header(drive_params, cyl, head, deltas, max_deltas); if (rc != 2) { // Corvus H doesn't have separate data area if (drive_params->controller != CONTROLLER_CORVUS_H) { rc |= analyze_data(drive_params, cyl, head, deltas, max_deltas); } } // If we either got no valid information or multiple possible values try // cyl 1 head 1. Cyl 0 head 0 is poor for distinguishing different header // formats. Also may help if first track has too many read errors. // Analyzing track 0 is useful for detecting the weird multiple formats for // the DEC RQDX3 so it is tested first. if (rc != 0) { msg(MSG_INFO,"Retrying on a different cylinder and head\n"); cyl = cyl + 1; head = 1; if (analyze_header(drive_params, cyl, head, deltas, max_deltas) == 2) { return 1; } if (analyze_data(drive_params, cyl, head, deltas, max_deltas) == 2) { // IS THIS NEEDED? if (drive_params->controller == CONTROLLER_WD_1006) { drive_params->controller = CONTROLLER_RUSSIAN; } if (analyze_data(drive_params, cyl, head, deltas, max_deltas) == 2) { drive_params->controller = CONTROLLER_WD_1006; return 1; } msg(MSG_FORMAT,"Changed controller type to %s\n", mfm_controller_info[drive_params->controller].name); } } analyze_sectors(drive_params, cyl, deltas, max_deltas); return 0; }
int check_server_headers(struct server_answ *a, struct mem_obj *obj, const char *b,int len, struct request *rq) { char *start, *beg, *end, *p; char holder, its_here = 0, off = 2; char *p1 = NULL; a->http_result=0; assert(a); assert(obj); assert(b); assert(rq); sscanf(b,"%*s %d",&a->http_result); // if ( !b || !b->data ) return(0); beg =(char *) b; end = (char *)b + len; if ( end - beg > MAX_DOC_HDR_SIZE ) { /* Header is too large */ return(1); } go: if ( a->state & GOT_HDR ) return(0); start = beg + a->checked; if ( !a->checked ) { p = (char *)memchr(beg, '\n', end-beg); holder = '\n'; if ( !p ) { p = (char *)memchr(beg, '\r', end-beg); holder = '\r'; } if ( !p ) return(0); if ( *p == '\n' ) { if ( *(p-1) == '\r' ) { p1 = p-1; *p1 = 0; } } *p = 0; a->checked = strlen(start); /* this is HTTP XXX yyy "header", which we will never rewrite */ analyze_header(start, a); if ( add_header_av(start, obj) ) { *p = holder; if ( p1 ) { *p1 = '\r'; p1=NULL; } return(-1); } *p = holder; if ( p1 ) { *p1 = '\r'; p1=NULL; } goto go; } if ( (end - start >= 2) && !memcmp(start, "\n\n", 2) ) { its_here = 1; off = 2; } if ( (end - start >= 3) && !memcmp(start, "\r\n\n", 3) ) { its_here = 1; off = 3; } if ( (end - start >= 3) && !memcmp(start, "\n\r\n", 3) ) { its_here = 1; off = 3; } if ( (end - start >= 4) && !memcmp(start, "\r\n\r\n", 4) ) { its_here = 1; off = 4; } if ( its_here ) { struct buff *body; int all_siz; obj->insertion_point = start-beg; obj->tail_length = off; a->state |= GOT_HDR ; obj->httpv_major = a->httpv_major; obj->httpv_minor = a->httpv_minor; obj->content_length = a->content_len; // b->used = ( start + off ) - beg; /* trunc first buf to header siz */ /* if requested don't cache documents without "Last-Modified" */ /* allocate data storage */ if ( a->content_len ) { if ( a->content_len > maxresident ) { /* - This object will not be stored, we will receive it in - small parts, in syncronous mode - allocate as much as we need now... */ all_siz = ROUND_CHUNKS(end-start-off); /* - mark object as 'not for store' and 'don't expand container' */ a->flags |= (ANSW_NO_STORE | ANSW_SHORT_CONTAINER); } else {/* obj is not too large */ all_siz = MIN(a->content_len, 8192); } } else { /* no Content-Len: */ char *transfer_encoding = NULL; all_siz = ROUND_CHUNKS(end-start-off); transfer_encoding = attr_value(obj->headers, "Transfer-Encoding"); if ((transfer_encoding && !strncasecmp("chunked", transfer_encoding, 7)) ) { a->flags |= (ANSW_NO_STORE | ANSW_SHORT_CONTAINER); } } body = alloc_buff(all_siz); if ( !body ) { return(-1); } // b->next = body; obj->container=obj->hot_buff = body; attach_data(start+off, end-start-off, obj->hot_buff); return(0); } p = start; while( (p < end) && ( *p == '\r' || *p == '\n' ) ) p++; if ( p < end && *p ) { char *t = (char *)memchr(p, '\n', end-p); char *tmp, *saved_tmp; holder = '\n'; if ( !t ) { t = (char *)memchr(p, '\r', end-p); holder = '\r'; } if ( !t ) return(0); if ( *t == '\n' ) { if ( *(t-1) == '\r' ) { p1 = t-1; *p1 = 0; } } *t = 0; saved_tmp = tmp = strdup(p); if ( !tmp ) return(-1); // do_redir_rewrite_header(&tmp, rq, NULL); analyze_header(tmp, a); if ( add_header_av(tmp, obj) ) { free(tmp); return(-1); } if ( saved_tmp != tmp ) { /* header was changed */ if ( obj ) SET(obj->flags, ANSW_HDR_CHANGED); } free(tmp); *t = holder; if ( p1 ) { *p1 = '\r'; t=p1; p1 = NULL; } a->checked = t - beg; goto go; } return(0); }