#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.
|
1.3.4