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; }
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); }