sys-host 0.6.1 → 0.6.2

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/CHANGES CHANGED
@@ -1,3 +1,14 @@
1
+ == 0.6.2 - 20-Mar-2010
2
+ * Changed license to Artistic 2.0.
3
+ * The Host.host_id method has been modified to return a hex value on MS
4
+ Windows in order to be consistent with other platforms.
5
+ * Some internal directory layout changes and corresponding changes to the
6
+ Rakefile.
7
+ * Additional Rakefile tasks that remove the need for some code that was
8
+ previously inlined into the gemspec directly.
9
+ * Updated the gemspec, including an updated description, the addition of a
10
+ license, and changing test-unit to a development dependency.
11
+
1
12
  == 0.6.1 - 18-Nov-2008
2
13
  * Added the host_id method for Windows, which just returns the MAC address.
3
14
  * Fixed an issue in the Host.ip_addr method for MS Windows where multiple ip
data/MANIFEST CHANGED
@@ -4,12 +4,14 @@
4
4
  * Rakefile
5
5
  * sys-host.gemspec
6
6
  * doc/host.txt
7
- * examples/host_test.rb
8
- * ext/constants.h
9
- * ext/extconf.rb
10
- * ext/bsd/bsd.c
11
- * ext/generic/generic.c
12
- * ext/linux/linux.c
13
- * ext/sunos/sunos.c
14
- * lib/sys/windows.rb
7
+ * examples/example_sys_host.rb
8
+ * ext/bsd/extconf.rb
9
+ * ext/bsd/sys/host.c
10
+ * ext/generic/extconf.rb
11
+ * ext/generic/sys/host.c
12
+ * ext/linux/extconf.rb
13
+ * ext/linux/sys/host.c
14
+ * ext/sunos/extconf.rb
15
+ * ext/sunos/sys/host.c
16
+ * lib/windows/sys/host.rb
15
17
  * test/test_sys_host.rb
data/Rakefile CHANGED
@@ -1,78 +1,169 @@
1
1
  require 'rake'
2
- require 'rake/clean'
3
2
  require 'rake/testtask'
4
3
  require 'rbconfig'
5
4
  include Config
6
5
 
7
6
  desc "Clean the build files for the sys-host source for UNIX systems"
8
7
  task :clean do
9
- Dir.chdir('ext') do
10
- unless RUBY_PLATFORM.match('mswin')
11
- sh 'make distclean' if File.exists?('host.o')
12
- FileUtils.rm_rf('host.c') if File.exists?('host.c')
13
- FileUtils.rm_rf('sys') if File.exists?('sys')
8
+ rm_rf('.test-result') if File.exists?('.test-result')
9
+ rm_rf 'conftest.dSYM' if File.exists?('conftest.dSYM') # OS X
10
+
11
+ Dir['*.gem'].each{ |f| File.delete(f) }
12
+
13
+ case Config::CONFIG['host_os']
14
+ when /bsd|darwin/i
15
+ dir = 'ext/bsd'
16
+ when /sunos|solaris/i
17
+ dir = 'ext/sunos'
18
+ when /linux/i
19
+ dir = 'ext/linux'
20
+ else
21
+ dir = 'ext/generic'
22
+ end
23
+
24
+ unless Config::CONFIG['host_os'] =~ /win32|mswin|dos|cygwin|mingw/i
25
+ Dir.chdir(dir) do
26
+ if Dir['*.o'].length > 0
27
+ sh 'make distclean'
28
+ Dir['sys/host.*'].each{ |f| rm(f) if File.extname(f) != '.c' }
14
29
  end
15
- end
16
- FileUtils.rm_rf('sys') if File.exists?('sys')
30
+ end
31
+ end
17
32
  end
18
33
 
19
- desc "Build the sys-host package on UNIX systems (but don't install it)"
34
+ desc "Build the sys-host library on UNIX systems (but don't install it)"
20
35
  task :build => [:clean] do
21
- Dir.chdir('ext') do
36
+ case Config::CONFIG['host_os']
37
+ when /bsd|darwin/i
38
+ dir = 'ext/bsd'
39
+ when /sunos|solaris/i
40
+ dir = 'ext/sunos'
41
+ when /linux/i
42
+ dir = 'ext/linux'
43
+ else
44
+ dir = 'ext/generic'
45
+ end
46
+
47
+ unless Config::CONFIG['host_os'] =~ /win32|mswin|dos|cygwin|mingw/i
48
+ Dir.chdir(dir) do
22
49
  ruby 'extconf.rb'
23
50
  sh 'make'
24
- build_file = 'host.' + Config::CONFIG['DLEXT']
25
- Dir.mkdir('sys') unless File.exists?('sys')
26
- FileUtils.cp(build_file, 'sys')
27
- end
51
+ cp 'host.' + Config::CONFIG['DLEXT'], 'sys'
52
+ end
53
+ end
28
54
  end
29
55
 
30
- desc "Run the example program"
31
- task :example => [:build] do
32
- ruby 'host_test.rb'
33
- end
56
+ desc 'Install the sys-host library'
57
+ task :install => [:build] do
58
+ file = nil
59
+ dir = File.join(Config::CONFIG['sitelibdir'], 'sys')
34
60
 
35
- if CONFIG['host_os'].match('mswin')
36
- desc "Install the sys-host package (non-gem)"
37
- task :install do
38
- install_dir = File.join(CONFIG['sitelibdir'], 'sys')
39
- install_file = File.join(install_dir, 'host.rb')
40
- Dir.mkdir(install_dir) unless File.exists?(install_dir)
41
- FileUtils.cp('lib/sys/windows.rb', install_file, :verbose => true)
42
- end
43
- else
44
- desc "Install the sys-host package (non-gem)"
45
- task :install => [:build] do
46
- Dir.chdir('ext') do
47
- sh 'make install'
48
- end
49
- end
61
+ Dir.mkdir(dir) unless File.exists?(dir)
62
+
63
+ case Config::CONFIG['host_os']
64
+ when /mswin|win32|msdos|cygwin|mingw/i
65
+ file = 'lib/windows/sys/host.rb'
66
+ when /bsd|darwin/i
67
+ Dir.chdir('ext/bsd'){ sh 'make install' }
68
+ when /sunos|solaris/i
69
+ Dir.chdir('ext/sunos'){ sh 'make install' }
70
+ when /linux/i
71
+ Dir.chdir('ext/linux'){ sh 'make install' }
72
+ else
73
+ Dir.chdir('ext/generic'){ sh 'make install' }
74
+ end
75
+
76
+ cp(file, dir, :verbose => true) if file
50
77
  end
51
78
 
52
- desc "Install the sys-host package as a gem"
53
- task :install_gem do
54
- ruby 'sys-host.gemspec'
55
- file = Dir["sys-host*.gem"].last
56
- sh "gem install #{file}"
79
+ desc 'Uninstall the sys-host library'
80
+ task :uninstall do
81
+ case Config::CONFIG['host_os']
82
+ when /win32|mswin|dos|cygwin|mingw/i
83
+ dir = File.join(Config::CONFIG['sitelibdir'], 'sys')
84
+ file = File.join(dir, 'host.rb')
85
+ else
86
+ dir = File.join(Config::CONFIG['sitearchdir'], 'sys')
87
+ file = File.join(dir, 'host.' + Config::CONFIG['DLEXT'])
88
+ end
89
+
90
+ rm(file)
57
91
  end
58
92
 
59
93
  desc "Run the example sys-host program"
60
94
  task :example => [:build] do
61
95
  Dir.mkdir('sys') unless File.exists?('sys')
62
96
  if CONFIG['host_os'].match('mswin')
63
- FileUtils.cp('lib/sys/windows.rb', 'lib/sys/host.rb')
64
- ruby '-Ilib examples/host_test.rb'
97
+ ruby '-Ilib/windows examples/example_sys_host.rb'
65
98
  else
66
- ruby '-Iext examples/host_test.rb'
99
+ case Config::CONFIG['host_os']
100
+ when /bsd|darwin/i
101
+ dir = 'ext/bsd'
102
+ when /sunos|solaris/i
103
+ dir = 'ext/sunos'
104
+ when /linux/i
105
+ dir = 'ext/linux'
106
+ else
107
+ dir = 'ext/generic'
108
+ end
109
+ ruby "-I#{dir} examples/example_sys_host.rb"
67
110
  end
68
111
  end
69
112
 
113
+ desc 'Run the test suite'
70
114
  Rake::TestTask.new do |t|
71
- if CONFIG['host_os'].match('mswin')
72
- FileUtils.cp('lib/sys/windows.rb', 'lib/sys/host.rb')
73
- else
74
- task :test => :build
75
- t.libs << 'ext'
76
- t.libs.delete('lib')
77
- end
115
+ task :test => :build
116
+ t.libs << 'test'
117
+ t.test_files = FileList['test/test_sys_host.rb']
118
+
119
+ case Config::CONFIG['host_os']
120
+ when /mswin|msdos|cygwin|mingw/i
121
+ t.libs << 'lib/windows'
122
+ when /linux/i
123
+ t.libs << 'ext/linux'
124
+ when /sunos|solaris/i
125
+ t.libs << 'ext/sunos'
126
+ when /bsd|darwin/i
127
+ t.libs << 'ext/bsd'
128
+ else
129
+ t.libs << 'ext/generic'
130
+ end
131
+ end
132
+
133
+ namespace 'gem' do
134
+ desc 'Create the sys-host gem file'
135
+ task :create => [:clean] do
136
+ spec = eval(IO.read('sys-host.gemspec'))
137
+
138
+ case Config::CONFIG['host_os']
139
+ when /bsd|darwin/i
140
+ spec.files << 'ext/bsd/sys/host.c'
141
+ spec.extra_rdoc_files << 'ext/bsd/sys/host.c'
142
+ spec.extensions = ['ext/bsd/extconf.rb']
143
+ when /linux/i
144
+ spec.files << 'ext/linux/sys/host.c'
145
+ spec.extra_rdoc_files << 'ext/linux/sys/host.c'
146
+ spec.extensions = ['ext/linux/extconf.rb']
147
+ when /sunos|solaris/i
148
+ spec.files << 'ext/sunos/sys/host.c'
149
+ spec.extra_rdoc_files << 'ext/sunos/sys/host.c'
150
+ spec.extensions = ['ext/sunos/extconf.rb']
151
+ when /mswin|win32|dos|cygwin|mingw/i
152
+ spec.platform = Gem::Platform::CURRENT
153
+ spec.require_paths = ['lib', 'lib/windows']
154
+ spec.files += ['lib/windows/sys/host.rb']
155
+ else
156
+ spec.files << 'ext/generic/sys/host.c'
157
+ spec.extra_rdoc_files << 'ext/generic/sys/host.c'
158
+ spec.extensions = ['ext/generic/extconf.rb']
159
+ end
160
+
161
+ Gem::Builder.new(spec).build
162
+ end
163
+
164
+ desc 'Install the sys-host gem'
165
+ task :install => [:create] do
166
+ file = Dir["*.gem"].first
167
+ sh "gem install #{file}"
168
+ end
78
169
  end
@@ -1,88 +1,88 @@
1
1
  == Description
2
- Provides hostname and ip address information for a given host.
2
+ Provides hostname and ip address information for a given host.
3
3
 
4
4
  == Synopsis
5
- require 'sys/host'
6
- include Sys
5
+ require 'sys/host'
6
+ include Sys
7
7
 
8
- p Host.hostname
9
- p Host.ip_addr
8
+ p Host.hostname
9
+ p Host.ip_addr
10
10
 
11
- # Some platforms
12
- Host.info{ |h|
13
- p h
14
- }
11
+ # Some platforms
12
+ Host.info{ |h|
13
+ p h
14
+ }
15
15
 
16
16
  == Constants
17
17
  VERSION
18
- Returns the current version number of this library (as a string)
18
+ Returns the current version number of this library (as a string)
19
19
 
20
20
  == Class Methods
21
21
  Host.hostname
22
- Returns the hostname of the current host. This may or not return
23
- the FQDN, depending on your system.
22
+ Returns the hostname of the current host. This may or not return
23
+ the FQDN, depending on your system.
24
24
 
25
25
  Host.ip_addr
26
- Returns a list of IP addresses for the current host (yes, it is
27
- possible to have more than one).
26
+ Returns a list of IP addresses for the current host (yes, it is
27
+ possible to have more than one).
28
28
 
29
29
  Host.info(host=localhost)
30
30
  Host.info(host=localhost){ |h| ... }
31
- Yields a HostInfo struct for each network adapter on 'host', or an array
32
- of HostInfo struct's in non-block form. The exact members of this struct
33
- vary depending on your platform.
31
+ Yields a HostInfo struct for each network adapter on 'host', or an array
32
+ of HostInfo struct's in non-block form. The exact members of this struct
33
+ vary depending on your platform.
34
+
35
+ Host.host_id
36
+ Returns the unique hexadecimal identifier for the current host.
34
37
 
35
38
  == Exception Classes
36
39
  Host::Error < StandardError
37
- Raised in the event of a failure for any of the class methods provided
38
- with this library. Generally speaking, it means there was a failure in
39
- the underlying gethostname() or gethostbyname() calls.
40
+ Raised in the event of a failure for any of the class methods provided
41
+ with this library. Generally speaking, it means there was a failure in
42
+ the underlying gethostname() or gethostbyname() calls.
40
43
 
41
44
  == Future Plans
42
- Add support for IPV6. This will be difficult unless I have access to a
43
- system on an IPV6 network. Any help on this front appreciated.
45
+ Add support for IPV6. This will be difficult unless I have access to a
46
+ system on an IPV6 network. Any help on this front appreciated.
44
47
 
45
48
  == Notes
46
- The Windows version of this library uses OLE + WMI. The Host.info method
47
- returns considerably more information than the *nix versions of this
48
- library.
49
+ The Windows version of this library uses OLE + WMI. The Host.info method
50
+ returns considerably more information than the *nix versions of this
51
+ library.
49
52
 
50
53
  == Comments and Questions
51
- Please direct all comments and/or questions to one of the Forums on the
52
- project home page at http://www.rubyforge.org/projects/sysutils.
54
+ Please direct all comments and/or questions to one of the Forums on the
55
+ project home page at http://www.rubyforge.org/projects/sysutils.
53
56
 
54
57
  == Known Bugs
55
- None that I'm aware of.
58
+ None that I'm aware of.
56
59
 
57
- Please log any bugs on the project home page at
58
- http://www.rubyforge.org/projects/sysutils
60
+ Please log any bugs on the project home page at
61
+ http://www.rubyforge.org/projects/sysutils
59
62
 
60
63
  == Acknowledgements
61
- Thanks go to Mike Hall, Guy Decoux, and Matz for their help with
62
- C extensions in general.
64
+ Thanks go to Mike Hall, Guy Decoux, and Matz for their help with
65
+ C extensions in general.
63
66
 
64
- Thanks also go to Richard Stevens for his excellent Unix programming
65
- books.
67
+ Thanks also go to Richard Stevens for his excellent Unix programming books.
66
68
 
67
69
  == License
68
- Ruby's
70
+ Artistic 2.0
69
71
 
70
72
  == Copyright
71
- Copyright 2002-2008, Daniel J. Berger, djberg96 at gmail dot com
73
+ Copyright 2002-2010, Daniel J. Berger, djberg96 at gmail dot com
72
74
 
73
- All Rights Reserved. This module is free software. It may be used,
74
- redistributed and/or modified under the same terms as Ruby itself.
75
+ All Rights Reserved. This module is free software. It may be used,
76
+ redistributed and/or modified under the same terms as Ruby itself.
75
77
 
76
78
  == Warranty
77
- This library is provided "as is" and without any express or
78
- implied warranties, including, without limitation, the implied
79
- warranties of merchantability and fitness for a particular purpose.
79
+ This library is provided "as is" and without any express or
80
+ implied warranties, including, without limitation, the implied
81
+ warranties of merchantability and fitness for a particular purpose.
80
82
 
81
83
  == Author
82
- Daniel J. Berger
83
- djberg96 at gmail dot com
84
- imperator on IRC (freenode)
84
+ Daniel J. Berger
85
85
 
86
86
  == See Also
87
- gethostbyname, gethostbyname_r, gethostname, hostname (Unix)
88
- WMI, OLE (Windows)
87
+ gethostbyname, gethostbyname_r, gethostname, hostname (Unix)
88
+ WMI, OLE (Windows)
@@ -0,0 +1,21 @@
1
+ ####################################################################
2
+ # example_sys_host.rb
3
+ #
4
+ # Generic test script for general futzing. Use the 'rake example'
5
+ # task to run this.
6
+ #
7
+ # Modify as you see fit.
8
+ ####################################################################
9
+ require 'sys/host'
10
+ include Sys
11
+
12
+ puts "VERSION: " + Host::VERSION
13
+ puts "Hostname: " + Host.hostname
14
+ puts "IP Addresses : " + Host.ip_addr.join(',')
15
+ puts "Host ID: " + Host.host_id.to_s
16
+
17
+ puts "Info: "
18
+
19
+ Host.info{ |i|
20
+ p i
21
+ }
@@ -0,0 +1,11 @@
1
+ require 'mkmf'
2
+ require 'rbconfig'
3
+
4
+ dir_config('host')
5
+
6
+ have_func('gethostid')
7
+ have_func('inet_ntop')
8
+ have_func('gethostent_r')
9
+ have_func('getipnodebyname')
10
+
11
+ create_makefile('sys/host', 'sys')
@@ -0,0 +1,268 @@
1
+ /******************************************************************************
2
+ * host.c - Source code for BSD and OS X for the sys-host library.
3
+ *
4
+ * Author: Daniel Berger
5
+ *****************************************************************************/
6
+ #include <ruby.h>
7
+ #include <unistd.h>
8
+ #include <netdb.h>
9
+ #include <arpa/inet.h>
10
+ #include <sys/socket.h>
11
+ #include <sys/types.h>
12
+ #include <errno.h>
13
+
14
+ #define SYS_HOST_VERSION "0.6.2"
15
+
16
+ #ifndef MAXHOSTNAMELEN
17
+ #define MAXHOSTNAMELEN 256
18
+ #endif
19
+
20
+ #ifndef INET_ADDRSTRLEN
21
+ #define INET_ADDRSTRLEN 16
22
+ #endif
23
+
24
+ #ifndef HOSTENT_BUF
25
+ #define HOSTENT_BUF 8192
26
+ #endif
27
+
28
+ VALUE cHostError, sHostInfo;
29
+
30
+ /*
31
+ * call-seq:
32
+ * Host.hostname
33
+ *
34
+ * Returns the hostname of the current host. This may or not return the FQDN,
35
+ * depending on your system.
36
+ */
37
+ static VALUE host_hostname(){
38
+ char host_name[MAXHOSTNAMELEN];
39
+ int rv;
40
+
41
+ rv = gethostname(host_name, MAXHOSTNAMELEN);
42
+
43
+ // If you get this exception, you've got big problems
44
+ if(rv != 0)
45
+ rb_raise(cHostError, "gethostname() call failed: %s", strerror(errno));
46
+
47
+ return rb_str_new2(host_name);
48
+ }
49
+
50
+ /*
51
+ * call-seq:
52
+ * Host.ip_addr
53
+ *
54
+ * Returns a list of IP addresses for the current host (yes, it is possible
55
+ * to have more than one).
56
+ */
57
+ static VALUE host_ip_addr(){
58
+ char host_name[MAXHOSTNAMELEN];
59
+ char str[INET_ADDRSTRLEN];
60
+ char **pptr;
61
+ struct hostent* hp;
62
+ int err;
63
+ VALUE v_results = rb_ary_new();
64
+ #ifndef HAVE_INET_NTOP
65
+ struct in_addr ipa;
66
+ int n;
67
+ #endif
68
+
69
+ if(gethostname(host_name, MAXHOSTNAMELEN) != 0)
70
+ rb_raise(cHostError, "gethostname() call failed");
71
+
72
+ #ifdef HAVE_GETIPNODEBYNAME
73
+ hp = getipnodebyname(host_name, AF_INET, AI_DEFAULT, &err);
74
+ #else
75
+ hp = gethostbyname(host_name);
76
+ #endif
77
+
78
+ if(hp == NULL)
79
+ rb_raise(cHostError, "getipnodebyname() call failed");
80
+
81
+ pptr = hp->h_addr_list;
82
+
83
+ #ifdef HAVE_INET_NTOP
84
+ for( ; *pptr != NULL; pptr++){
85
+ rb_ary_push(v_results,
86
+ rb_str_new2(inet_ntop(hp->h_addrtype, *pptr, str, INET_ADDRSTRLEN)));
87
+ }
88
+ #else
89
+ for(n = 0; hp->h_addr_list[n] != NULL; n++){
90
+ memcpy(&ipa.s_addr, hp->h_addr_list[n], hp->h_length);
91
+ rb_ary_push(v_results, rb_str_new2(inet_ntoa(ipa)));
92
+ }
93
+ #endif
94
+
95
+ return v_results;
96
+ }
97
+
98
+ /* :call-seq:
99
+ * Sys::Host.info
100
+ * Sys::Host.info{ |i| ... }
101
+ *
102
+ * Yields a HostInfo struct containing various bits of information about
103
+ * the local machine for each entry in the hosts table. In non-block form,
104
+ * returns an array of HostInfo structs.
105
+ *
106
+ * The Struct::HostInfo struct contains 5 fields:
107
+ *
108
+ * * name (String)
109
+ * * aliases (Array)
110
+ * * addr_type (Integer) => Typically 2 (AF_INET) or 28 (AF_INET6)
111
+ * * length (Integer) => Typically 4 (IPv4) or 16 (IPv6)
112
+ * * addr_list (Array)
113
+ */
114
+ static VALUE host_info(VALUE klass){
115
+ VALUE v_hostinfo = Qnil;
116
+ VALUE v_addr = rb_ary_new();
117
+ VALUE v_array = rb_ary_new();
118
+ VALUE v_aliases = rb_ary_new();
119
+
120
+ sethostent(0);
121
+
122
+ #ifdef HAVE_GETHOSTENT_R
123
+ struct hostent host;
124
+ struct hostent* result;
125
+ char sbuf[HOSTENT_BUF];
126
+ char ibuf[INET_ADDRSTRLEN];
127
+ int err;
128
+
129
+ while(!gethostent_r(&host, sbuf, HOSTENT_BUF, &result, &err)){
130
+ #ifdef __MACH__ or #ifdef __APPLE__
131
+ char **aliases = result->h_aliases;
132
+ char **addrs = result->h_addr_list;
133
+
134
+ while(*aliases){
135
+ rb_ary_push(v_aliases, rb_str_new2(*aliases));
136
+ *aliases++;
137
+ }
138
+
139
+ while(*addrs){
140
+ inet_ntop(result->h_addrtype, addrs, addr, INET_ADDRSTRLEN);
141
+ rb_ary_push(v_addr, rb_str_new2(ibuf));
142
+ memset(ibuf, 0, sizeof(ibuf));
143
+ addrs++;
144
+ }
145
+ #else
146
+ while(*result->h_aliases){
147
+ rb_ary_push(v_aliases, rb_str_new2(*result->h_aliases));
148
+ *result->h_aliases++;
149
+ }
150
+
151
+ while(*result->h_addr_list){
152
+ inet_ntop(result->h_addrtype, *result->h_addr_list, ibuf, INET_ADDRSTRLEN);
153
+ rb_ary_push(v_addr, rb_str_new2(ibuf));
154
+ *result->h_addr_list++;
155
+ memset(ibuf, 0, sizeof(ibuf));
156
+ }
157
+ #endif
158
+
159
+ // Dup the arrays because Ruby is holding onto the same reference.
160
+ v_hostinfo = rb_struct_new(sHostInfo,
161
+ rb_str_new2(result->h_name),
162
+ rb_ary_dup(v_aliases),
163
+ INT2FIX(result->h_addrtype),
164
+ INT2FIX(result->h_length),
165
+ rb_ary_dup(v_addr)
166
+ );
167
+ #else
168
+ struct hostent* host;
169
+ char ibuf[INET_ADDRSTRLEN];
170
+
171
+ while((host = gethostent())){
172
+ #ifdef __MACH__ or #ifdef __APPLE__
173
+ char **aliases = host->h_aliases;
174
+ char **addrs = host->h_addr_list;
175
+
176
+ while(*aliases){
177
+ rb_ary_push(v_aliases, rb_str_new2(*aliases));
178
+ *aliases++;
179
+ }
180
+
181
+ while(*addrs){
182
+ inet_ntop(host->h_addrtype, addrs, ibuf, INET_ADDRSTRLEN);
183
+ rb_ary_push(v_addr, rb_str_new2(ibuf));
184
+ memset(ibuf, 0, sizeof(ibuf));
185
+ addrs++;
186
+ }
187
+ #else
188
+ while(*host->h_aliases){
189
+ rb_ary_push(v_aliases, rb_str_new2(*host->h_aliases));
190
+ *host->h_aliases++;
191
+ }
192
+
193
+ while(*host->h_addr_list){
194
+ inet_ntop(host->h_addrtype, *host->h_addr_list, ibuf, INET_ADDRSTRLEN);
195
+ rb_ary_push(v_addr, rb_str_new2(ibuf));
196
+ memset(ibuf, 0, sizeof(ibuf));
197
+ *host->h_addr_list++;
198
+ }
199
+ #endif
200
+
201
+ v_hostinfo = rb_struct_new(sHostInfo,
202
+ rb_str_new2(host->h_name),
203
+ rb_ary_dup(v_aliases),
204
+ INT2FIX(host->h_addrtype),
205
+ INT2FIX(host->h_length),
206
+ rb_ary_dup(v_addr)
207
+ );
208
+ #endif
209
+ if(rb_block_given_p())
210
+ rb_yield(v_hostinfo);
211
+ else
212
+ rb_ary_push(v_array, v_hostinfo);
213
+
214
+ rb_ary_clear(v_aliases);
215
+ rb_ary_clear(v_addr);
216
+ }
217
+
218
+ endhostent();
219
+
220
+ if(rb_block_given_p())
221
+ return Qnil;
222
+
223
+ return v_array;
224
+ }
225
+
226
+ #ifdef HAVE_GETHOSTID
227
+ /*
228
+ * Sys::Host.host_id
229
+ *
230
+ * Returns the host id of the current machine.
231
+ */
232
+ static VALUE host_host_id(){
233
+ return ULL2NUM(gethostid());
234
+ }
235
+ #endif
236
+
237
+ void Init_host()
238
+ {
239
+ VALUE sys_mSys, cHost;
240
+
241
+ /* The Sys module serves as a toplevel namespace, nothing more. */
242
+ sys_mSys = rb_define_module("Sys");
243
+
244
+ /* The Host class encapsulates information about your machine, such as
245
+ * the host name and IP address.
246
+ */
247
+ cHost = rb_define_class_under(sys_mSys, "Host", rb_cObject);
248
+
249
+ /* This error is raised if any of the Host methods fail. */
250
+ cHostError = rb_define_class_under(cHost, "Error", rb_eStandardError);
251
+
252
+ /* 0.6.2: The version of this library. This is a string, not a number. */
253
+ rb_define_const(cHost, "VERSION", rb_str_new2(SYS_HOST_VERSION));
254
+
255
+ /* Structs */
256
+ sHostInfo = rb_struct_define("HostInfo", "name", "aliases", "addr_type",
257
+ "length", "addr_list", NULL
258
+ );
259
+
260
+ /* Class Methods */
261
+ rb_define_singleton_method(cHost, "hostname", host_hostname, 0);
262
+ rb_define_singleton_method(cHost, "ip_addr", host_ip_addr, 0);
263
+ rb_define_singleton_method(cHost, "info", host_info, 0);
264
+
265
+ #ifdef HAVE_GETHOSTID
266
+ rb_define_singleton_method(cHost, "host_id", host_host_id, 0);
267
+ #endif
268
+ }