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