#include "geotrace.h"

struct sockaddr_in address;
char *buffer,*getbuf,tmpgeofile[]="/tmp/geotrace.output";
int send_socket;

void get_netgeo_info (char *request) {
	FILE *outfile;
	int retval;

	if (debug_mode)
	        fprintf (stdout,"(netgeoclient.c) get_netgeo_info\n");
	buffer = malloc (strlen(GEO_STRING)+strlen(request)+2);
	memset(buffer,0,strlen(GEO_STRING)+strlen(request)+2);
	strcat (buffer,GEO_STRING);
	strcat (buffer,request);	
	strcat (buffer,"\n");
	outfile = fopen (tmpgeofile,"w");

	send_socket = socket(PF_INET,SOCK_STREAM,0);
        address.sin_family = AF_INET;
        address.sin_addr.s_addr = inet_addr("192.172.226.77");
        address.sin_port = htons(80);
	if (connect(send_socket,(struct sockaddr *)&address,sizeof(address))<0) {
		fprintf (stderr,"Error connecting to netgeo server\n");
		exit (1);
	}
	send (send_socket,buffer,strlen(buffer),0);
	getbuf = malloc (201);
	do {
		retval = recv(send_socket,getbuf,200,0);
		getbuf[retval] = '\0';
		fputs (getbuf,outfile);
	} while (retval > 0);
	close(send_socket);
	fclose (outfile);
	free (buffer);
	free (getbuf);
	parse_netgeo_response();
	remove (tmpgeofile);
}

void parse_netgeo_response() {
	struct netgeo_format *parse_node;
	FILE *infile;
	char tmpstr[100],*tmpstr2,*tmpstr3;

	if (debug_mode)
	        fprintf (stdout,"(netgeoclient.c) parse_netgeo_response\n");
	parse_node = malloc (sizeof(struct netgeo_format));
	infile = fopen (tmpgeofile,"r");
	fscanf(infile,"%[^\n]\n",tmpstr);
	while (strchr(tmpstr,':')==NULL) 
		fscanf(infile,"%[^\n]\n",tmpstr);
	while (!feof(infile)) {
		if (strchr(tmpstr,':')!= NULL) {
			tmpstr2 = strtok (tmpstr,":");
			tmpstr3 = strtok (NULL,"<");
			while (tmpstr3[0]==' ')
				tmpstr3++;
			if (strcmp(tmpstr,"TARGET")==0) {
				parse_node->target = malloc (strlen(tmpstr3)+1);
				sprintf (parse_node->target,tmpstr3);
			} else if (strcmp(tmpstr,"CITY")==0) {
				if (strcmp(tmpstr3,"")==0) {
					parse_node->city = malloc (9);
					sprintf (parse_node->city,"(unknown)");
				} else {
					parse_node->city = malloc (strlen(tmpstr3)+1);
					sprintf (parse_node->city,tmpstr3);
				}
			} else if (strcmp(tmpstr,"STATE")==0) {
				if (strcmp(tmpstr3,"")==0) {
					parse_node->state = malloc (9);
					sprintf (parse_node->state,"(unknown)");
				} else {
					parse_node->state = malloc (strlen(tmpstr3)+1);
					sprintf (parse_node->state,tmpstr3);
				}
			} else if (strcmp(tmpstr,"COUNTRY")==0) {
				if (strcmp(tmpstr3,"")==0) {
					parse_node->country = malloc (9);
					sprintf (parse_node->country,"(unknown)");
				} else {
					parse_node->country = malloc (strlen(tmpstr3)+1);
					sprintf (parse_node->country,tmpstr3);
				}
			} else if (strcmp(tmpstr,"LAT")==0) {
				sscanf (tmpstr3,"%f",&parse_node->lat);
			} else if (strcmp(tmpstr,"LONG")==0) {
				sscanf (tmpstr3,"%f",&parse_node->lon);
			}
		} else {
			gdk_threads_enter();
			set_list_data (parse_node);
			gdk_threads_leave();
		}
		fscanf(infile,"%[^\n]\n",tmpstr);
	}
	gdk_threads_enter();
	set_list_data (parse_node);
	gdk_threads_leave();
	fclose (infile);
	free (parse_node);
}

void set_list_data (struct netgeo_format *newinfo) {
	struct trace_node *traceroute_node;
	char *lat_lon_string;

	if (debug_mode)
	        fprintf (stdout,"(netgeoclient.c) set_list_data\n");
	lat_lon_string = malloc (20);
	strcpy(lat_lon_string,format_lat_lon(newinfo->lat,newinfo->lon));
	traceroute_node = malloc (sizeof(struct trace_node));
	traceroute_node = (struct trace_node *)(g_list_find_custom 
		(trace_linked_list,newinfo->target,
		(GCompareFunc)compare_target_to_ip)->data);
	traceroute_node->location = malloc (strlen(newinfo->city)+
		strlen(newinfo->state)+strlen(newinfo->country)+
		strlen(lat_lon_string)+12);
	sprintf (traceroute_node->location,"%s, %s, %s   (%s)",
		newinfo->city,newinfo->state,newinfo->country,lat_lon_string);
	traceroute_node->lon = newinfo->lon;
	traceroute_node->lat = newinfo->lat;
	free (lat_lon_string);
}

int compare_target_to_ip (void *list_data,char *target) {
	if (((struct trace_node *)list_data)->ip == NULL)
		return (-1);
	return (g_strcasecmp(((struct trace_node *)list_data)->ip,target));
}


syntax highlighted by Code2HTML, v. 0.9.1