#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