#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <errno.h>
Go to the source code of this file.
Data Structures | |
struct | ipgeo_context |
Defines | |
#define | LIBIPG_VERSION "1.0" |
#define | LIBIPG_BIG_ENDIAN 1 |
#define | IPGEO_BUF_SIZE 512 |
#define | IPGEO_ERRBUF_SIZE 256 |
Typedefs | |
typedef ipgeo_context | ipgeo_t |
Functions | |
ipgeo_t * | ipgeo_init (char *file, u_int8_t flags, char *err_buf) |
void | ipgeo_destroy (ipgeo_t *ipg) |
u_int32_t | ipgeo_ipa2ipn (char *ip) |
int | ipgeo_lookup (u_int32_t ipn, u_int8_t flags, ipgeo_t *ipg) |
char * | ipgeo_get_cc (ipgeo_t *ipg) |
char * | ipgeo_get_country (ipgeo_t *ipg) |
char * | ipgeo_get_region (ipgeo_t *ipg) |
char * | ipgeo_get_city (ipgeo_t *ipg) |
char * | ipgeo_get_isp (ipgeo_t *ipg) |
double | ipgeo_get_lat (ipgeo_t *ipg) |
double | ipgeo_get_long (ipgeo_t *ipg) |
char * | ipgeo_geterror (ipgeo_t *ipg) |
int | ipgeo_getfd (ipgeo_t *ipg) |
int | ipgeo_getdbt (ipgeo_t *ipg) |
Definition in file libipg.h.
|
current libipg version |
|
libipg works with multibyte numbers and needs to know how they're ordered |
|
internal work buffers Definition at line 88 of file libipg.h. Referenced by ipgeo_lookup(). |
|
ipgeo_t is the monolithic datatype describing an ipgeo session Definition at line 110 of file libipg.h. Referenced by ipgeo_destroy(), ipgeo_get_cc(), ipgeo_get_city(), ipgeo_get_country(), ipgeo_get_isp(), ipgeo_get_lat(), ipgeo_get_long(), ipgeo_get_region(), ipgeo_getdbt(), ipgeo_geterror(), ipgeo_getfd(), ipgeo_init(), and ipgeo_lookup(). |
|
only CSV db type currently supported control flags are currently undefined Definition at line 49 of file libipg_init.c. References ipgeo_context::db, ipgeo_context::dbt, ipgeo_context::flags, and ipgeo_t.
00050 { 00051 ipgeo_t *ipg = NULL; 00052 00053 ipg = (ipgeo_t *)malloc(sizeof (ipgeo_t)); 00054 if (ipg == NULL) 00055 { 00056 snprintf(err_buf, IPGEO_ERRBUF_SIZE, "malloc(): %s\n", strerror(errno)); 00057 goto bad; 00058 } 00059 00060 memset(ipg, 0, sizeof (ipg)); 00061 00062 ipg->db = fopen(file, "r"); 00063 if (ipg->db == NULL) 00064 { 00065 snprintf(err_buf, IPGEO_ERRBUF_SIZE, "fopen() (%s): %s\n", file, 00066 strerror(errno)); 00067 goto bad; 00068 } 00069 00071 ipg->dbt = 6; 00072 00074 ipg->flags = flags; 00075 00076 return (ipg); 00077 00078 bad: 00079 if (ipg) 00080 { 00081 if (ipg->db) 00082 { 00083 fclose(ipg->db); 00084 } 00085 free (ipg); 00086 } 00087 return (NULL); 00088 } |
|
Shuts down the libipg session and frees all memory referenced by ipg.
Definition at line 91 of file libipg_init.c. References ipgeo_context::db, and ipgeo_t.
|
|
currently we don't deal with hostnames; ip has to be dots n decimals compute first byte (256^3 * o1) compute second byte (256^2 * o2) compute third byte (256 * o3) compute fourth byte (o4) Definition at line 50 of file libipg_lookup.c.
00051 { 00052 char *p = ip; 00053 u_int32_t o1, o2, o3, o4; 00054 00056 if (!isdigit(ip[0])) 00057 { 00058 return (0); 00059 } 00060 00062 o1 = 16777216 * atol(strsep(&p, ".")); 00063 00065 o2 = 65536 * atol(strsep(&p, ".")); 00066 00068 o3 = 256 * atol(strsep(&p, ".")); 00069 00071 o4 = atol(strsep(&p, ".")); 00072 00073 return (o1 + o2 + o3 + o4); 00074 } |
|
Definition at line 77 of file libipg_lookup.c. References ipgeo_context::cc, ipgeo_context::city, ipgeo_context::country, ipgeo_context::db, IPGEO_BUF_SIZE, ipgeo_t, ipgeo_context::isp, ipgeo_context::latitude, ipgeo_context::longitude, and ipgeo_context::region.
00078 { 00079 int n; 00080 char *p, *q; 00081 u_int32_t min, max; 00082 char buf[IPGEO_BUF_SIZE]; 00083 00084 if (ipg == NULL) 00085 { 00086 return (-1); 00087 } 00088 00089 #if (LIBIPG_LIL_ENDIAN) 00090 ipn = htonl(ipn); 00091 #endif 00092 00093 /* perform a linear search through the CSV file */ 00094 for (; fgets(buf, IPGEO_BUF_SIZE - 1, ipg->db); ) 00095 { 00096 if (buf[0] == '#') 00097 { 00098 /* ignore comments */ 00099 continue; 00100 } 00101 00102 p = buf; 00103 00104 /* step over quote */ 00105 p += 1; 00106 min = strtoul(strsep(&p, ","), (char **)NULL, 10); 00107 00108 /* step over quote */ 00109 p += 1; 00110 max = strtoul(strsep(&p, ","), (char **)NULL, 10); 00111 00112 if (ipn >= min && ipn <= max) 00113 { 00114 p += 1; 00115 q = strsep(&p, ","); 00116 for (n = 0; n < sizeof(ipg->cc) - 1; n++) 00117 { 00118 if (q[n] == '"') 00119 { 00120 ipg->cc[n] = NULL; 00121 break; 00122 } 00123 ipg->cc[n] = q[n]; 00124 } 00125 00126 /* get cc */ 00127 p += 1; 00128 q = strsep(&p, ","); 00129 for (n = 0; n < sizeof(ipg->country) - 1; n++) 00130 { 00131 if (q[n] == '"') 00132 { 00133 ipg->country[n] = NULL; 00134 break; 00135 } 00136 ipg->country[n] = q[n]; 00137 } 00138 00139 /* get country */ 00140 p += 1; 00141 q = strsep(&p, ","); 00142 for (n = 0; n < sizeof(ipg->region) - 1; n++) 00143 { 00144 if (q[n] == '"') 00145 { 00146 ipg->region[n] = NULL; 00147 break; 00148 } 00149 ipg->region[n] = q[n]; 00150 } 00151 00152 /* get city */ 00153 p += 1; 00154 q = strsep(&p, ","); 00155 for (n = 0; n < sizeof(ipg->city) - 1; n++) 00156 { 00157 if (q[n] == '"') 00158 { 00159 ipg->city[n] = NULL; 00160 break; 00161 } 00162 ipg->city[n] = q[n]; 00163 } 00164 00165 /* get latitude */ 00166 p += 1; 00167 ipg->latitude = strtod(strsep(&p, ","), (char **)NULL); 00168 00169 /* get longitude */ 00170 p += 1; 00171 ipg->longitude = strtod(strsep(&p, ","), (char **)NULL); 00172 00173 /* get isp */ 00174 p += 1; 00175 q = strsep(&p, ","); 00176 for (n = 0; n < sizeof(ipg->isp) - 1; n++) 00177 { 00178 if (q[n] == '"') 00179 { 00180 ipg->isp[n] = NULL; 00181 break; 00182 } 00183 ipg->isp[n] = q[n]; 00184 } 00185 00186 rewind(ipg->db); 00187 return (1); 00188 } 00189 } 00190 /* no match */ 00191 return (0); 00192 } |
|
Returns the country code for the most recent ipgeo db lookup. The function must be called after a successful call to ipgeo_lookup().
Definition at line 195 of file libipg_lookup.c. References ipgeo_context::cc, and ipgeo_t.
|
|
Returns the country for the most recent ipgeo db lookup. The function must be called after a successful call to ipgeo_lookup().
Definition at line 205 of file libipg_lookup.c. References ipgeo_context::country, and ipgeo_t.
|
|
Returns the region for the most recent ipgeo db lookup. The function must be called after a successful call to ipgeo_lookup().
Definition at line 215 of file libipg_lookup.c. References ipgeo_t, and ipgeo_context::region.
|
|
Returns the city for the most recent ipgeo db lookup. The function must be called after a successful call to ipgeo_lookup().
Definition at line 225 of file libipg_lookup.c. References ipgeo_context::city, and ipgeo_t.
|
|
Returns the isp for the most recent ipgeo db lookup. The function must be called after a successful call to ipgeo_lookup().
Definition at line 235 of file libipg_lookup.c. References ipgeo_t, and ipgeo_context::isp.
|
|
Returns the latitude for the most recent ipgeo db lookup. The function must be called after a successful call to ipgeo_lookup().
Definition at line 245 of file libipg_lookup.c. References ipgeo_t, and ipgeo_context::latitude.
00246 { 00247 return (ipg->latitude); 00248 } |
|
Returns the longitude for the most recent ipgeo db lookup. The function must be called after a successful call to ipgeo_lookup().
Definition at line 251 of file libipg_lookup.c. References ipgeo_t, and ipgeo_context::longitude.
00252 { 00253 return (ipg->longitude); 00254 } |
|
Returns the last error set inside of the referenced libipg context. This function should be called anytime a function fails or an error condition is detected inside of libipg.
Definition at line 104 of file libipg_init.c. References ipgeo_context::err_buf, and ipgeo_t.
00105 { 00106 return (ipg->err_buf); 00107 } |
|
we should not return -1 here since any error should be caught during initialization Definition at line 120 of file libipg_init.c. References ipgeo_context::db, and ipgeo_t.
|
|
Returns the type of IP2LOCATION db libipg has open.
Definition at line 110 of file libipg_init.c. References ipgeo_context::db, ipgeo_context::dbt, and ipgeo_t.
|