Esempio n. 1
0
// 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);
}