ffi-geoip 0.0.1
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.
- checksums.yaml +7 -0
- data/.gitignore +23 -0
- data/.travis.yml +14 -0
- data/Gemfile +25 -0
- data/Guardfile +17 -0
- data/MIT-LICENSE +22 -0
- data/README.rdoc +22 -0
- data/Rakefile +29 -0
- data/ffi-geoip.gemspec +26 -0
- data/lib/ffi-geoip.rb +470 -0
- data/lib/ffi-geoip/base.rb +68 -0
- data/lib/ffi-geoip/city.rb +26 -0
- data/lib/ffi-geoip/country.rb +24 -0
- data/lib/ffi-geoip/isp.rb +20 -0
- data/lib/ffi-geoip/organization.rb +20 -0
- data/lib/ffi-geoip/record.rb +53 -0
- data/lib/ffi-geoip/tools.rb +26 -0
- data/lib/ffi-geoip/version.rb +6 -0
- data/test/city_tests.rb +77 -0
- data/test/country_tests.rb +51 -0
- data/test/geoip_tests.rb +50 -0
- data/test/isp_tests.rb +54 -0
- data/test/organization_tests.rb +61 -0
- data/test/test_helper.rb +53 -0
- metadata +107 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ccd128b11adeb854b516279654e8d309c9fc1c32
|
4
|
+
data.tar.gz: 05a0b119ed18f0e236b53605861914adc67e0365
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 325303b0a104fc0a63296051324a90deb16e95c317624c68ef240f3ebf9f36f25528af7b2942940ed589c8caf3f5683bbb2a3560e21f877e0b7cabda43254ad1
|
7
|
+
data.tar.gz: 12a91c22e4902b90ac83bb0b9b83247d01766efa1099d6784be12b5db5a27bdc98cc5e43ceb66a5a7c3edc61766f9fa22ccc79b5d169fc71a742f61afcd6ed77
|
data/.gitignore
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
*.orig
|
2
|
+
.*.swp
|
3
|
+
.*.swo
|
4
|
+
*.tmp
|
5
|
+
*.kpf
|
6
|
+
*.komodoproject
|
7
|
+
*~
|
8
|
+
.DS_Store
|
9
|
+
*tmp*
|
10
|
+
pkg/
|
11
|
+
doc/
|
12
|
+
coverage/
|
13
|
+
*.orig
|
14
|
+
*.patch
|
15
|
+
.vimrc_local
|
16
|
+
*.rbc
|
17
|
+
test-all.sh
|
18
|
+
.rbx
|
19
|
+
Gemfile.lock
|
20
|
+
Gemfile.local
|
21
|
+
Guardfile.local
|
22
|
+
*.dat
|
23
|
+
*.csv
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
gemspec
|
4
|
+
|
5
|
+
gem "rdoc", "~> 3.12"
|
6
|
+
gem "rake", "~> 10.0"
|
7
|
+
gem "minitest"
|
8
|
+
gem "minitest-reporters"
|
9
|
+
|
10
|
+
platforms :rbx do
|
11
|
+
gem 'rubysl', '~> 2.0'
|
12
|
+
gem 'rubinius-developer_tools'
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
if RUBY_VERSION >= '1.9'
|
17
|
+
gem "simplecov"
|
18
|
+
gem "guard"
|
19
|
+
gem 'guard-minitest'
|
20
|
+
end
|
21
|
+
|
22
|
+
if File.exists?('Gemfile.local')
|
23
|
+
instance_eval File.read('Gemfile.local')
|
24
|
+
end
|
25
|
+
|
data/Guardfile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
|
2
|
+
guard 'minitest', :test_folders => 'test', :test_file_patterns => '*_tests.rb' do
|
3
|
+
watch(%r|^test/(.+)_tests\.rb|)
|
4
|
+
|
5
|
+
watch(%r{^lib/(.*/)?([^/]+)\.rb$}) do |m|
|
6
|
+
"test/#{m[2]}_tests.rb"
|
7
|
+
end
|
8
|
+
|
9
|
+
watch(%r|^test/test_helper\.rb|) do
|
10
|
+
"test"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
if File.exists?('Guardfile.local')
|
15
|
+
instance_eval File.read('Guardfile.local')
|
16
|
+
end
|
17
|
+
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014-2015 J Smith <dark.panda@gmail.com>
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person
|
4
|
+
obtaining a copy of this software and associated documentation
|
5
|
+
files (the "Software"), to deal in the Software without
|
6
|
+
restriction, including without limitation the rights to use,
|
7
|
+
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
+
copies of the Software, and to permit persons to whom the
|
9
|
+
Software is furnished to do so, subject to the following
|
10
|
+
conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be
|
13
|
+
included in all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
17
|
+
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
19
|
+
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
20
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
21
|
+
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
22
|
+
OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
|
2
|
+
= geoip-c Ruby Bindings via FFI
|
3
|
+
|
4
|
+
== Requirements
|
5
|
+
|
6
|
+
* the ffi extension for Ruby.
|
7
|
+
* the GeoIP library version 1.5 or higher. Lower versions may work to some
|
8
|
+
extent but this is untested.
|
9
|
+
|
10
|
+
== Features
|
11
|
+
|
12
|
+
ffi-geoip is an FFI-based implementation of the native GeoIP Ruby bindings.
|
13
|
+
This gem mimics the native GeoIP bindings as closely as possible and should be
|
14
|
+
directly compatible. To test this, you can run the tests using the native
|
15
|
+
bindings via the `USE_BINARY` environment variable and they should also
|
16
|
+
succeed. A simple use-case for this extension is for, say, JRuby, where the
|
17
|
+
native GeoIP gem is not available.
|
18
|
+
|
19
|
+
== License
|
20
|
+
|
21
|
+
This gem is licensed under an MIT-style license. See the +MIT-LICENSE+ file for
|
22
|
+
details.
|
data/Rakefile
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'rubygems/package_task'
|
6
|
+
require 'rake/testtask'
|
7
|
+
require 'rdoc/task'
|
8
|
+
require 'bundler/gem_tasks'
|
9
|
+
|
10
|
+
$:.push File.expand_path(File.dirname(__FILE__), 'lib')
|
11
|
+
|
12
|
+
version = GeoIP::VERSION
|
13
|
+
|
14
|
+
desc 'Test GeoIP interface'
|
15
|
+
Rake::TestTask.new(:test) do |t|
|
16
|
+
t.test_files = FileList['test/**/*_tests.rb']
|
17
|
+
t.verbose = !!ENV['VERBOSE_TESTS']
|
18
|
+
t.warning = !!ENV['WARNINGS']
|
19
|
+
end
|
20
|
+
|
21
|
+
task :default => :test
|
22
|
+
|
23
|
+
desc 'Build docs'
|
24
|
+
Rake::RDocTask.new do |t|
|
25
|
+
t.title = "ffi-geoip #{version}"
|
26
|
+
t.main = 'README.rdoc'
|
27
|
+
t.rdoc_dir = 'doc'
|
28
|
+
t.rdoc_files.include('README.rdoc', 'MIT-LICENSE', 'lib/**/*.rb')
|
29
|
+
end
|
data/ffi-geoip.gemspec
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require File.expand_path('../lib/ffi-geoip/version', __FILE__)
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "ffi-geoip"
|
7
|
+
s.version = GeoIP::VERSION
|
8
|
+
|
9
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
10
|
+
s.authors = ["J Smith"]
|
11
|
+
s.description = "An ffi wrapper for GeoIP"
|
12
|
+
s.summary = s.description
|
13
|
+
s.email = "dark.panda@gmail.com"
|
14
|
+
s.license = "MIT"
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"README.rdoc"
|
17
|
+
]
|
18
|
+
s.files = `git ls-files`.split($\)
|
19
|
+
s.executables = s.files.grep(%r{^bin/}).map { |f| File.basename(f) }
|
20
|
+
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
21
|
+
s.homepage = "http://github.com/dark-panda/ffi-geoip"
|
22
|
+
s.require_paths = ["lib"]
|
23
|
+
|
24
|
+
s.add_dependency("ffi", [">= 1.0.0"])
|
25
|
+
end
|
26
|
+
|
data/lib/ffi-geoip.rb
ADDED
@@ -0,0 +1,470 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'ffi'
|
4
|
+
require 'rbconfig'
|
5
|
+
require 'ffi-geoip/version'
|
6
|
+
|
7
|
+
module GeoIP
|
8
|
+
GEOIP_BASE = File.join(File.dirname(__FILE__), 'ffi-geoip')
|
9
|
+
|
10
|
+
autoload :Base,
|
11
|
+
File.join(GEOIP_BASE, 'base')
|
12
|
+
|
13
|
+
autoload :City,
|
14
|
+
File.join(GEOIP_BASE, 'city')
|
15
|
+
|
16
|
+
autoload :Country,
|
17
|
+
File.join(GEOIP_BASE, 'country')
|
18
|
+
|
19
|
+
autoload :Organization,
|
20
|
+
File.join(GEOIP_BASE, 'organization')
|
21
|
+
|
22
|
+
autoload :ISP,
|
23
|
+
File.join(GEOIP_BASE, 'isp')
|
24
|
+
|
25
|
+
autoload :NetSpeed,
|
26
|
+
File.join(GEOIP_BASE, 'netspeed')
|
27
|
+
|
28
|
+
autoload :Domain,
|
29
|
+
File.join(GEOIP_BASE, 'domain')
|
30
|
+
|
31
|
+
autoload :Tools,
|
32
|
+
File.join(GEOIP_BASE, 'tools')
|
33
|
+
|
34
|
+
autoload :Record,
|
35
|
+
File.join(GEOIP_BASE, 'record')
|
36
|
+
|
37
|
+
module FFIGeoIP
|
38
|
+
def self.search_paths
|
39
|
+
@search_paths ||= begin
|
40
|
+
if ENV['GEOIP_LIBRARY_PATH']
|
41
|
+
[ ENV['GEOIP_LIBRARY_PATH'] ]
|
42
|
+
elsif FFI::Platform::IS_WINDOWS
|
43
|
+
ENV['PATH'].split(File::PATH_SEPARATOR)
|
44
|
+
else
|
45
|
+
[ '/usr/local/{lib64,lib}', '/opt/local/{lib64,lib}', '/usr/{lib64,lib}' ]
|
46
|
+
[ '/usr/local/{lib64,lib}', '/opt/local/{lib64,lib}', '/usr/{lib64,lib}', '/usr/lib/{x86_64,i386}-linux-gnu' ]
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.find_lib(lib)
|
52
|
+
if ENV['GEOIP_LIBRARY_PATH'] && File.file?(ENV['GEOIP_LIBRARY_PATH'])
|
53
|
+
ENV['GEOIP_LIBRARY_PATH']
|
54
|
+
else
|
55
|
+
Dir.glob(search_paths.map { |path|
|
56
|
+
File.expand_path(File.join(path, "#{lib}.#{FFI::Platform::LIBSUFFIX}"))
|
57
|
+
}).first
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.geoip_library_path
|
62
|
+
@geoip_library_path ||= begin
|
63
|
+
# On MingW the libraries have version numbers
|
64
|
+
find_lib('{lib,}GeoIP{,-?}')
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
extend ::FFI::Library
|
69
|
+
|
70
|
+
GeoIP::GeoIPOptions = enum(:geoip_option, [
|
71
|
+
:standard, 0,
|
72
|
+
:memory_cache, 1,
|
73
|
+
:check_cache, 2,
|
74
|
+
:index_cache, 4,
|
75
|
+
:mmap_cache, 8
|
76
|
+
])
|
77
|
+
|
78
|
+
FFI_LAYOUT = {
|
79
|
+
:GeoIP_open => [
|
80
|
+
# GeoIP*, filename, flags
|
81
|
+
:pointer, :string, :int
|
82
|
+
],
|
83
|
+
|
84
|
+
:GeoIP_delete => [
|
85
|
+
# void, GeoIP*
|
86
|
+
:void, :pointer
|
87
|
+
],
|
88
|
+
|
89
|
+
#### countries ####
|
90
|
+
# string, GeoIP*, addr
|
91
|
+
:GeoIP_country_code_by_addr => [
|
92
|
+
:string, :pointer, :string
|
93
|
+
],
|
94
|
+
|
95
|
+
# string, GeoIP*, host
|
96
|
+
:GeoIP_country_code_by_name => [
|
97
|
+
:string, :pointer, :string
|
98
|
+
],
|
99
|
+
|
100
|
+
# string, GeoIP*, addr
|
101
|
+
:GeoIP_country_code3_by_addr => [
|
102
|
+
:string, :pointer, :string
|
103
|
+
],
|
104
|
+
|
105
|
+
# string, GeoIP*, host
|
106
|
+
:GeoIP_country_code3_by_name => [
|
107
|
+
:string, :pointer, :string
|
108
|
+
],
|
109
|
+
|
110
|
+
# string, GeoIP*, addr
|
111
|
+
:GeoIP_country_name_by_addr => [
|
112
|
+
:string, :pointer, :string
|
113
|
+
],
|
114
|
+
|
115
|
+
# string, GeoIP*, host
|
116
|
+
:GeoIP_country_name_by_name => [
|
117
|
+
:string, :pointer, :string
|
118
|
+
],
|
119
|
+
|
120
|
+
# string, GeoIP*, ipnum
|
121
|
+
:GeoIP_country_name_by_ipnum => [
|
122
|
+
:string, :pointer, :ulong
|
123
|
+
],
|
124
|
+
|
125
|
+
# string, GeoIP*, ipnum
|
126
|
+
:GeoIP_country_code_by_ipnum => [
|
127
|
+
:string, :pointer, :ulong
|
128
|
+
],
|
129
|
+
|
130
|
+
# string, GeoIP*, ipnum
|
131
|
+
:GeoIP_country_code3_by_ipnum => [
|
132
|
+
:string, :pointer, :ulong
|
133
|
+
],
|
134
|
+
|
135
|
+
# # string, GeoIP*, geoipv6_t ipnum
|
136
|
+
# :GeoIP_country_name_by_ipnum_v6 => [
|
137
|
+
# :string, :pointer, :geoipv6_t
|
138
|
+
# ],
|
139
|
+
# # string, GeoIP*, geoipv6_t ipnum
|
140
|
+
# :GeoIP_country_code_by_ipnum_v6 => [
|
141
|
+
# :string, :pointer, :geoipv6_t
|
142
|
+
# ],
|
143
|
+
# # string, GeoIP*, geoipv6_t ipnum
|
144
|
+
# :GeoIP_country_code3_by_ipnum_v6 => [
|
145
|
+
# :string, :pointer, :geoipv6_t
|
146
|
+
# ],
|
147
|
+
|
148
|
+
# string, GeoIP*, addr
|
149
|
+
:GeoIP_country_code_by_addr_v6 => [
|
150
|
+
:string, :pointer, :string
|
151
|
+
],
|
152
|
+
|
153
|
+
# string, GeoIP*, host
|
154
|
+
:GeoIP_country_code_by_name_v6 => [
|
155
|
+
:string, :pointer, :string
|
156
|
+
],
|
157
|
+
|
158
|
+
# string, GeoIP*, addr
|
159
|
+
:GeoIP_country_code3_by_addr_v6 => [
|
160
|
+
:string, :pointer, :string
|
161
|
+
],
|
162
|
+
|
163
|
+
# string, GeoIP*, host
|
164
|
+
:GeoIP_country_code3_by_name_v6 => [
|
165
|
+
:string, :pointer, :string
|
166
|
+
],
|
167
|
+
|
168
|
+
# string, GeoIP*, addr
|
169
|
+
:GeoIP_country_name_by_addr_v6 => [
|
170
|
+
:string, :pointer, :string
|
171
|
+
],
|
172
|
+
|
173
|
+
# string, GeoIP*, host
|
174
|
+
:GeoIP_country_name_by_name_v6 => [
|
175
|
+
:string, :pointer, :string
|
176
|
+
],
|
177
|
+
#### /countries ####
|
178
|
+
|
179
|
+
#### IDs ####
|
180
|
+
# id, GeoIP*, addr
|
181
|
+
:GeoIP_id_by_addr => [
|
182
|
+
:int, :pointer, :string
|
183
|
+
],
|
184
|
+
|
185
|
+
# id, GeoIP*, host
|
186
|
+
:GeoIP_id_by_name => [
|
187
|
+
:int, :pointer, :string
|
188
|
+
],
|
189
|
+
|
190
|
+
# id, GeoIP*, ipnum
|
191
|
+
:GeoIP_id_by_ipnum => [
|
192
|
+
:int, :pointer, :ulong
|
193
|
+
],
|
194
|
+
|
195
|
+
# id, GeoIP*, addr
|
196
|
+
:GeoIP_id_by_addr_v6 => [
|
197
|
+
:int, :pointer, :string
|
198
|
+
],
|
199
|
+
|
200
|
+
# id, GeoIP*, host
|
201
|
+
:GeoIP_id_by_name_v6 => [
|
202
|
+
:int, :pointer, :string
|
203
|
+
],
|
204
|
+
|
205
|
+
# # id, GeoIP*, ipnum
|
206
|
+
# :GeoIP_id_by_ipnum_v6 => [
|
207
|
+
# :int, :pointer, :geoipv6_t
|
208
|
+
# ],
|
209
|
+
#### /IDs ####
|
210
|
+
|
211
|
+
#### regions ####
|
212
|
+
# GeoIPRegion*, GeoIP*, addr
|
213
|
+
:GeoIP_region_by_addr => [
|
214
|
+
:pointer, :pointer, :string
|
215
|
+
],
|
216
|
+
|
217
|
+
# GeoIPRegion*, GeoIP*, host
|
218
|
+
:GeoIP_region_by_name => [
|
219
|
+
:pointer, :pointer, :string
|
220
|
+
],
|
221
|
+
|
222
|
+
# GeoIPRegion*, GeoIP*, ipnum
|
223
|
+
:GeoIP_region_by_ipnum => [
|
224
|
+
:pointer, :pointer, :ulong
|
225
|
+
],
|
226
|
+
|
227
|
+
# GeoIPRegion*, GeoIP*, addr
|
228
|
+
:GeoIP_region_by_addr_v6 => [
|
229
|
+
:pointer, :pointer, :string
|
230
|
+
],
|
231
|
+
|
232
|
+
# GeoIPRegion*, GeoIP*, host
|
233
|
+
:GeoIP_region_by_name_v6 => [
|
234
|
+
:pointer, :pointer, :string
|
235
|
+
],
|
236
|
+
|
237
|
+
# # GeoIPRegion*, GeoIP*, ipnum
|
238
|
+
# :GeoIP_region_by_ipnum_v6 => [
|
239
|
+
# :pointer, :pointer, :geoipv6_t
|
240
|
+
# ],
|
241
|
+
|
242
|
+
# void, GeoIPRegion*
|
243
|
+
:GeoIPRegion_delete => [
|
244
|
+
:void, :pointer
|
245
|
+
],
|
246
|
+
#### /region
|
247
|
+
|
248
|
+
#### organization names ####
|
249
|
+
# name, GeoIP*, ipnum
|
250
|
+
:GeoIP_name_by_ipnum => [
|
251
|
+
:string, :pointer, :ulong
|
252
|
+
],
|
253
|
+
# name, GeoIP*, addr
|
254
|
+
:GeoIP_name_by_addr => [
|
255
|
+
:string, :pointer, :string
|
256
|
+
],
|
257
|
+
# name, GeoIP*, host
|
258
|
+
:GeoIP_name_by_name => [
|
259
|
+
:string, :pointer, :string
|
260
|
+
],
|
261
|
+
|
262
|
+
# # name, GeoIP*, ipnum
|
263
|
+
# :GeoIP_name_by_ipnum_v6 => [
|
264
|
+
# :string, :pointer, :geoipv6_t
|
265
|
+
# ],
|
266
|
+
|
267
|
+
# name, GeoIP*, addr
|
268
|
+
:GeoIP_name_by_addr_v6 => [
|
269
|
+
:string, :pointer, :string
|
270
|
+
],
|
271
|
+
# name, GeoIP*, host
|
272
|
+
:GeoIP_name_by_name_v6 => [
|
273
|
+
:string, :pointer, :string
|
274
|
+
],
|
275
|
+
#### /organization names ####
|
276
|
+
|
277
|
+
#### fetch by IDs ####
|
278
|
+
# string, id
|
279
|
+
:GeoIP_code_by_id => [
|
280
|
+
:string, :int
|
281
|
+
],
|
282
|
+
|
283
|
+
# string, id
|
284
|
+
:GeoIP_code3_by_id => [
|
285
|
+
:string, :int
|
286
|
+
],
|
287
|
+
|
288
|
+
# string, GeoIP*, id
|
289
|
+
:GeoIP_country_name_by_id => [
|
290
|
+
:string, :pointer, :int
|
291
|
+
],
|
292
|
+
|
293
|
+
# string, id
|
294
|
+
:GeoIP_name_by_id => [
|
295
|
+
:string, :int
|
296
|
+
],
|
297
|
+
|
298
|
+
# string, id
|
299
|
+
:GeoIP_continent_by_id => [
|
300
|
+
:string, :int
|
301
|
+
],
|
302
|
+
|
303
|
+
# id, country
|
304
|
+
:GeoIP_id_by_code => [
|
305
|
+
:int, :string
|
306
|
+
],
|
307
|
+
#### /fetch by IDs ####
|
308
|
+
|
309
|
+
#### full city records ####
|
310
|
+
# GeoIPRecord*, GeoIP*, ipnum
|
311
|
+
:GeoIP_record_by_ipnum => [
|
312
|
+
GeoIP::Record, :pointer, :ulong
|
313
|
+
],
|
314
|
+
|
315
|
+
# GeoIPRecord*, GeoIP*, addr
|
316
|
+
:GeoIP_record_by_addr => [
|
317
|
+
GeoIP::Record, :pointer, :string
|
318
|
+
],
|
319
|
+
|
320
|
+
# GeoIPRecord*, GeoIP*, host
|
321
|
+
:GeoIP_record_by_name => [
|
322
|
+
GeoIP::Record, :pointer, :string
|
323
|
+
],
|
324
|
+
|
325
|
+
# # GeoIPRecord*, GeoIP*, geoipv6_t ipnum
|
326
|
+
# :GeoIP_record_by_ipnum_v6 => [
|
327
|
+
# :pointer, :pointer, :geoipv6_t
|
328
|
+
# ],
|
329
|
+
|
330
|
+
# GeoIPRecord*, GeoIP*, addr
|
331
|
+
:GeoIP_record_by_addr_v6 => [
|
332
|
+
GeoIP::Record, :pointer, :string
|
333
|
+
],
|
334
|
+
|
335
|
+
# GeoIPRecord*, GeoIP*, host
|
336
|
+
:GeoIP_record_by_name_v6 => [
|
337
|
+
GeoIP::Record, :pointer, :string
|
338
|
+
],
|
339
|
+
|
340
|
+
# record ID, GeoIP*, addr
|
341
|
+
:GeoIP_record_id_by_addr => [
|
342
|
+
:int, :pointer, :string
|
343
|
+
],
|
344
|
+
|
345
|
+
# record ID, GeoIP*, string
|
346
|
+
:GeoIP_record_id_by_addr_v6 => [
|
347
|
+
:int, :pointer, :string
|
348
|
+
],
|
349
|
+
|
350
|
+
# void, GeoIPRecord*
|
351
|
+
:GeoIPRecord_delete => [
|
352
|
+
:void, GeoIP::Record
|
353
|
+
],
|
354
|
+
#### /full record
|
355
|
+
|
356
|
+
#### utility functions ####
|
357
|
+
# num, void
|
358
|
+
:GeoIP_num_countries => [
|
359
|
+
:uint
|
360
|
+
],
|
361
|
+
|
362
|
+
# info, GeoIP*
|
363
|
+
:GeoIP_database_info => [
|
364
|
+
:string, :pointer
|
365
|
+
],
|
366
|
+
|
367
|
+
# edition, GeoIP*
|
368
|
+
:GeoIP_database_edition => [
|
369
|
+
:uchar, :pointer
|
370
|
+
],
|
371
|
+
|
372
|
+
# int, GeoIP*
|
373
|
+
:GeoIP_charset => [
|
374
|
+
:int, :pointer
|
375
|
+
],
|
376
|
+
|
377
|
+
# int, GeoIP*, charset
|
378
|
+
:GeoIP_set_charset => [
|
379
|
+
:int, :pointer, :int
|
380
|
+
],
|
381
|
+
|
382
|
+
# int, GeoIP*, true/false
|
383
|
+
:GeoIP_enable_teredo => [
|
384
|
+
:int, :pointer, :int
|
385
|
+
],
|
386
|
+
|
387
|
+
# int, GeoIP*
|
388
|
+
:GeoIP_teredo => [
|
389
|
+
:int, :pointer
|
390
|
+
],
|
391
|
+
|
392
|
+
# int, GeoIP*
|
393
|
+
:GeoIP_last_netmask => [
|
394
|
+
:int, :pointer
|
395
|
+
],
|
396
|
+
|
397
|
+
# char**, GeoIP*, addr
|
398
|
+
:GeoIP_range_by_ip => [
|
399
|
+
:pointer, :pointer, :string
|
400
|
+
],
|
401
|
+
|
402
|
+
# ipnum, addr
|
403
|
+
:GeoIP_addr_to_num => [
|
404
|
+
:ulong, :string
|
405
|
+
],
|
406
|
+
|
407
|
+
# addr, ipnum
|
408
|
+
:GeoIP_num_to_addr => [
|
409
|
+
:string, :ulong
|
410
|
+
],
|
411
|
+
#### /utility functions ####
|
412
|
+
|
413
|
+
#### region code ####
|
414
|
+
# string, country_code, region_code
|
415
|
+
:GeoIP_region_name_by_code => [
|
416
|
+
:string, :string, :string
|
417
|
+
],
|
418
|
+
#### /region code ####
|
419
|
+
|
420
|
+
#### time zone ####
|
421
|
+
# string, country_code, region_code
|
422
|
+
:GeoIP_time_zone_by_country_and_region => [
|
423
|
+
:string, :string, :string
|
424
|
+
],
|
425
|
+
#### /time zone ####
|
426
|
+
|
427
|
+
# string, void
|
428
|
+
:GeoIP_lib_version => [
|
429
|
+
:string
|
430
|
+
]
|
431
|
+
}
|
432
|
+
|
433
|
+
begin
|
434
|
+
ffi_lib(geoip_library_path)
|
435
|
+
|
436
|
+
FFI_LAYOUT.each do |fun, ary|
|
437
|
+
ret = ary.shift
|
438
|
+
begin
|
439
|
+
self.class_eval do
|
440
|
+
attach_function(fun, ary, ret)
|
441
|
+
end
|
442
|
+
rescue FFI::NotFoundError
|
443
|
+
# that's okay
|
444
|
+
end
|
445
|
+
end
|
446
|
+
|
447
|
+
rescue LoadError, NoMethodError
|
448
|
+
raise LoadError.new("Couldn't load the GeoIP library.")
|
449
|
+
end
|
450
|
+
end
|
451
|
+
|
452
|
+
class << self
|
453
|
+
include GeoIP::Tools
|
454
|
+
|
455
|
+
def version
|
456
|
+
@version ||= FFIGeoIP.GeoIP_lib_version
|
457
|
+
end
|
458
|
+
|
459
|
+
def addr_to_num(addr)
|
460
|
+
check_type(addr, String)
|
461
|
+
FFIGeoIP.GeoIP_addr_to_num(addr)
|
462
|
+
end
|
463
|
+
|
464
|
+
def num_to_addr(num)
|
465
|
+
check_type(num, Fixnum, Bignum)
|
466
|
+
FFIGeoIP.GeoIP_num_to_addr(num)
|
467
|
+
end
|
468
|
+
end
|
469
|
+
end
|
470
|
+
|