geoip-c 0.6.3 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +1 -0
- data/Rakefile +2 -2
- data/geoip.c +44 -58
- data/test.rb +1 -1
- metadata +2 -1
data/README.md
CHANGED
data/Rakefile
CHANGED
@@ -22,9 +22,9 @@ end
|
|
22
22
|
|
23
23
|
spec = Gem::Specification.new do |s|
|
24
24
|
s.name = 'geoip-c'
|
25
|
-
s.version = "0.
|
25
|
+
s.version = "0.7.0"
|
26
26
|
|
27
|
-
s.authors = ['Ryah Dahl', 'Matt Todd', 'Charles Brian Quinn', 'Michael Sheakoski']
|
27
|
+
s.authors = ['Ryah Dahl', 'Matt Todd', 'Charles Brian Quinn', 'Michael Sheakoski', 'Silvio Quadri']
|
28
28
|
s.email = 'mtodd@highgroove.com'
|
29
29
|
|
30
30
|
s.summary = "A Binding to the GeoIP C library"
|
data/geoip.c
CHANGED
@@ -11,6 +11,7 @@
|
|
11
11
|
|
12
12
|
static VALUE mGeoIP;
|
13
13
|
static VALUE mGeoIP_City;
|
14
|
+
static VALUE mGeoIP_Country;
|
14
15
|
static VALUE mGeoIP_Organization;
|
15
16
|
static VALUE mGeoIP_ISP;
|
16
17
|
static VALUE mGeoIP_NetSpeed;
|
@@ -148,6 +149,41 @@ VALUE rb_geoip_city_look_up(VALUE self, VALUE addr) {
|
|
148
149
|
return hash;
|
149
150
|
}
|
150
151
|
|
152
|
+
/* GeoIP::Country ************************************************************/
|
153
|
+
|
154
|
+
/* GeoIP::Country.new('/path/to/GeoIPCountry.dat')
|
155
|
+
* load_option is not required for this database because it is ignored.
|
156
|
+
*/
|
157
|
+
static VALUE rb_geoip_country_new(int argc, VALUE *argv, VALUE self)
|
158
|
+
{
|
159
|
+
return rb_geoip_database_new(mGeoIP_Country, argc, argv, self);
|
160
|
+
}
|
161
|
+
|
162
|
+
/* Pass this function an IP address as a string, it will return a hash
|
163
|
+
* containing all the information that the database knows about the IP
|
164
|
+
* db.look_up('24.24.24.24')
|
165
|
+
* => {:country_code=>"US",
|
166
|
+
* :country_code3=>"USA",
|
167
|
+
* :country_name=>"United States"}
|
168
|
+
*/
|
169
|
+
VALUE rb_geoip_country_look_up(VALUE self, VALUE addr) {
|
170
|
+
GeoIP *gi;
|
171
|
+
VALUE hash = Qnil;
|
172
|
+
int country_id;
|
173
|
+
|
174
|
+
Check_Type(addr, T_STRING);
|
175
|
+
Data_Get_Struct(self, GeoIP, gi);
|
176
|
+
country_id = GeoIP_id_by_addr(gi, STR2CSTR(addr));
|
177
|
+
if(country_id < 1) return Qnil;
|
178
|
+
|
179
|
+
hash = rb_hash_new();
|
180
|
+
rb_hash_sset(hash, "country_code", rb_str_new2(GeoIP_country_code[country_id]));
|
181
|
+
rb_hash_sset(hash, "country_code3", rb_str_new2(GeoIP_country_code3[country_id]));
|
182
|
+
rb_hash_sset(hash, "country_name", rb_str_new2(GeoIP_country_name[country_id]));
|
183
|
+
|
184
|
+
return hash;
|
185
|
+
}
|
186
|
+
|
151
187
|
/* GeoIP::Organization *******************************************************/
|
152
188
|
|
153
189
|
/* GeoIP::Organization.new('/path/to/GeoIPOrg.dat', load_option)
|
@@ -267,62 +303,9 @@ VALUE rb_geoip_addr_to_num(VALUE self, VALUE addr) {
|
|
267
303
|
return UINT2NUM((unsigned int)_GeoIP_addr_to_num(STR2CSTR(addr)));
|
268
304
|
}
|
269
305
|
|
270
|
-
|
271
|
-
|
272
|
-
*
|
273
|
-
* This was originally a slightly patched version of the function found in the
|
274
|
-
* GeoIP library called _GeoIP_num_to_addr with the same declaration but
|
275
|
-
* instead a slight variation has been used here.
|
276
|
-
*
|
277
|
-
* The function definition this replaces follows:
|
278
|
-
* char *ret_str;
|
279
|
-
* char *cur_str;
|
280
|
-
* int octet[4];
|
281
|
-
* int num_chars_written, i;
|
282
|
-
*
|
283
|
-
* ret_str = malloc(sizeof(char) * 16);
|
284
|
-
* memset(ret_str, '\0', sizeof(char) * 16); // ensure we null-terminate the string
|
285
|
-
* cur_str = ret_str;
|
286
|
-
*
|
287
|
-
* for (i = 0; i<4; i++) {
|
288
|
-
* octet[3 - i] = ipnum % 256;
|
289
|
-
* ipnum >>= 8;
|
290
|
-
* }
|
291
|
-
*
|
292
|
-
* for (i = 0; i<4; i++) {
|
293
|
-
* num_chars_written = sprintf(cur_str, "%d", octet[i]);
|
294
|
-
* cur_str += num_chars_written;
|
295
|
-
*
|
296
|
-
* if (i < 3) {
|
297
|
-
* cur_str[0] = '.';
|
298
|
-
* cur_str++;
|
299
|
-
* }
|
300
|
-
* }
|
301
|
-
*
|
302
|
-
* return ret_str;
|
303
|
-
*
|
304
|
-
* I make no assertions about speed or efficiency here. There is no error
|
305
|
-
* handling (in case of malloc failing), also.
|
306
|
-
*
|
307
|
-
* However, this works on 64bit platforms, where the previous implementation
|
308
|
-
* did not.
|
309
|
-
*/
|
310
|
-
char *_patched_GeoIP_num_to_addr(GeoIP* gi, unsigned long ipnum) {
|
311
|
-
char *ip;
|
312
|
-
int i, octet[4];
|
313
|
-
|
314
|
-
ip = malloc(sizeof(char) * 16);
|
315
|
-
memset(ip, '\0', sizeof(char) * 16);
|
316
|
-
|
317
|
-
for(i = 0; i < 4; i++)
|
318
|
-
{
|
319
|
-
octet[i] = (ipnum >> (i*8)) & 0xFF;
|
320
|
-
}
|
321
|
-
|
322
|
-
sprintf(ip, "%i.%i.%i.%i", octet[3], octet[2], octet[1], octet[0]);
|
323
|
-
|
324
|
-
return ip;
|
325
|
-
}
|
306
|
+
// Fixes a bug with 64bit architectures where this delcaration doesn't exist
|
307
|
+
// in the GeoIP library causing segmentation faults.
|
308
|
+
char *_GeoIP_num_to_addr(GeoIP* gi, unsigned long ipnum);
|
326
309
|
|
327
310
|
VALUE rb_geoip_num_to_addr(VALUE self, VALUE num) {
|
328
311
|
VALUE num_type = TYPE(num);
|
@@ -331,8 +314,7 @@ VALUE rb_geoip_num_to_addr(VALUE self, VALUE num) {
|
|
331
314
|
case T_BIGNUM: break;
|
332
315
|
default: rb_raise(rb_eTypeError, "wrong argument type %s (expected Fixnum or Bignum)", rb_obj_classname(num));
|
333
316
|
}
|
334
|
-
|
335
|
-
return rb_str_new2((char*)_patched_GeoIP_num_to_addr(NULL, (unsigned long)NUM2ULONG(num)));
|
317
|
+
return rb_str_new2((char*)_GeoIP_num_to_addr(NULL, (unsigned long)NUM2ULONG(num)));
|
336
318
|
}
|
337
319
|
|
338
320
|
void Init_geoip()
|
@@ -347,6 +329,10 @@ void Init_geoip()
|
|
347
329
|
rb_define_singleton_method(mGeoIP_City, "new", rb_geoip_city_new, -1);
|
348
330
|
rb_define_method( mGeoIP_City, "look_up", rb_geoip_city_look_up, 1);
|
349
331
|
|
332
|
+
mGeoIP_Country = rb_define_class_under(mGeoIP, "Country", rb_cObject);
|
333
|
+
rb_define_singleton_method(mGeoIP_Country, "new", rb_geoip_country_new, -1);
|
334
|
+
rb_define_method( mGeoIP_Country, "look_up", rb_geoip_country_look_up, 1);
|
335
|
+
|
350
336
|
mGeoIP_Organization = rb_define_class_under(mGeoIP, "Organization", rb_cObject);
|
351
337
|
rb_define_singleton_method(mGeoIP_Organization, "new", rb_geoip_org_new, -1);
|
352
338
|
rb_define_method( mGeoIP_Organization, "look_up", rb_geoip_org_look_up, 1);
|
data/test.rb
CHANGED
@@ -51,7 +51,7 @@ class GeoIPTest < Test::Unit::TestCase
|
|
51
51
|
end
|
52
52
|
|
53
53
|
def test_num_to_addr_converts_large_ipnums_to_an_ip_correctly
|
54
|
-
|
54
|
+
assert_equal @large_ip, GeoIP.num_to_addr(@large_ipnum)
|
55
55
|
end
|
56
56
|
|
57
57
|
def test_num_to_addr_expects_a_numeric_ip
|
metadata
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: geoip-c
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryah Dahl
|
8
8
|
- Matt Todd
|
9
9
|
- Charles Brian Quinn
|
10
10
|
- Michael Sheakoski
|
11
|
+
- Silvio Quadri
|
11
12
|
autorequire:
|
12
13
|
bindir: bin
|
13
14
|
cert_chain: []
|