Example #1
0
void
app_shutdown(void)
{
    run_application_hook(AH_SHUTDOWN);
    log_tags_deinit();
    stats_destroy();
    dns_cache_destroy();
    child_manager_deinit();
    g_list_foreach(application_hooks, (GFunc) g_free, NULL);
    g_list_free(application_hooks);
    msg_deinit();
}
int main()
{
	char url[100] = {0};
	dns_cache_init();
	
	sprintf(url, "abc.com");
	dns_check_cache(url, strlen(url));
	sprintf(url, "def.com");
        dns_check_cache(url, strlen(url));
	sprintf(url, "ghi.com");
        dns_check_cache(url, strlen(url));
	sprintf(url, "jkl.com");
        dns_check_cache(url, strlen(url));
	sprintf(url, "mno.com");
        dns_check_cache(url, strlen(url));
	sprintf(url, "pqr.com");
        dns_check_cache(url, strlen(url));
	sprintf(url, "stu.com");
        dns_check_cache(url, strlen(url));
	sprintf(url, "wxy.com");
        dns_check_cache(url, strlen(url));
	sprintf(url, "google.com");
        dns_check_cache(url, strlen(url));
	sprintf(url, "itm.com");
        dns_check_cache(url, strlen(url));
	sprintf(url, "microsoft.com");
        dns_check_cache(url, strlen(url));			
	
	dns_dump_cache();

	dns_check_cache(url, strlen(url));
	sprintf(url, "mno.com");
        dns_check_cache(url, strlen(url));
	dns_dump_cache();
	
	dns_cache_destroy();
}
/*
Description: 	Main entry of the program. Calculate each thread's share. 
		Spawn thread and in end, consolidate all the file in one out put file.
Input: 		Standard inputs;
OutPut: 	0 for error, 1 for success.
*/
int main(int argc, char* argv[])
{
	/*local variables*/
        unsigned int numThread=0;
        FILE *fOutFile = NULL, *fThreadFile = NULL;
        struct stat stStat={0};
        int fqdnFileSize=0;
        int threadCount=0, rval=0;
	char data[65535] = {0}, threadFile[MAX_FILE_NAME]={0};
        

	//check if we have got all the required parameters.
	if (argc != 4) {
		//User is playing with us, lets talk to him :)
                printf("Help: ./DNSClient.o \"number-of-thread\" \"input-FQDN-filename\" \"output-filename\"\n");
                goto error;
        }

	//get the number of thread, and check if it is under limit.
        numThread = (int) atoi(argv[1]);
        if (numThread > 100) {
                printf("Warning: Maximum 100 threads are allowed. Number reduced to 100\n");
		numThread = 100;
        }
	//get the input fqdn file name.
	if (strlen(argv[2]) > MAX_FILE_NAME) {
		printf("Error: File name legth exceeded the maximum allowed limit %d:%d\n", strlen(argv[2]), MAX_FILE_NAME);
		goto error;
	}
	//get the output file name.
	if (strlen(argv[3]) > MAX_FILE_NAME) {
                printf("Error: File name legth exceeded the maximum allowed limit %d:%d\n", strlen(argv[3]), MAX_FILE_NAME);
                goto error;
        }


	sprintf(dnsFileName, "%s", argv[2]);
	//get the stat of the input file, to get the size.
        stat(argv[2], &stStat);
        fqdnFileSize = stStat.st_size;
        if (fqdnFileSize == 0) {
                printf("Error: Empty file\n");
                goto error;
        }

	//if number of thread are more than number of bytes available in input FQDN file.
	//then reinit the number of threads to one less than the size. so that each thread will
	//get atleast 1 byte to read.
	if (numThread >= fqdnFileSize)
		numThread = fqdnFileSize-1;

	//calculate each thread's segment.
        eachThreadShare = fqdnFileSize/numThread;
	//add one more thread of the remainder of the file.
        numThread += (fqdnFileSize%numThread)? 1:0;

	if (DNS_CLIENT_DEBUG) {
		printf("DNS_DEBUG: number of threads:%d, thread share %d bytes\n", numThread, eachThreadShare); 
	}
	//init base to fire the rocket.
        dns_init_server();
	dns_cache_init();
	pthread_mutex_init(&dns_mutex, NULL);

	//fire the threads.
        for(threadCount=0; threadCount<numThread; threadCount++) {
                rval = pthread_create(&allThread[threadCount], NULL, (void *) &DNSClientThreadFucntion, (void*)(threadCount+1));
                if (rval) {
                        printf("Error: Could not spawn all the thread(s). Return value %d\n", rval);
                        goto error;
                }
        }
	//join, wait till all the thead finishes.
        for(threadCount=0; threadCount<numThread; threadCount++) {
                rval = pthread_join(allThread[threadCount], NULL);
                if (rval) {
                        printf("Error: Could not join all the thread(s). Return value %d\n", rval);
                        goto error;
                }

        }
        printf("\nDone.\n");
	dns_cache_dump();
	//create output file.
	fOutFile = fopen(argv[3], "w+");
	if (NULL==fOutFile) {
		printf("Error:Not able to open %s\n", argv[3]);
		goto error;
	}
	
	//lets go through all the thread's file and read them write in one single output file.
	for(threadCount=1; threadCount<=numThread; threadCount++) {	
		//create thread's file name and open it, 
		sprintf(threadFile, "thread%d", threadCount);
		stat(threadFile, &stStat);
		fThreadFile = fopen(threadFile, "r");
		if (DNS_CLIENT_DEBUG) {
                	printf("DNS_DEBUG: Reading %s\n", threadFile);
        	}
		//start reading and witing chenk by chenk.
		do{
			//first read big chenks of 65000 bytes
			if(stStat.st_size > 65000) {
				fread(data, 65000, 1 , fThreadFile);
				fwrite(data,65000, 1,  fOutFile);
				stStat.st_size -= 65000;
			} else {
				//read the last leftover chunk which is less than 65000
				fread(data, stStat.st_size, 1 , fThreadFile);
                                fwrite(data,stStat.st_size, 1,  fOutFile);
                                stStat.st_size -= stStat.st_size;
			}
		}while(stStat.st_size);

		//flush all the file pointer and close it.
		fflush(fThreadFile);
		fclose(fThreadFile);		
		//unlink the inode of thread file, so that it would be deleted form file system.
		unlink(threadFile);
	}	
	
	//This function has only one return point, i.e. this section.
	error:
	pthread_mutex_destroy(&dns_mutex);
	dns_cache_destroy();
	if (fOutFile){
		fflush(fOutFile);
		fclose(fOutFile);
	}
	return 1;
}