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 +11 -0
- data/MANIFEST +10 -8
- data/Rakefile +139 -48
- data/doc/host.txt +46 -46
- data/examples/example_sys_host.rb +21 -0
- data/ext/bsd/extconf.rb +11 -0
- data/ext/bsd/sys/host.c +268 -0
- data/sys-host.gemspec +40 -0
- data/test/test_sys_host.rb +112 -78
- metadata +33 -25
- data/ext/bsd/bsd.c +0 -247
- data/ext/constants.h +0 -14
- data/ext/extconf.rb +0 -35
- data/ext/generic/generic.c +0 -189
- data/ext/linux/linux.c +0 -228
- data/ext/sunos/sunos.c +0 -242
data/ext/constants.h
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
/* constants.h - one version to bind them all... */
|
2
|
-
#define SYS_HOST_VERSION "0.6.1"
|
3
|
-
|
4
|
-
#ifndef MAXHOSTNAMELEN
|
5
|
-
#define MAXHOSTNAMELEN 256
|
6
|
-
#endif
|
7
|
-
|
8
|
-
#ifndef INET_ADDRSTRLEN
|
9
|
-
#define INET_ADDRSTRLEN 16
|
10
|
-
#endif
|
11
|
-
|
12
|
-
#ifndef HOSTENT_BUF
|
13
|
-
#define HOSTENT_BUF 8192
|
14
|
-
#endif
|
data/ext/extconf.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
require 'mkmf'
|
2
|
-
require 'fileutils'
|
3
|
-
|
4
|
-
dir_config('host')
|
5
|
-
|
6
|
-
have_func('gethostid')
|
7
|
-
have_func('inet_ntop')
|
8
|
-
Dir.mkdir('sys') unless File.exists?('sys')
|
9
|
-
|
10
|
-
case RUBY_PLATFORM
|
11
|
-
when /bsd|darwin|powerpc|mach/i
|
12
|
-
have_func('getipnodebyname')
|
13
|
-
FileUtils.cp('bsd/bsd.c', 'sys/host.c')
|
14
|
-
when /sunos|solaris/i
|
15
|
-
have_library('nsl')
|
16
|
-
have_library('socket')
|
17
|
-
have_func('gethostbyname_r', 'netdb.h')
|
18
|
-
have_func('gethostent_r', 'netdb.h')
|
19
|
-
FileUtils.cp('sunos/sunos.c', 'sys/host.c')
|
20
|
-
when /linux/i
|
21
|
-
have_func('gethostbyname_r', 'netdb.h')
|
22
|
-
have_func('gethostent_r', 'netdb.h')
|
23
|
-
FileUtils.cp('linux/linux.c', 'sys/host.c')
|
24
|
-
when /win32|windows|dos|mingw|cygwin/i
|
25
|
-
STDERR.puts 'Run the "rake install" task to install on MS Windows'
|
26
|
-
else
|
27
|
-
FileUtils.cp('generic/generic.c', 'sys/host.c')
|
28
|
-
end
|
29
|
-
|
30
|
-
# Already grabbed this from netdb.h on Solaris
|
31
|
-
unless RUBY_PLATFORM =~ /sunos|solaris/i
|
32
|
-
have_func('gethostent_r')
|
33
|
-
end
|
34
|
-
|
35
|
-
create_makefile('sys/host', 'sys')
|
data/ext/generic/generic.c
DELETED
@@ -1,189 +0,0 @@
|
|
1
|
-
/******************************************************************************
|
2
|
-
* generic.c (host.c) - Ruby Extension
|
3
|
-
*
|
4
|
-
* Author: Daniel Berger
|
5
|
-
*
|
6
|
-
* This source is mostly borrowed from the linux source for sys-host, except
|
7
|
-
* that it does not support the gethostbyname_r() method.
|
8
|
-
*****************************************************************************/
|
9
|
-
#include <ruby.h>
|
10
|
-
#include <constants.h>
|
11
|
-
#include <unistd.h>
|
12
|
-
#include <netdb.h>
|
13
|
-
#include <arpa/inet.h>
|
14
|
-
|
15
|
-
#ifdef __cplusplus
|
16
|
-
extern "C"
|
17
|
-
{
|
18
|
-
#endif
|
19
|
-
|
20
|
-
VALUE cHostError, sHostInfo;
|
21
|
-
|
22
|
-
/*
|
23
|
-
* Sys::Host.hostname
|
24
|
-
*
|
25
|
-
* Returns the hostname of the current machine.
|
26
|
-
*/
|
27
|
-
static VALUE host_hostname()
|
28
|
-
{
|
29
|
-
char host_name[MAXHOSTNAMELEN];
|
30
|
-
|
31
|
-
/* If you get this exception, you've got big problems */
|
32
|
-
if(gethostname(host_name, MAXHOSTNAMELEN) != 0)
|
33
|
-
rb_raise(cHostError,"gethostname() call failed");
|
34
|
-
|
35
|
-
return rb_str_new2(host_name);
|
36
|
-
}
|
37
|
-
|
38
|
-
/*
|
39
|
-
* Sys::Host.ip_addr
|
40
|
-
*
|
41
|
-
* Returns an array of IP addresses associated with the current hostname.
|
42
|
-
*/
|
43
|
-
static VALUE host_ip_addr()
|
44
|
-
{
|
45
|
-
char host_name[MAXHOSTNAMELEN];
|
46
|
-
char str[INET_ADDRSTRLEN];
|
47
|
-
char **pptr;
|
48
|
-
struct hostent* hp;
|
49
|
-
VALUE v_results = rb_ary_new();
|
50
|
-
#ifndef HAVE_INET_NTOP
|
51
|
-
struct in_addr ipa;
|
52
|
-
int n;
|
53
|
-
#endif
|
54
|
-
|
55
|
-
if(gethostname(host_name, MAXHOSTNAMELEN) != 0)
|
56
|
-
rb_raise(cHostError, "gethostname() call failed");
|
57
|
-
|
58
|
-
hp = gethostbyname(host_name);
|
59
|
-
|
60
|
-
if(!hp)
|
61
|
-
rb_raise(cHostError, "gethostbyname() call failed");
|
62
|
-
|
63
|
-
pptr = hp->h_addr_list;
|
64
|
-
|
65
|
-
#ifdef HAVE_INET_NTOP
|
66
|
-
for( ; *pptr != NULL; pptr++) {
|
67
|
-
rb_ary_push(v_results,
|
68
|
-
rb_str_new2(inet_ntop(hp->h_addrtype, *pptr, str, sizeof(str))));
|
69
|
-
}
|
70
|
-
#else
|
71
|
-
for(n = 0; hp->h_addr_list[n] != NULL; n++) {
|
72
|
-
memcpy(&ipa.s_addr, hp->h_addr_list[n], hp->h_length);
|
73
|
-
rb_ary_push(v_results, rb_str_new2(inet_ntoa(ipa)));
|
74
|
-
}
|
75
|
-
#endif
|
76
|
-
return v_results;
|
77
|
-
|
78
|
-
}
|
79
|
-
|
80
|
-
#ifdef HAVE_GETHOSTID
|
81
|
-
/*
|
82
|
-
* Sys::Host.host_id
|
83
|
-
*
|
84
|
-
* Returns the host id of the current machine.
|
85
|
-
*/
|
86
|
-
static VALUE host_host_id(){
|
87
|
-
return ULL2NUM(gethostid());
|
88
|
-
}
|
89
|
-
#endif
|
90
|
-
|
91
|
-
/*
|
92
|
-
* Sys::Host.info
|
93
|
-
* Sys::Host.info{ |i| ... }
|
94
|
-
*
|
95
|
-
* Yields a HostInfo struct containing various bits of information about
|
96
|
-
* the local machine for each entry in the hosts table. In non-block form,
|
97
|
-
* returns an array of HostInfo structs.
|
98
|
-
*
|
99
|
-
* The Struct::HostInfo struct contains 5 fields:
|
100
|
-
*
|
101
|
-
* * name (String)
|
102
|
-
* * aliases (Array)
|
103
|
-
* * addr_type (Integer)
|
104
|
-
* * length (Integer)
|
105
|
-
* * addr_list (Array)
|
106
|
-
*/
|
107
|
-
static VALUE host_info(VALUE klass){
|
108
|
-
struct hostent* host;
|
109
|
-
char buf[INET_ADDRSTRLEN];
|
110
|
-
VALUE v_hostinfo;
|
111
|
-
VALUE v_addr = rb_ary_new();
|
112
|
-
VALUE v_array = rb_ary_new();
|
113
|
-
VALUE v_aliases = rb_ary_new();
|
114
|
-
|
115
|
-
sethostent(0);
|
116
|
-
|
117
|
-
while((host = gethostent())){
|
118
|
-
while(*host->h_aliases){
|
119
|
-
rb_ary_push(v_aliases, rb_str_new2(*host->h_aliases));
|
120
|
-
*host->h_aliases++;
|
121
|
-
}
|
122
|
-
|
123
|
-
while(*host->h_addr_list){
|
124
|
-
inet_ntop(host->h_addrtype, *host->h_addr_list, buf, sizeof(buf));
|
125
|
-
rb_ary_push(v_addr, rb_str_new2(buf));
|
126
|
-
*host->h_addr_list++;
|
127
|
-
}
|
128
|
-
|
129
|
-
v_hostinfo = rb_struct_new(sHostInfo,
|
130
|
-
rb_str_new2(host->h_name),
|
131
|
-
v_aliases,
|
132
|
-
INT2FIX(host->h_addrtype),
|
133
|
-
INT2FIX(host->h_length),
|
134
|
-
v_addr
|
135
|
-
);
|
136
|
-
|
137
|
-
if(rb_block_given_p())
|
138
|
-
rb_yield(v_hostinfo);
|
139
|
-
else
|
140
|
-
rb_ary_push(v_array, v_hostinfo);
|
141
|
-
|
142
|
-
rb_ary_clear(v_aliases);
|
143
|
-
rb_ary_clear(v_addr);
|
144
|
-
}
|
145
|
-
|
146
|
-
endhostent();
|
147
|
-
|
148
|
-
if(rb_block_given_p())
|
149
|
-
return Qnil;
|
150
|
-
|
151
|
-
return v_array;
|
152
|
-
}
|
153
|
-
|
154
|
-
void Init_host()
|
155
|
-
{
|
156
|
-
VALUE mSys, cHost;
|
157
|
-
|
158
|
-
/* The Sys module serves as a toplevel namespace, nothing more. */
|
159
|
-
mSys = rb_define_module("Sys");
|
160
|
-
|
161
|
-
/* The Host class encapsulates information about your machine, such as
|
162
|
-
* the host name and IP address.
|
163
|
-
*/
|
164
|
-
cHost = rb_define_class_under(mSys, "Host", rb_cObject);
|
165
|
-
|
166
|
-
/* This error is raised if any of the Host methods fail. */
|
167
|
-
cHostError = rb_define_class_under(cHost, "Error", rb_eStandardError);
|
168
|
-
|
169
|
-
/* 0.6.1: The version of this library. This is a string, not a number. */
|
170
|
-
rb_define_const(cHost,"VERSION",rb_str_new2(SYS_HOST_VERSION));
|
171
|
-
|
172
|
-
/* Class Methods */
|
173
|
-
rb_define_singleton_method(cHost, "hostname", host_hostname, 0);
|
174
|
-
rb_define_singleton_method(cHost, "ip_addr", host_ip_addr, 0);
|
175
|
-
rb_define_singleton_method(cHost, "info", host_info, 0);
|
176
|
-
|
177
|
-
#ifdef HAVE_GETHOSTID
|
178
|
-
rb_define_singleton_method(cHost, "host_id", host_host_id, 0);
|
179
|
-
#endif
|
180
|
-
|
181
|
-
/* Structs */
|
182
|
-
sHostInfo = rb_struct_define("HostInfo", "name", "aliases", "addr_type",
|
183
|
-
"length", "addr_list", 0
|
184
|
-
);
|
185
|
-
}
|
186
|
-
|
187
|
-
#ifdef __cplusplus
|
188
|
-
}
|
189
|
-
#endif
|
data/ext/linux/linux.c
DELETED
@@ -1,228 +0,0 @@
|
|
1
|
-
/******************************************************************************
|
2
|
-
* linux.c (host.c) - Linux specific version for sys-host
|
3
|
-
*
|
4
|
-
* Author: Daniel Berger
|
5
|
-
*****************************************************************************/
|
6
|
-
#include <ruby.h>
|
7
|
-
#include <constants.h>
|
8
|
-
#include <unistd.h>
|
9
|
-
#include <netdb.h>
|
10
|
-
#include <arpa/inet.h>
|
11
|
-
|
12
|
-
#ifdef __cplusplus
|
13
|
-
extern "C"
|
14
|
-
{
|
15
|
-
#endif
|
16
|
-
|
17
|
-
VALUE cHostError, sHostInfo;
|
18
|
-
|
19
|
-
/* Returns the hostname of the current host. This may or not return the
|
20
|
-
* FQDN, depending on your system.
|
21
|
-
*/
|
22
|
-
static VALUE host_hostname()
|
23
|
-
{
|
24
|
-
char host_name[MAXHOSTNAMELEN];
|
25
|
-
int rv;
|
26
|
-
rv = gethostname(host_name, sizeof(host_name));
|
27
|
-
|
28
|
-
/* If you get this exception, you've got big problems */
|
29
|
-
if(rv != 0)
|
30
|
-
rb_raise(cHostError, "gethostname() call failed");
|
31
|
-
|
32
|
-
return rb_str_new2(host_name);
|
33
|
-
}
|
34
|
-
|
35
|
-
/* Returns a list of IP addresses for the current host (yes, it is
|
36
|
-
* possible to have more than one).
|
37
|
-
*/
|
38
|
-
static VALUE host_ip_addr()
|
39
|
-
{
|
40
|
-
char host_name[MAXHOSTNAMELEN];
|
41
|
-
char str[INET_ADDRSTRLEN];
|
42
|
-
char **pptr;
|
43
|
-
struct hostent* hp;
|
44
|
-
int rv;
|
45
|
-
VALUE rbResults = rb_ary_new();
|
46
|
-
#ifndef HAVE_INET_NTOP
|
47
|
-
struct in_addr ipa;
|
48
|
-
int n;
|
49
|
-
#endif
|
50
|
-
|
51
|
-
rv = gethostname(host_name, sizeof(host_name));
|
52
|
-
|
53
|
-
if(rv != 0)
|
54
|
-
rb_raise(cHostError, "gethostname() call failed");
|
55
|
-
|
56
|
-
#ifdef HAVE_GETHOSTBYNAME_R
|
57
|
-
{
|
58
|
-
struct hostent hpbuf;
|
59
|
-
char strbuf[HOSTENT_BUF];
|
60
|
-
int err;
|
61
|
-
size_t no_op = HOSTENT_BUF;
|
62
|
-
gethostbyname_r(host_name, &hpbuf, strbuf, no_op, &hp, &err);
|
63
|
-
}
|
64
|
-
#else
|
65
|
-
hp = gethostbyname(host_name);
|
66
|
-
#endif
|
67
|
-
|
68
|
-
if(!hp)
|
69
|
-
rb_raise(cHostError,"gethostbyname() call failed");
|
70
|
-
|
71
|
-
pptr = hp->h_addr_list;
|
72
|
-
|
73
|
-
#ifdef HAVE_INET_NTOP
|
74
|
-
for( ; *pptr != NULL; pptr++){
|
75
|
-
rb_ary_push(rbResults,
|
76
|
-
rb_str_new2(inet_ntop(hp->h_addrtype, *pptr, str, sizeof(str))));
|
77
|
-
}
|
78
|
-
#else
|
79
|
-
for(n = 0; hp->h_addr_list[n] != NULL; n++){
|
80
|
-
memcpy(&ipa.s_addr, hp->h_addr_list[n], hp->h_length);
|
81
|
-
rb_ary_push(rbResults, rb_str_new2(inet_ntoa(ipa)));
|
82
|
-
}
|
83
|
-
#endif
|
84
|
-
|
85
|
-
return rbResults;
|
86
|
-
}
|
87
|
-
|
88
|
-
/* :call-seq:
|
89
|
-
* Sys::Host.info
|
90
|
-
* Sys::Host.info{ |i| ... }
|
91
|
-
*
|
92
|
-
* Yields a HostInfo struct containing various bits of information about
|
93
|
-
* the local machine for each entry in the hosts table. In non-block form,
|
94
|
-
* returns an array of HostInfo structs.
|
95
|
-
*
|
96
|
-
* The Struct::HostInfo struct contains 5 fields:
|
97
|
-
*
|
98
|
-
* * name (String)
|
99
|
-
* * aliases (Array)
|
100
|
-
* * addr_type (Integer)
|
101
|
-
* * length (Integer)
|
102
|
-
* * addr_list (Array)
|
103
|
-
*/
|
104
|
-
static VALUE host_info(VALUE klass){
|
105
|
-
VALUE v_hostinfo = Qnil;
|
106
|
-
VALUE v_addr = rb_ary_new();
|
107
|
-
VALUE v_array = rb_ary_new();
|
108
|
-
VALUE v_aliases = rb_ary_new();
|
109
|
-
|
110
|
-
sethostent(0);
|
111
|
-
|
112
|
-
#ifdef HAVE_GETHOSTENT_R
|
113
|
-
struct hostent host;
|
114
|
-
struct hostent* result;
|
115
|
-
char buf[HOSTENT_BUF];
|
116
|
-
int err;
|
117
|
-
|
118
|
-
while(!gethostent_r(&host, buf, sizeof(buf), &result, &err)){
|
119
|
-
while(*result->h_aliases){
|
120
|
-
rb_ary_push(v_aliases, rb_str_new2(*result->h_aliases));
|
121
|
-
*result->h_aliases++;
|
122
|
-
}
|
123
|
-
|
124
|
-
while(*result->h_addr_list){
|
125
|
-
inet_ntop(result->h_addrtype, *result->h_addr_list, buf, sizeof(buf));
|
126
|
-
rb_ary_push(v_addr, rb_str_new2(buf));
|
127
|
-
*result->h_addr_list++;
|
128
|
-
}
|
129
|
-
|
130
|
-
/* We need to dup the arrays because Ruby is holding onto the same
|
131
|
-
* reference.
|
132
|
-
*/
|
133
|
-
v_hostinfo = rb_struct_new(sHostInfo,
|
134
|
-
rb_str_new2(result->h_name),
|
135
|
-
rb_ary_dup(v_aliases),
|
136
|
-
INT2FIX(result->h_addrtype),
|
137
|
-
INT2FIX(result->h_length),
|
138
|
-
rb_ary_dup(v_addr)
|
139
|
-
);
|
140
|
-
#else
|
141
|
-
struct hostent* host;
|
142
|
-
char buf[INET_ADDRSTRLEN];
|
143
|
-
|
144
|
-
while((host = gethostent())){
|
145
|
-
while(*host->h_aliases){
|
146
|
-
rb_ary_push(v_aliases, rb_str_new2(*host->h_aliases));
|
147
|
-
*host->h_aliases++;
|
148
|
-
}
|
149
|
-
|
150
|
-
while(*host->h_addr_list){
|
151
|
-
inet_ntop(host->h_addrtype, *host->h_addr_list, buf, sizeof(buf));
|
152
|
-
rb_ary_push(v_addr, rb_str_new2(buf));
|
153
|
-
*host->h_addr_list++;
|
154
|
-
}
|
155
|
-
|
156
|
-
v_hostinfo = rb_struct_new(sHostInfo,
|
157
|
-
rb_str_new2(host->h_name),
|
158
|
-
rb_ary_dup(v_aliases),
|
159
|
-
INT2FIX(host->h_addrtype),
|
160
|
-
INT2FIX(host->h_length),
|
161
|
-
rb_ary_dup(v_addr)
|
162
|
-
);
|
163
|
-
#endif
|
164
|
-
|
165
|
-
if(rb_block_given_p())
|
166
|
-
rb_yield(v_hostinfo);
|
167
|
-
else
|
168
|
-
rb_ary_push(v_array, v_hostinfo);
|
169
|
-
|
170
|
-
rb_ary_clear(v_aliases);
|
171
|
-
rb_ary_clear(v_addr);
|
172
|
-
}
|
173
|
-
|
174
|
-
endhostent();
|
175
|
-
|
176
|
-
if(rb_block_given_p())
|
177
|
-
return Qnil;
|
178
|
-
|
179
|
-
return v_array;
|
180
|
-
}
|
181
|
-
|
182
|
-
#ifdef HAVE_GETHOSTID
|
183
|
-
/*
|
184
|
-
* Sys::Host.host_id
|
185
|
-
*
|
186
|
-
* Returns the host id of the current machine.
|
187
|
-
*/
|
188
|
-
static VALUE host_host_id(){
|
189
|
-
return ULL2NUM(gethostid());
|
190
|
-
}
|
191
|
-
#endif
|
192
|
-
|
193
|
-
void Init_host()
|
194
|
-
{
|
195
|
-
VALUE mSys, cHost;
|
196
|
-
|
197
|
-
/* The Sys module serves as a toplevel namespace, nothing more. */
|
198
|
-
mSys = rb_define_module("Sys");
|
199
|
-
|
200
|
-
/* The Host class encapsulates information about your machine, such as
|
201
|
-
* the host name and IP address.
|
202
|
-
*/
|
203
|
-
cHost = rb_define_class_under(mSys, "Host", rb_cObject);
|
204
|
-
|
205
|
-
/* This error is raised if any of the Host methods fail. */
|
206
|
-
cHostError = rb_define_class_under(cHost, "Error", rb_eStandardError);
|
207
|
-
|
208
|
-
/* 0.6.1: The version of this library. This is a string, not a number. */
|
209
|
-
rb_define_const(cHost, "VERSION", rb_str_new2(SYS_HOST_VERSION));
|
210
|
-
|
211
|
-
/* Structs */
|
212
|
-
sHostInfo = rb_struct_define("HostInfo", "name", "aliases", "addr_type",
|
213
|
-
"length", "addr_list", NULL
|
214
|
-
);
|
215
|
-
|
216
|
-
/* Class Methods */
|
217
|
-
rb_define_singleton_method(cHost, "hostname", host_hostname, 0);
|
218
|
-
rb_define_singleton_method(cHost, "ip_addr", host_ip_addr, 0);
|
219
|
-
rb_define_singleton_method(cHost, "info", host_info, 0);
|
220
|
-
|
221
|
-
#ifdef HAVE_GETHOSTID
|
222
|
-
rb_define_singleton_method(cHost, "host_id", host_host_id, 0);
|
223
|
-
#endif
|
224
|
-
}
|
225
|
-
|
226
|
-
#ifdef __cplusplus
|
227
|
-
}
|
228
|
-
#endif
|