STATIC
int start_http_get_task(const char *uri, int uri_len, pseudo_con_t *pcon)
{
    char *p;
    char *p2;
    int len;
    int rv;
    const char *host;
    int hostlen;
    u_int32_t attrs;
    int hdrcnt;

    if (!uri || !uri_len || (uri_len <= 7)) {
    	DBG("Invalid args, uri=%p uri_len=%d", uri, uri_len);
    	return 1;
    }

    // uri = http://{host}:{port}/{uri}
    p = memchr(uri+7, '/', uri_len-7);
    if (!p) {
        TSTR(uri, uri_len, p_uri);
    	DBG("Invalid(1) URI=%s", p_uri);
	return 2;
    }
    len = uri_len - (p - uri);

    p2 = memchr(p, '?', len);
    if (p2) {
    	len = p2 - p;
    }

    hostlen=0;
    if (CHECK_HTTP_FLAG(&pcon->con.con.http, HRF_FORWARD_PROXY) ||
        (pcon->flags & PC_FL_VIRTUAL_DOMAIN_REVERSE_PROXY) ||
	(pcon->flags & PC_FL_TRANSPARENT_REVERSE_PROXY)) {
        get_known_header(&pcon->con.con.http.hdr, MIME_HDR_HOST, 
			     &host, &hostlen, &attrs, &hdrcnt);
    }
    if (pcon->uol.cod == NKN_COD_NULL) {
    	char *cache_uri;
	size_t cachelen;
    	cache_uri = nstoken_to_uol_uri(pcon->con.con.http.ns_token, p, len, 
					host, hostlen, &cachelen);
    	if (!cache_uri) {
	    TSTR(uri, uri_len, p_uri);
	    DBG("malloc() failed for uri=%p", p_uri);
	    return 3;
	}
	pcon->uol.cod = nkn_cod_open(cache_uri, cachelen, NKN_COD_GET_MGR);
	if (pcon->uol.cod == NKN_COD_NULL) {
	    DBG("nkn_cod_open(%s) failed", cache_uri);
	    free(cache_uri);
	    return 4;
	}
	free(cache_uri);
    }

    rv = insert_if_unique(pcon);
    if (rv) {
        TSTR(uri, uri_len, p_uri);
    	DBG("Request ignored since GET already pending for uri=%p", p_uri);
	return 5;
    }

    rv = sched_get_task(pcon);
    if (rv) {
    	DBG("sched_get_task() failed, rv=%d", rv);
        return rv+10;
    }
    return 0;
}
示例#2
0
main(int argc, char * argv[])
{
	int the_char;
	int size;
	struct stat st;
	char * current_block;
	int loop = 0;
	int args;
	int file_block_count;

	if(argc < 2)
	{
		printf("Name the file(s) to be analyzed\n");
		return -1;
	}

	handlers = malloc(sizeof(FILE *) * (argc - 1));

	for(args = 1; args < argc; args++)
	{
		handlers[args - 1] = fopen(argv[args], "r");

		if(handlers[args - 1] == NULL)
		{
			printf("File path %s is invalid.\n", argv[args]);
			return -1;
		}

		stat(argv[args], &st);
		size = st.st_size;
		printf("size in bytes of %s: %d\n", argv[args], size);

		block_count += (size) / partition;
		file_block_count = (size) / partition;

		if(((size) % partition) > 0)
		{
			block_count++;
			file_block_count++;
		}

		printf("block count for %s: %d\n", argv[args], file_block_count);
	}

	printf("Total blocks: %d\n", block_count);
	blocks = malloc(sizeof(char *) * block_count);

	for(args = 1; args < argc; args++)
	{
		while((the_char = fgetc(handlers[args - 1])) != EOF)
		{
			if(flag)
			{
				current_block = malloc((sizeof(char) * partition) + 1);
				bucket = 0;
				flag = 0;
			}

			current_block[bucket++] = (char) the_char;

			if(bucket == partition)
			{
				current_block[partition] = '\0';
				flag = 1;
				insert_if_unique(current_block);
				free(current_block);
			}
		}

		if(flag == 0)
		{
			current_block[bucket] = '\0';
			insert_if_unique(current_block);
			free(current_block);
		}

		flag = 1;
	}

	printf("Unique blocks: %d\n", num_blocks);
	printf("Dedup rate: %f\n", (1 - ((double)num_blocks / block_count)) * 100);
}