net-proto 1.0.1 → 1.0.3
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 +10 -0
- data/MANIFEST +13 -17
- data/README +15 -10
- data/doc/netproto.txt +15 -15
- data/ext/extconf.rb +16 -0
- data/ext/generic/generic.c +144 -0
- data/ext/linux/linux.c +153 -0
- data/ext/sunos/sunos.c +137 -0
- data/{lib → ext}/version.h +1 -1
- data/ext/windows/windows.c +73 -0
- data/test/tc_netproto.rb +5 -28
- metadata +17 -8
- data/extconf.rb +0 -30
- data/lib/net/sunos.c +0 -136
data/CHANGES
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
== 1.0.3 - 13-Aug-2007
|
2
|
+
* Fix for OS X (whining about malloced pointer).
|
3
|
+
* Added a Rakefile along with tasks for installation and testing.
|
4
|
+
* Major internal reorganization.
|
5
|
+
* Fixed Proto::VERSION test.
|
6
|
+
|
7
|
+
== 1.0.2 - 18-Nov-2006
|
8
|
+
* Updated the README, gemspec and netproto.txt files.
|
9
|
+
* No code changes.
|
10
|
+
|
1
11
|
== 1.0.1 - 30-Jun-2006
|
2
12
|
* Added rdoc to the source files.
|
3
13
|
* Added a gemspec.
|
data/MANIFEST
CHANGED
@@ -1,17 +1,13 @@
|
|
1
|
-
CHANGES
|
2
|
-
MANIFEST
|
3
|
-
README
|
4
|
-
|
5
|
-
net-proto.gemspec
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
lib/net/sunos.c
|
15
|
-
lib/net/windows.c
|
16
|
-
|
17
|
-
test/tc_netproto.rb
|
1
|
+
* CHANGES
|
2
|
+
* MANIFEST
|
3
|
+
* README
|
4
|
+
* Rakefile
|
5
|
+
* net-proto.gemspec
|
6
|
+
* doc/netproto.txt
|
7
|
+
* examples/test_proto.rb
|
8
|
+
* ext/version.h
|
9
|
+
* ext/generic/generic.c
|
10
|
+
* ext/linux/linux.c
|
11
|
+
* ext/sunos/sunos.c
|
12
|
+
* ext/windows/windows.c
|
13
|
+
* test/tc_netproto.rb
|
data/README
CHANGED
@@ -1,25 +1,30 @@
|
|
1
1
|
== Description
|
2
|
-
The net-proto package provides
|
3
|
-
|
2
|
+
The net-proto package provides a way to get protocol information.
|
3
|
+
|
4
|
+
This is really just a wrapper for the getprotobyname(), getprotobynumber() and
|
5
|
+
the getprotoent() functions.
|
4
6
|
|
5
7
|
== Prerequisites
|
6
8
|
Ruby 1.8.0 or later.
|
7
9
|
|
8
10
|
== Installation
|
9
|
-
|
10
|
-
|
11
|
-
ruby test\tc_netproto.rb (optional)
|
12
|
-
make site-install
|
11
|
+
rake test (optional)
|
12
|
+
rake install (non-gem) OR rake install_gem (gem)
|
13
13
|
|
14
14
|
== Notes
|
15
|
-
The net-proto package uses reentrant code for sunos and linux.
|
15
|
+
The net-proto package uses reentrant code for sunos and linux. Otherwise, the
|
16
16
|
generic form of the functions are used (which may be reentrant by default
|
17
17
|
anway - check the man pages on your platform).
|
18
18
|
|
19
|
-
The Proto.getprotoent method is not supported on
|
19
|
+
The Proto.getprotoent method is not supported on MS Windows because the
|
20
|
+
underlying function isn't supported by the MS Windows API.
|
20
21
|
|
21
22
|
== Why should I use this?
|
22
|
-
Ruby
|
23
|
-
|
23
|
+
Ruby has a predefined set of constants in socket.c in the general form of
|
24
|
+
IPPROTO_XXX, Y. However, using constants in this fashion can be unreliable
|
24
25
|
because it's easy to define your own protocols (I set 'echo' to 7, for
|
25
26
|
example), or to modify/delete entries in /etc/protocols.
|
27
|
+
|
28
|
+
== Further Documentation
|
29
|
+
See the 'netproto.txt' file under the 'doc' directory for more details. There
|
30
|
+
is also an example under the 'examples' directory.
|
data/doc/netproto.txt
CHANGED
@@ -20,7 +20,7 @@
|
|
20
20
|
|
21
21
|
== Constants
|
22
22
|
VERSION
|
23
|
-
|
23
|
+
The current version number of this package, returned as a String.
|
24
24
|
|
25
25
|
== Class Methods
|
26
26
|
Proto.getprotobyname(name)
|
@@ -37,8 +37,8 @@ Proto.getprotoent{ |struct| ... }
|
|
37
37
|
Proto::ProtoStruct. In non-block form, returns an array of
|
38
38
|
Proto::ProtoStruct objects.
|
39
39
|
|
40
|
-
|
41
|
-
|
40
|
+
The fields are 'name' (a String), 'aliases' (an Array of String's,
|
41
|
+
though often only one element), and 'proto' (a Fixnum).
|
42
42
|
|
43
43
|
This method is NOT supported on MS Windows.
|
44
44
|
|
@@ -53,8 +53,8 @@ Proto.getprotoent{ |struct| ... }
|
|
53
53
|
separate method calls. Rather, these are called internally by the various
|
54
54
|
methods, except on Windows, which does not support them.
|
55
55
|
|
56
|
-
The 'getprotoent()' method is not supported on the
|
57
|
-
not part of the API as of Windows XP.
|
56
|
+
The 'getprotoent()' method is not supported on the MS Windows platform.
|
57
|
+
It's not part of the API as of Windows XP.
|
58
58
|
|
59
59
|
== Known Bugs
|
60
60
|
None that I'm aware of. Please log any bug reports on the project page
|
@@ -62,21 +62,21 @@ Proto.getprotoent{ |struct| ... }
|
|
62
62
|
|
63
63
|
== Future Plans
|
64
64
|
Use the asynchronous calls (WSAAsyncGetProtoByName and
|
65
|
-
WSAAsyncGetProtoByNumber) on
|
65
|
+
WSAAsyncGetProtoByNumber) on MS Windows systems.
|
66
66
|
|
67
67
|
== Copyright
|
68
|
-
|
69
|
-
|
68
|
+
(C) 2003-2007 Daniel J. Berger
|
69
|
+
All rights reserved.
|
70
70
|
|
71
71
|
== Warranty
|
72
|
-
|
73
|
-
|
74
|
-
|
72
|
+
This package is provided "as is" and without any express or
|
73
|
+
implied warranties, including, without limitation, the implied
|
74
|
+
warranties of merchantability and fitness for a particular purpose.
|
75
75
|
|
76
76
|
== License
|
77
|
-
|
77
|
+
Ruby's
|
78
78
|
|
79
79
|
== Author
|
80
|
-
|
81
|
-
|
82
|
-
|
80
|
+
Daniel J. Berger
|
81
|
+
djberg96 at gmail dot com
|
82
|
+
imperator on IRC (Freenode)
|
data/ext/extconf.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'mkmf'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
case RUBY_PLATFORM
|
5
|
+
when /sunos|solaris/i
|
6
|
+
have_library('socket')
|
7
|
+
FileUtils.cp('sunos/sunos.c', 'proto.c')
|
8
|
+
when /linux/i
|
9
|
+
FileUtils.cp('linux/linux.c', 'proto.c')
|
10
|
+
when /win32|windows|dos|mingw|cygwin/i
|
11
|
+
FileUtils.cp('windows/windows.c', 'proto.c')
|
12
|
+
else
|
13
|
+
FileUtils.cp('generic/generic.c', 'proto.c')
|
14
|
+
end
|
15
|
+
|
16
|
+
create_makefile('net/proto')
|
@@ -0,0 +1,144 @@
|
|
1
|
+
/*******************************************************
|
2
|
+
* proto.c (generic.c)
|
3
|
+
*******************************************************/
|
4
|
+
#include <ruby.h>
|
5
|
+
#include <version.h>
|
6
|
+
#include <netdb.h>
|
7
|
+
#include <string.h>
|
8
|
+
|
9
|
+
#ifdef __cplusplus
|
10
|
+
extern "C"
|
11
|
+
{
|
12
|
+
#endif
|
13
|
+
|
14
|
+
VALUE sProto;
|
15
|
+
|
16
|
+
/*
|
17
|
+
* call-seq:
|
18
|
+
* Proto.getprotobyname(name)
|
19
|
+
*
|
20
|
+
* Given a protocol string, returns the corresponding number, or nil if not
|
21
|
+
* found.
|
22
|
+
*/
|
23
|
+
static VALUE np_getprotobyname(VALUE klass, VALUE v_proto_name){
|
24
|
+
struct protoent* p;
|
25
|
+
VALUE v_proto_num = Qnil;
|
26
|
+
|
27
|
+
SafeStringValue(v_proto_name);
|
28
|
+
|
29
|
+
setprotoent(0);
|
30
|
+
p = getprotobyname(StringValuePtr(v_proto_name));
|
31
|
+
|
32
|
+
if(p)
|
33
|
+
v_proto_num = INT2FIX(p->p_proto);
|
34
|
+
|
35
|
+
endprotoent();
|
36
|
+
|
37
|
+
return v_proto_num;
|
38
|
+
}
|
39
|
+
|
40
|
+
/*
|
41
|
+
* call-seq:
|
42
|
+
* Proto.getprotobynumber(num)
|
43
|
+
*
|
44
|
+
* Given a protocol number, returns the corresponding string, or nil if not
|
45
|
+
* found.
|
46
|
+
*/
|
47
|
+
static VALUE np_getprotobynumber(VALUE klass, VALUE v_proto_num){
|
48
|
+
struct protoent* p;
|
49
|
+
VALUE v_proto_name = Qnil;
|
50
|
+
|
51
|
+
setprotoent(0);
|
52
|
+
p = getprotobynumber(NUM2INT(v_proto_num));
|
53
|
+
|
54
|
+
if(p)
|
55
|
+
v_proto_name = rb_str_new2(p->p_name);
|
56
|
+
|
57
|
+
endprotoent();
|
58
|
+
|
59
|
+
return v_proto_name;
|
60
|
+
}
|
61
|
+
|
62
|
+
/*
|
63
|
+
* call-seq:
|
64
|
+
* Proto.getprotoent
|
65
|
+
* Proto.getprotoent{ |struct| ... }
|
66
|
+
*
|
67
|
+
* In block form, yields each entry from /etc/protocols as a struct of type
|
68
|
+
* Proto::ProtoStruct. In non-block form, returns an array of
|
69
|
+
* Proto::ProtoStruct objects.
|
70
|
+
|
71
|
+
* The fields are 'name' (a String), 'aliases' (an Array of String's,
|
72
|
+
* though often only one element), and 'proto' (a Fixnum).
|
73
|
+
*/
|
74
|
+
static VALUE np_getprotoent(VALUE klass){
|
75
|
+
struct protoent* p;
|
76
|
+
VALUE v_aliases = Qnil;
|
77
|
+
VALUE v_array = Qnil;
|
78
|
+
VALUE v_struct = Qnil;
|
79
|
+
|
80
|
+
p = malloc(sizeof(struct protoent));
|
81
|
+
|
82
|
+
if(!rb_block_given_p())
|
83
|
+
v_array = rb_ary_new();
|
84
|
+
|
85
|
+
setprotoent(0);
|
86
|
+
|
87
|
+
while((p = getprotoent())){
|
88
|
+
v_aliases = rb_ary_new();
|
89
|
+
|
90
|
+
#ifdef __MACH__ or #ifdef __APPLE__
|
91
|
+
char **aliases = p->p_aliases;
|
92
|
+
while(*aliases){
|
93
|
+
rb_ary_push(v_aliases, rb_str_new2(*aliases));
|
94
|
+
aliases++;
|
95
|
+
}
|
96
|
+
#else
|
97
|
+
while(*p->p_aliases){
|
98
|
+
rb_ary_push(v_aliases, rb_str_new2(*p->p_aliases));
|
99
|
+
(void)p->p_aliases++;
|
100
|
+
}
|
101
|
+
#endif
|
102
|
+
|
103
|
+
v_struct = rb_struct_new(sProto,
|
104
|
+
rb_str_new2(p->p_name),
|
105
|
+
v_aliases,
|
106
|
+
INT2FIX(p->p_proto)
|
107
|
+
);
|
108
|
+
|
109
|
+
if(rb_block_given_p())
|
110
|
+
rb_yield(v_struct);
|
111
|
+
else
|
112
|
+
rb_ary_push(v_array, v_struct);
|
113
|
+
}
|
114
|
+
|
115
|
+
free(p);
|
116
|
+
endprotoent();
|
117
|
+
|
118
|
+
return v_array; /* nil if a block is given */
|
119
|
+
}
|
120
|
+
|
121
|
+
void Init_proto(){
|
122
|
+
VALUE mNet, cProto;
|
123
|
+
|
124
|
+
/* The Net module serves only as a namespace */
|
125
|
+
mNet = rb_define_module("Net");
|
126
|
+
|
127
|
+
/* The Proto class encapsulates network protocol information */
|
128
|
+
cProto = rb_define_class_under(mNet, "Proto", rb_cObject);
|
129
|
+
|
130
|
+
/* Structure definitions */
|
131
|
+
sProto = rb_struct_define("ProtoStruct", "name", "aliases", "proto", 0);
|
132
|
+
|
133
|
+
/* Class methods */
|
134
|
+
rb_define_singleton_method(cProto, "getprotobyname", np_getprotobyname, 1);
|
135
|
+
rb_define_singleton_method(cProto, "getprotobynumber", np_getprotobynumber, 1);
|
136
|
+
rb_define_singleton_method(cProto, "getprotoent", np_getprotoent, 0);
|
137
|
+
|
138
|
+
/* 1.0.3: The version of this package. This is a string, not a number */
|
139
|
+
rb_define_const(cProto, "VERSION", rb_str_new2(NET_PROTO_VERSION));
|
140
|
+
}
|
141
|
+
|
142
|
+
#ifdef __cplusplus
|
143
|
+
}
|
144
|
+
#endif
|
data/ext/linux/linux.c
ADDED
@@ -0,0 +1,153 @@
|
|
1
|
+
/*******************************************************
|
2
|
+
* proto.c (linux.c)
|
3
|
+
*******************************************************/
|
4
|
+
#include <ruby.h>
|
5
|
+
#include <version.h>
|
6
|
+
#include <netdb.h>
|
7
|
+
#include <string.h>
|
8
|
+
|
9
|
+
#ifdef __cplusplus
|
10
|
+
extern "C"
|
11
|
+
{
|
12
|
+
#endif
|
13
|
+
|
14
|
+
#define BUF_SIZE 8192
|
15
|
+
|
16
|
+
VALUE sProto;
|
17
|
+
|
18
|
+
/*
|
19
|
+
* call-seq:
|
20
|
+
* Proto.getprotobyname(name)
|
21
|
+
*
|
22
|
+
* Given a protocol string, returns the corresponding number, or nil if not
|
23
|
+
* found.
|
24
|
+
*/
|
25
|
+
static VALUE np_getprotobyname(VALUE klass, VALUE v_proto_name){
|
26
|
+
struct protoent* p;
|
27
|
+
char buffer[BUF_SIZE];
|
28
|
+
VALUE v_proto_num = Qnil;
|
29
|
+
|
30
|
+
SafeStringValue(v_proto_name);
|
31
|
+
|
32
|
+
p = malloc(sizeof(struct protoent));
|
33
|
+
|
34
|
+
setprotoent(0);
|
35
|
+
getprotobyname_r(StringValuePtr(v_proto_name), p, buffer, BUF_SIZE, &p);
|
36
|
+
|
37
|
+
if(p){
|
38
|
+
v_proto_num = INT2FIX(p->p_proto);
|
39
|
+
free(p);
|
40
|
+
}
|
41
|
+
|
42
|
+
endprotoent();
|
43
|
+
return v_proto_num;
|
44
|
+
}
|
45
|
+
|
46
|
+
/*
|
47
|
+
* call-seq:
|
48
|
+
* Proto.getprotobynumber(num)
|
49
|
+
*
|
50
|
+
* Given a protocol number, returns the corresponding string, or nil if not
|
51
|
+
* found.
|
52
|
+
*/
|
53
|
+
|
54
|
+
static VALUE np_getprotobynumber(VALUE klass, VALUE v_proto_num){
|
55
|
+
struct protoent* p;
|
56
|
+
char buffer[BUF_SIZE];
|
57
|
+
char* proto_name;
|
58
|
+
VALUE v_proto_name = Qnil;
|
59
|
+
|
60
|
+
p = malloc(sizeof(struct protoent));
|
61
|
+
|
62
|
+
setprotoent(0);
|
63
|
+
getprotobynumber_r(NUM2INT(v_proto_num), p, buffer, BUF_SIZE, &p);
|
64
|
+
|
65
|
+
if(p){
|
66
|
+
v_proto_name = rb_str_new2(proto_name = p->p_name);
|
67
|
+
free(p);
|
68
|
+
}
|
69
|
+
|
70
|
+
endprotoent();
|
71
|
+
return v_proto_name;
|
72
|
+
}
|
73
|
+
|
74
|
+
/*
|
75
|
+
* call-seq:
|
76
|
+
* Proto.getprotoent
|
77
|
+
* Proto.getprotoent{ |struct| ... }
|
78
|
+
*
|
79
|
+
* In block form, yields each entry from /etc/protocols as a struct of type
|
80
|
+
* Proto::ProtoStruct. In non-block form, returns an array of
|
81
|
+
* Proto::ProtoStruct objects.
|
82
|
+
|
83
|
+
* The fields are 'name' (a String), 'aliases' (an Array of String's,
|
84
|
+
* though often only one element), and 'proto' (a Fixnum).
|
85
|
+
*/
|
86
|
+
static VALUE np_getprotoent(VALUE klass){
|
87
|
+
struct protoent* p;
|
88
|
+
struct protoent* q;
|
89
|
+
char buffer[BUF_SIZE];
|
90
|
+
VALUE v_alias_array = Qnil;
|
91
|
+
VALUE v_array = Qnil;
|
92
|
+
VALUE v_struct = Qnil;
|
93
|
+
|
94
|
+
p = malloc(sizeof(struct protoent));
|
95
|
+
q = malloc(sizeof(struct protoent));
|
96
|
+
|
97
|
+
if(!rb_block_given_p())
|
98
|
+
v_array = rb_ary_new();
|
99
|
+
|
100
|
+
setprotoent(0);
|
101
|
+
|
102
|
+
while(!getprotoent_r(p, buffer, BUF_SIZE, &q)){
|
103
|
+
v_alias_array = rb_ary_new();
|
104
|
+
|
105
|
+
while((*p->p_aliases)){
|
106
|
+
rb_ary_push(v_alias_array, rb_str_new2(*p->p_aliases));
|
107
|
+
(void)*p->p_aliases++;
|
108
|
+
}
|
109
|
+
|
110
|
+
v_struct = rb_struct_new(sProto,
|
111
|
+
rb_str_new2(p->p_name),
|
112
|
+
v_alias_array,
|
113
|
+
INT2FIX(p->p_proto)
|
114
|
+
);
|
115
|
+
|
116
|
+
if(rb_block_given_p())
|
117
|
+
rb_yield(v_struct);
|
118
|
+
else
|
119
|
+
rb_ary_push(v_array, v_struct);
|
120
|
+
}
|
121
|
+
|
122
|
+
free(p);
|
123
|
+
free(q);
|
124
|
+
|
125
|
+
endprotoent();
|
126
|
+
|
127
|
+
return v_array; /* nil if a block was given */
|
128
|
+
}
|
129
|
+
|
130
|
+
void Init_proto(){
|
131
|
+
VALUE mNet, cProto;
|
132
|
+
|
133
|
+
/* The Net module serves as a namespace only */
|
134
|
+
mNet = rb_define_module("Net");
|
135
|
+
|
136
|
+
/* The Proto class encapsulates network protocol information */
|
137
|
+
cProto = rb_define_class_under(mNet, "Proto", rb_cObject);
|
138
|
+
|
139
|
+
/* Structure definitions */
|
140
|
+
sProto = rb_struct_define("ProtoStruct", "name", "aliases", "proto", 0);
|
141
|
+
|
142
|
+
/* Class methods */
|
143
|
+
rb_define_singleton_method(cProto, "getprotobyname", np_getprotobyname, 1);
|
144
|
+
rb_define_singleton_method(cProto, "getprotobynumber", np_getprotobynumber, 1);
|
145
|
+
rb_define_singleton_method(cProto, "getprotoent", np_getprotoent, 0);
|
146
|
+
|
147
|
+
/* 1.0.3: The version of this package. This is a string, not a number */
|
148
|
+
rb_define_const(cProto, "VERSION", rb_str_new2(NET_PROTO_VERSION));
|
149
|
+
}
|
150
|
+
|
151
|
+
#ifdef __cplusplus
|
152
|
+
}
|
153
|
+
#endif
|
data/ext/sunos/sunos.c
ADDED
@@ -0,0 +1,137 @@
|
|
1
|
+
/*******************************************************
|
2
|
+
* proto.c (sunos.c)
|
3
|
+
*******************************************************/
|
4
|
+
#include <ruby.h>
|
5
|
+
#include <version.h>
|
6
|
+
#include <netdb.h>
|
7
|
+
#include <string.h>
|
8
|
+
|
9
|
+
#ifdef __cplusplus
|
10
|
+
extern "C"
|
11
|
+
{
|
12
|
+
#endif
|
13
|
+
|
14
|
+
#define BUF_SIZE 8192
|
15
|
+
|
16
|
+
VALUE sProto;
|
17
|
+
|
18
|
+
/*
|
19
|
+
* call-seq:
|
20
|
+
* Proto.getprotobyname(name)
|
21
|
+
*
|
22
|
+
* Given a protocol string, returns the corresponding number, or nil if not
|
23
|
+
* found.
|
24
|
+
*/
|
25
|
+
static VALUE np_getprotobyname(VALUE klass, VALUE v_proto_name){
|
26
|
+
struct protoent p;
|
27
|
+
char buffer[BUF_SIZE];
|
28
|
+
VALUE v_proto_num = Qnil;
|
29
|
+
|
30
|
+
SafeStringValue(v_proto_name);
|
31
|
+
|
32
|
+
setprotoent(0);
|
33
|
+
|
34
|
+
if(getprotobyname_r(StringValuePtr(v_proto_name),&p,buffer,BUF_SIZE) != NULL)
|
35
|
+
v_proto_num = INT2FIX(p.p_proto);
|
36
|
+
|
37
|
+
endprotoent();
|
38
|
+
|
39
|
+
return v_proto_num;
|
40
|
+
}
|
41
|
+
|
42
|
+
/*
|
43
|
+
* call-seq:
|
44
|
+
* Proto.getprotobynumber(num)
|
45
|
+
*
|
46
|
+
* Given a protocol number, returns the corresponding string, or nil if not
|
47
|
+
* found.
|
48
|
+
*/
|
49
|
+
static VALUE np_getprotobynumber(VALUE klass, VALUE v_proto_num){
|
50
|
+
struct protoent p;
|
51
|
+
char buffer[BUF_SIZE];
|
52
|
+
VALUE v_proto_name = Qnil;
|
53
|
+
|
54
|
+
setprotoent(0);
|
55
|
+
|
56
|
+
if(getprotobynumber_r(NUM2INT(v_proto_num),&p,buffer,BUF_SIZE) != NULL)
|
57
|
+
v_proto_name = rb_str_new2(p.p_name);
|
58
|
+
|
59
|
+
endprotoent();
|
60
|
+
|
61
|
+
return v_proto_name;
|
62
|
+
}
|
63
|
+
|
64
|
+
/*
|
65
|
+
* call-seq:
|
66
|
+
* Proto.getprotoent
|
67
|
+
* Proto.getprotoent{ |struct| ... }
|
68
|
+
*
|
69
|
+
* In block form, yields each entry from /etc/protocols as a struct of type
|
70
|
+
* Proto::ProtoStruct. In non-block form, returns an array of
|
71
|
+
* Proto::ProtoStruct objects.
|
72
|
+
|
73
|
+
* The fields are 'name' (a String), 'aliases' (an Array of String's,
|
74
|
+
* though often only one element), and 'proto' (a Fixnum).
|
75
|
+
*/
|
76
|
+
static VALUE np_getprotoent(){
|
77
|
+
struct protoent p;
|
78
|
+
char buffer[BUF_SIZE];
|
79
|
+
VALUE v_alias_array = Qnil;
|
80
|
+
VALUE v_array = Qnil;
|
81
|
+
VALUE v_struct = Qnil;
|
82
|
+
|
83
|
+
if(!rb_block_given_p())
|
84
|
+
v_array = rb_ary_new();
|
85
|
+
|
86
|
+
setprotoent(0);
|
87
|
+
|
88
|
+
while(getprotoent_r(&p, buffer, BUF_SIZE)){
|
89
|
+
v_alias_array = rb_ary_new();
|
90
|
+
|
91
|
+
while(*p.p_aliases){
|
92
|
+
rb_ary_push(v_alias_array ,rb_str_new2(*p.p_aliases));
|
93
|
+
(void)p.p_aliases++;
|
94
|
+
}
|
95
|
+
|
96
|
+
v_struct = rb_struct_new(sProto,
|
97
|
+
rb_str_new2(p.p_name),
|
98
|
+
v_alias_array,
|
99
|
+
INT2FIX(p.p_proto)
|
100
|
+
);
|
101
|
+
|
102
|
+
if(rb_block_given_p())
|
103
|
+
rb_yield(v_struct);
|
104
|
+
else
|
105
|
+
rb_ary_push(v_array, v_struct);
|
106
|
+
}
|
107
|
+
|
108
|
+
endprotoent();
|
109
|
+
|
110
|
+
return v_array; /* nil unless a block is given */
|
111
|
+
}
|
112
|
+
|
113
|
+
void Init_proto()
|
114
|
+
{
|
115
|
+
VALUE mNet, cProto;
|
116
|
+
|
117
|
+
/* The Net module serves only as a namespace */
|
118
|
+
mNet = rb_define_module("Net");
|
119
|
+
|
120
|
+
/* The Proto class encapsulates information associated for network protocol entries */
|
121
|
+
cProto = rb_define_class_under(mNet, "Proto", rb_cObject);
|
122
|
+
|
123
|
+
/* Structure definitions */
|
124
|
+
sProto = rb_struct_define("ProtoStruct", "name", "aliases", "proto", 0);
|
125
|
+
|
126
|
+
/* Class methods */
|
127
|
+
rb_define_singleton_method(cProto, "getprotobyname", np_getprotobyname,1);
|
128
|
+
rb_define_singleton_method(cProto, "getprotobynumber", np_getprotobynumber,1);
|
129
|
+
rb_define_singleton_method(cProto, "getprotoent", np_getprotoent,0);
|
130
|
+
|
131
|
+
/* 1.0.3: The version of this package. This a string, not a number */
|
132
|
+
rb_define_const(cProto, "VERSION", rb_str_new2(NET_PROTO_VERSION));
|
133
|
+
}
|
134
|
+
|
135
|
+
#ifdef __cplusplus
|
136
|
+
}
|
137
|
+
#endif
|
data/{lib → ext}/version.h
RENAMED
@@ -1,2 +1,2 @@
|
|
1
1
|
/* version.h - there can be only one */
|
2
|
-
#define NET_PROTO_VERSION "1.0.
|
2
|
+
#define NET_PROTO_VERSION "1.0.3"
|
@@ -0,0 +1,73 @@
|
|
1
|
+
/***********************
|
2
|
+
* proto.c (windows.c)
|
3
|
+
***********************/
|
4
|
+
#include <ruby.h>
|
5
|
+
#include <version.h>
|
6
|
+
#include <windows.h>
|
7
|
+
|
8
|
+
#ifdef __cplusplus
|
9
|
+
extern "C"
|
10
|
+
{
|
11
|
+
#endif
|
12
|
+
|
13
|
+
/*
|
14
|
+
* call-seq:
|
15
|
+
* Proto.getprotobyname(name)
|
16
|
+
*
|
17
|
+
* Given a protocol string, returns the corresponding number, or nil if not
|
18
|
+
* found.
|
19
|
+
*/
|
20
|
+
static VALUE np_getprotobyname(VALUE klass, VALUE rbProtoName){
|
21
|
+
struct protoent* p;
|
22
|
+
VALUE v_proto_num = Qnil;
|
23
|
+
|
24
|
+
SafeStringValue(rbProtoName);
|
25
|
+
p = getprotobyname(StringValuePtr(rbProtoName));
|
26
|
+
|
27
|
+
if(p)
|
28
|
+
v_proto_num = INT2FIX(p->p_proto);
|
29
|
+
|
30
|
+
return v_proto_num;
|
31
|
+
}
|
32
|
+
|
33
|
+
/*
|
34
|
+
* call-seq:
|
35
|
+
* Proto.getprotobynumber(num)
|
36
|
+
*
|
37
|
+
* Given a protocol number, returns the corresponding string, or nil if not
|
38
|
+
* found.
|
39
|
+
*/
|
40
|
+
static VALUE np_getprotobynumber(VALUE klass, VALUE v_proto_num)
|
41
|
+
{
|
42
|
+
struct protoent* p;
|
43
|
+
VALUE v_proto_name = Qnil;
|
44
|
+
|
45
|
+
p = getprotobynumber(NUM2INT(v_proto_num));
|
46
|
+
|
47
|
+
if(p)
|
48
|
+
v_proto_name = rb_str_new2(p->p_name);
|
49
|
+
|
50
|
+
return v_proto_name;
|
51
|
+
}
|
52
|
+
|
53
|
+
void Init_proto()
|
54
|
+
{
|
55
|
+
VALUE mNet, cProto;
|
56
|
+
|
57
|
+
/* The Net module serves only as a namespace */
|
58
|
+
mNet = rb_define_module("Net");
|
59
|
+
|
60
|
+
/* The Proto class encapsulates network protocol information */
|
61
|
+
cProto = rb_define_class_under(mNet, "Proto", rb_cObject);
|
62
|
+
|
63
|
+
/* Class Methods */
|
64
|
+
rb_define_singleton_method(cProto,"getprotobyname",np_getprotobyname,1);
|
65
|
+
rb_define_singleton_method(cProto,"getprotobynumber",np_getprotobynumber,1);
|
66
|
+
|
67
|
+
/* 1.0.3: The version of this package. This is a string, not a number */
|
68
|
+
rb_define_const(cProto, "VERSION", rb_str_new2(NET_PROTO_VERSION));
|
69
|
+
}
|
70
|
+
|
71
|
+
#ifdef __cplusplus
|
72
|
+
}
|
73
|
+
#endif
|
data/test/tc_netproto.rb
CHANGED
@@ -1,32 +1,9 @@
|
|
1
|
-
|
1
|
+
###########################################################################
|
2
2
|
# tc_netproto.rb
|
3
3
|
#
|
4
|
-
# Test suite for net-proto - all platforms.
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
if base == "test" || base =~ /net-proto.*/
|
9
|
-
require "ftools"
|
10
|
-
Dir.chdir("..") if base == "test"
|
11
|
-
Dir.mkdir("net") unless File.exists?("net")
|
12
|
-
|
13
|
-
extension = ".so"
|
14
|
-
extension = ".sl" if RUBY_PLATFORM =~ /hpux/i
|
15
|
-
extension = ".bundle" if RUBY_PLATFORM =~ /darwin|powerpc/i
|
16
|
-
|
17
|
-
proto_file = "proto" + extension
|
18
|
-
|
19
|
-
if File.exist?(proto_file)
|
20
|
-
File.copy(proto_file,"net")
|
21
|
-
else
|
22
|
-
puts "No proto#{extenstion} file found."
|
23
|
-
puts "Please run extconf.rb and make first."
|
24
|
-
exit!
|
25
|
-
end
|
26
|
-
$LOAD_PATH.unshift(Dir.pwd)
|
27
|
-
Dir.chdir("test") rescue nil
|
28
|
-
end
|
29
|
-
|
4
|
+
# Test suite for net-proto - all platforms. This test suite should be run
|
5
|
+
# via the 'rake test' task.
|
6
|
+
###########################################################################
|
30
7
|
require "net/proto"
|
31
8
|
require "test/unit"
|
32
9
|
include Net
|
@@ -44,7 +21,7 @@ class TC_Net_Proto < Test::Unit::TestCase
|
|
44
21
|
end
|
45
22
|
|
46
23
|
def test_version
|
47
|
-
assert_equal("1.0.
|
24
|
+
assert_equal("1.0.3", Proto::VERSION)
|
48
25
|
end
|
49
26
|
|
50
27
|
def test_getprotobynumber
|
metadata
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.
|
2
|
+
rubygems_version: 0.9.4
|
3
3
|
specification_version: 1
|
4
4
|
name: net-proto
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 1.0.
|
7
|
-
date:
|
6
|
+
version: 1.0.3
|
7
|
+
date: 2007-08-13 00:00:00 -06:00
|
8
8
|
summary: The net-proto package provides the getprotobyname(), getprotobynumber() and the getprotoent() methods for Ruby.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -31,12 +31,19 @@ authors:
|
|
31
31
|
files:
|
32
32
|
- doc/netproto.txt
|
33
33
|
- test/tc_netproto.rb
|
34
|
+
- ext/extconf.rb
|
35
|
+
- ext/version.h
|
36
|
+
- ext/generic
|
37
|
+
- ext/generic/generic.c
|
38
|
+
- ext/linux
|
39
|
+
- ext/linux/linux.c
|
40
|
+
- ext/sunos
|
41
|
+
- ext/sunos/sunos.c
|
42
|
+
- ext/windows
|
43
|
+
- ext/windows/windows.c
|
34
44
|
- CHANGES
|
35
|
-
- MANIFEST
|
36
45
|
- README
|
37
|
-
-
|
38
|
-
- lib/version.h
|
39
|
-
- lib/net/sunos.c
|
46
|
+
- MANIFEST
|
40
47
|
test_files:
|
41
48
|
- test/tc_netproto.rb
|
42
49
|
rdoc_options: []
|
@@ -44,10 +51,12 @@ rdoc_options: []
|
|
44
51
|
extra_rdoc_files:
|
45
52
|
- CHANGES
|
46
53
|
- README
|
54
|
+
- MANIFEST
|
55
|
+
- doc/netproto.txt
|
47
56
|
executables: []
|
48
57
|
|
49
58
|
extensions:
|
50
|
-
- extconf.rb
|
59
|
+
- ext/extconf.rb
|
51
60
|
requirements: []
|
52
61
|
|
53
62
|
dependencies: []
|
data/extconf.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
################################
|
2
|
-
# extconf.rb file for net-proto
|
3
|
-
################################
|
4
|
-
require "mkmf"
|
5
|
-
require "ftools"
|
6
|
-
|
7
|
-
##################################################
|
8
|
-
# Use the appropriate .c file, based on platform
|
9
|
-
##################################################
|
10
|
-
c_file = nil
|
11
|
-
|
12
|
-
case RUBY_PLATFORM
|
13
|
-
when /win32|windows|mingw|cygwin/i
|
14
|
-
c_file = "lib/net/windows.c"
|
15
|
-
when /sunos|solaris/i
|
16
|
-
c_file = "lib/net/sunos.c"
|
17
|
-
have_library("socket")
|
18
|
-
when /linux/i
|
19
|
-
c_file = "lib/net/linux.c"
|
20
|
-
else
|
21
|
-
c_file = "lib/net/generic.c"
|
22
|
-
end
|
23
|
-
|
24
|
-
File.delete("proto.c") if File.exists?("proto.c")
|
25
|
-
File.delete("version.h") if File.exists?("version.h")
|
26
|
-
|
27
|
-
File.copy(c_file, "proto.c")
|
28
|
-
File.copy("lib/version.h",".")
|
29
|
-
|
30
|
-
create_makefile("net/proto")
|
data/lib/net/sunos.c
DELETED
@@ -1,136 +0,0 @@
|
|
1
|
-
/*******************************************************
|
2
|
-
* proto.c (sunos.c)
|
3
|
-
*******************************************************/
|
4
|
-
#include "ruby.h"
|
5
|
-
#include "version.h"
|
6
|
-
#include <netdb.h>
|
7
|
-
#include <string.h>
|
8
|
-
|
9
|
-
#ifdef __cplusplus
|
10
|
-
extern "C"
|
11
|
-
{
|
12
|
-
#endif
|
13
|
-
|
14
|
-
#define BUF_SIZE 8192
|
15
|
-
|
16
|
-
VALUE sProto;
|
17
|
-
|
18
|
-
/*
|
19
|
-
* call-seq:
|
20
|
-
* Proto.getprotobyname(name)
|
21
|
-
*
|
22
|
-
* Given a protocol string, returns the corresponding number, or nil if not
|
23
|
-
* found.
|
24
|
-
*/
|
25
|
-
static VALUE np_getprotobyname(VALUE klass, VALUE rbProtoName){
|
26
|
-
struct protoent p;
|
27
|
-
char buffer[BUF_SIZE];
|
28
|
-
VALUE rbProtoNum = Qnil;
|
29
|
-
|
30
|
-
SafeStringValue(rbProtoName);
|
31
|
-
|
32
|
-
setprotoent(0);
|
33
|
-
|
34
|
-
if(getprotobyname_r(StringValuePtr(rbProtoName),&p,buffer,BUF_SIZE) != NULL)
|
35
|
-
rbProtoNum = INT2FIX(p.p_proto);
|
36
|
-
|
37
|
-
endprotoent();
|
38
|
-
|
39
|
-
return rbProtoNum;
|
40
|
-
}
|
41
|
-
|
42
|
-
/*
|
43
|
-
* call-seq:
|
44
|
-
* Proto.getprotobynumber(num)
|
45
|
-
*
|
46
|
-
* Given a protocol number, returns the corresponding string, or nil if not
|
47
|
-
* found.
|
48
|
-
*/
|
49
|
-
static VALUE np_getprotobynumber(VALUE klass, VALUE rbProtoNum){
|
50
|
-
struct protoent p;
|
51
|
-
char buffer[BUF_SIZE];
|
52
|
-
VALUE rbProtoName = Qnil;
|
53
|
-
|
54
|
-
setprotoent(0);
|
55
|
-
|
56
|
-
if(getprotobynumber_r(NUM2INT(rbProtoNum),&p,buffer,BUF_SIZE) != NULL)
|
57
|
-
rbProtoName = rb_str_new2(p.p_name);
|
58
|
-
|
59
|
-
endprotoent();
|
60
|
-
|
61
|
-
return rbProtoName;
|
62
|
-
}
|
63
|
-
|
64
|
-
/*
|
65
|
-
* call-seq:
|
66
|
-
* Proto.getprotoent
|
67
|
-
* Proto.getprotoent{ |struct| ... }
|
68
|
-
*
|
69
|
-
* In block form, yields each entry from /etc/protocols as a struct of type
|
70
|
-
* Proto::ProtoStruct. In non-block form, returns an array of
|
71
|
-
* Proto::ProtoStruct objects.
|
72
|
-
|
73
|
-
* The fields are 'name' (a String), 'aliases' (an Array of String's,
|
74
|
-
* though often only one element), and 'proto' (a Fixnum).
|
75
|
-
*/
|
76
|
-
static VALUE np_getprotoent(){
|
77
|
-
struct protoent p;
|
78
|
-
char buffer[BUF_SIZE];
|
79
|
-
VALUE rbAliasArray = Qnil;
|
80
|
-
VALUE rbArray = Qnil;
|
81
|
-
VALUE rbStruct = Qnil;
|
82
|
-
|
83
|
-
if(!rb_block_given_p())
|
84
|
-
rbArray = rb_ary_new();
|
85
|
-
|
86
|
-
setprotoent(0);
|
87
|
-
|
88
|
-
while(getprotoent_r(&p, buffer, BUF_SIZE)){
|
89
|
-
rbAliasArray = rb_ary_new();
|
90
|
-
|
91
|
-
while(*p.p_aliases){
|
92
|
-
rb_ary_push(rbAliasArray ,rb_str_new2(*p.p_aliases));
|
93
|
-
(void)p.p_aliases++;
|
94
|
-
}
|
95
|
-
|
96
|
-
rbStruct = rb_struct_new(sProto,
|
97
|
-
rb_str_new2(p.p_name),
|
98
|
-
rbAliasArray,
|
99
|
-
INT2FIX(p.p_proto)
|
100
|
-
);
|
101
|
-
|
102
|
-
if(rb_block_given_p()){
|
103
|
-
rb_yield(rbStruct);
|
104
|
-
}
|
105
|
-
else{
|
106
|
-
rb_ary_push(rbArray, rbStruct);
|
107
|
-
}
|
108
|
-
}
|
109
|
-
|
110
|
-
endprotoent();
|
111
|
-
|
112
|
-
return rbArray; /* nil unless a block is given */
|
113
|
-
}
|
114
|
-
|
115
|
-
void Init_proto()
|
116
|
-
{
|
117
|
-
/* Module and class definitions */
|
118
|
-
VALUE mNet, cProto;
|
119
|
-
mNet = rb_define_module("Net");
|
120
|
-
cProto = rb_define_class_under(mNet,"Proto",rb_cObject);
|
121
|
-
|
122
|
-
/* Structure definitions */
|
123
|
-
sProto = rb_struct_define("ProtoStruct","name","aliases","proto",0);
|
124
|
-
|
125
|
-
/* Class methods */
|
126
|
-
rb_define_singleton_method(cProto,"getprotobyname",np_getprotobyname,1);
|
127
|
-
rb_define_singleton_method(cProto,"getprotobynumber",np_getprotobynumber,1);
|
128
|
-
rb_define_singleton_method(cProto,"getprotoent",np_getprotoent,0);
|
129
|
-
|
130
|
-
/* Constants */
|
131
|
-
rb_define_const(cProto,"VERSION",rb_str_new2(NET_PROTO_VERSION));
|
132
|
-
}
|
133
|
-
|
134
|
-
#ifdef __cplusplus
|
135
|
-
}
|
136
|
-
#endif
|