net-proto 1.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.
- data/CHANGES +74 -0
- data/MANIFEST +17 -0
- data/README +25 -0
- data/doc/netproto.txt +82 -0
- data/extconf.rb +30 -0
- data/lib/net/sunos.c +136 -0
- data/lib/version.h +2 -0
- data/test/tc_netproto.rb +94 -0
- metadata +54 -0
data/CHANGES
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
== 1.0.1 - 30-Jun-2006
|
2
|
+
* Added rdoc to the source files.
|
3
|
+
* Added a gemspec.
|
4
|
+
|
5
|
+
== 1.0.0 - 14-Jul-2005
|
6
|
+
* Moved project to RubyForge.
|
7
|
+
* Minor directory layout change.
|
8
|
+
* Minor changes to the extconf.rb file.
|
9
|
+
* Officially bumped VERSION to 1.0.0.
|
10
|
+
|
11
|
+
== 0.2.5 - 18-Apr-2005
|
12
|
+
* The Unix versions now call setprotoent(0) and endprotoent() internally
|
13
|
+
before each call.
|
14
|
+
|
15
|
+
== 0.2.4 - 12-Apr-2005
|
16
|
+
* Added internal taint checking for the Proto.getprotobyname method.
|
17
|
+
* Removed the INSTALL file. Installation instructions are now in the README.
|
18
|
+
* Moved the sample script into the 'examples' directory.
|
19
|
+
* General code cleanup.
|
20
|
+
* Minor test suite changes and additions.
|
21
|
+
* Removed the netproto.rd and netproto.html files. The netproto.txt file is
|
22
|
+
now rdoc friendly.
|
23
|
+
|
24
|
+
== 0.2.3 - 13-Sep-2004
|
25
|
+
* Replaced all instances of the deprecated STR2CSTR() function with the
|
26
|
+
StringValuePtr() function. That means that, as of this release, this
|
27
|
+
package requires Ruby 1.8.0 or later.
|
28
|
+
* Minor documentation corrections.
|
29
|
+
|
30
|
+
== 0.2.2 - 10-Apr-2004
|
31
|
+
* No longer returns an Array in block form. Only the non-block form returns
|
32
|
+
an array. The block form returns nil.
|
33
|
+
* Updated the documentation, warranty information included, license changed
|
34
|
+
back to "Ruby's".
|
35
|
+
* Modified extconf.rb. It is now assumed that you have TestUnit installed.
|
36
|
+
* Changed "tc_all.rb" to "tc_netproto.rb".
|
37
|
+
* Changed "netproto.rd2" to "netproto.rd".
|
38
|
+
|
39
|
+
== 0.2.1 - 29-Jul-2003
|
40
|
+
* Code cleanup (-Wall warnings on Linux)
|
41
|
+
* Removed VERSION() class method. Use the constant instead
|
42
|
+
* The getprotoent() method now returns an array of structs in non-block form
|
43
|
+
* Added README file
|
44
|
+
* Added generic test script under test/
|
45
|
+
* Modified extconf.rb to use generic test script for those who don't have
|
46
|
+
TestUnit installed, instead of dynamically generating one
|
47
|
+
* Fixed up TestUnit test suite
|
48
|
+
|
49
|
+
== 0.2.0 - 26-Feb-2003
|
50
|
+
* Added MS Windows support (except 'getprotoent()' - see docs)
|
51
|
+
* For protocols that aren't defined, nil is now returned instead
|
52
|
+
of crashing (always a good thing)
|
53
|
+
* Removed sys-uname requirement
|
54
|
+
* Added a test suite (for those with testunit installed)
|
55
|
+
* Some internal layout changes (doc, lib, test dirs)
|
56
|
+
* Added a VERSION constant and class method
|
57
|
+
* RD2 documentation now separated from source
|
58
|
+
* Installation instructions modified
|
59
|
+
* Lots of changes to extconf.rb
|
60
|
+
* Changelog now CHANGES
|
61
|
+
* Manifest now MANIFEST
|
62
|
+
* Package name changed to lower case
|
63
|
+
|
64
|
+
== 0.1.0 - 13-Aug-2002
|
65
|
+
* Fixed bug with getprotoent_r function for Linux
|
66
|
+
* Added a 'generic' source file that uses the non-reentrant functions for
|
67
|
+
those platforms that are not specifically supported.
|
68
|
+
* Added FreeBSD support
|
69
|
+
* Modified test script slightly
|
70
|
+
* Added a changelog :)
|
71
|
+
* Added a manifest
|
72
|
+
|
73
|
+
== 0.0.1 - 12-Aug-2002
|
74
|
+
* Initial release (though written earlier)
|
data/MANIFEST
ADDED
data/README
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
== Description
|
2
|
+
The net-proto package provides the getprotobyname(), getprotobynumber() and
|
3
|
+
the getprotoent() methods for Ruby.
|
4
|
+
|
5
|
+
== Prerequisites
|
6
|
+
Ruby 1.8.0 or later.
|
7
|
+
|
8
|
+
== Installation
|
9
|
+
ruby extconf.rb
|
10
|
+
make
|
11
|
+
ruby test\tc_netproto.rb (optional)
|
12
|
+
make site-install
|
13
|
+
|
14
|
+
== Notes
|
15
|
+
The net-proto package uses reentrant code for sunos and linux. Otherwise, the
|
16
|
+
generic form of the functions are used (which may be reentrant by default
|
17
|
+
anway - check the man pages on your platform).
|
18
|
+
|
19
|
+
The Proto.getprotoent method is not supported on Win32 platforms.
|
20
|
+
|
21
|
+
== Why should I use this?
|
22
|
+
Ruby does define a predefined set of constants in socket.c in the general form
|
23
|
+
of IPPROTO_XXX, Y. However, using constants in this fashion can be unreliable
|
24
|
+
because it's easy to define your own protocols (I set 'echo' to 7, for
|
25
|
+
example), or to modify/delete entries in /etc/protocols.
|
data/doc/netproto.txt
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
== Description
|
2
|
+
Net::Proto - An interface for the 'getproto' family of functions.
|
3
|
+
|
4
|
+
== Synopsis
|
5
|
+
require "net/proto"
|
6
|
+
include Net
|
7
|
+
|
8
|
+
Proto.getprotobyname("tcp") # -> 6
|
9
|
+
Proto.getprotobynumber(1) # -> "icmp"
|
10
|
+
|
11
|
+
# Block form
|
12
|
+
Proto.getprotoent{ |p|
|
13
|
+
puts p.name
|
14
|
+
puts p.aliases
|
15
|
+
puts p.proto
|
16
|
+
}
|
17
|
+
|
18
|
+
# Non-block form
|
19
|
+
a = Proto.getprotoent
|
20
|
+
|
21
|
+
== Constants
|
22
|
+
VERSION
|
23
|
+
The current version number of this package, returned as a String.
|
24
|
+
|
25
|
+
== Class Methods
|
26
|
+
Proto.getprotobyname(name)
|
27
|
+
Given a protocol string, returns the corresponding number, or nil if not
|
28
|
+
found.
|
29
|
+
|
30
|
+
Proto.getprotobynumber(num)
|
31
|
+
Given a protocol number, returns the corresponding string, or nil if not
|
32
|
+
found.
|
33
|
+
|
34
|
+
Proto.getprotoent
|
35
|
+
Proto.getprotoent{ |struct| ... }
|
36
|
+
In block form, yields each entry from /etc/protocols as a struct of type
|
37
|
+
Proto::ProtoStruct. In non-block form, returns an array of
|
38
|
+
Proto::ProtoStruct objects.
|
39
|
+
|
40
|
+
The fields are 'name' (a String), 'aliases' (an Array of String's,
|
41
|
+
though often only one element), and 'proto' (a Fixnum).
|
42
|
+
|
43
|
+
This method is NOT supported on MS Windows.
|
44
|
+
|
45
|
+
== Notes
|
46
|
+
This module uses the reentrant (i.e. thread safe) functions on those
|
47
|
+
platforms that support them. In some cases, e.g. FreeBSD and HP-UX, the
|
48
|
+
standard function names are reentrant by default (i.e. there is no '_r'
|
49
|
+
version, or it's not needed), so you will not see specific .c files for
|
50
|
+
all platforms.
|
51
|
+
|
52
|
+
The 'setprotoent()' and 'endprotoent()' functions are not implemented as
|
53
|
+
separate method calls. Rather, these are called internally by the various
|
54
|
+
methods, except on Windows, which does not support them.
|
55
|
+
|
56
|
+
The 'getprotoent()' method is not supported on the Win32 platform. It's
|
57
|
+
not part of the API as of Windows XP.
|
58
|
+
|
59
|
+
== Known Bugs
|
60
|
+
None that I'm aware of. Please log any bug reports on the project page
|
61
|
+
at http://ruby-netutils.sf.net.
|
62
|
+
|
63
|
+
== Future Plans
|
64
|
+
Use the asynchronous calls (WSAAsyncGetProtoByName and
|
65
|
+
WSAAsyncGetProtoByNumber) on Win32 systems.
|
66
|
+
|
67
|
+
== Copyright
|
68
|
+
(C) 2003-2005 Daniel J. Berger
|
69
|
+
All rights reserved.
|
70
|
+
|
71
|
+
== Warranty
|
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
|
+
|
76
|
+
== License
|
77
|
+
Ruby's
|
78
|
+
|
79
|
+
== Author
|
80
|
+
Daniel J. Berger
|
81
|
+
djberg96 at yahoo dot com
|
82
|
+
rubyhacker1/imperator on IRC (Freenode)
|
data/extconf.rb
ADDED
@@ -0,0 +1,30 @@
|
|
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
ADDED
@@ -0,0 +1,136 @@
|
|
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
|
data/lib/version.h
ADDED
data/test/tc_netproto.rb
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
############################################
|
2
|
+
# tc_netproto.rb
|
3
|
+
#
|
4
|
+
# Test suite for net-proto - all platforms.
|
5
|
+
############################################
|
6
|
+
base = File.basename(Dir.pwd)
|
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
|
+
|
30
|
+
require "net/proto"
|
31
|
+
require "test/unit"
|
32
|
+
include Net
|
33
|
+
|
34
|
+
class TC_Net_Proto < Test::Unit::TestCase
|
35
|
+
# These were the protocols listed in my
|
36
|
+
# own /etc/protocols file on Solaris 9.
|
37
|
+
def setup
|
38
|
+
@protocols = %w/
|
39
|
+
ip icmp igmp ggp ipip tcp cbt egp igp pup udp mux hmp
|
40
|
+
xns-idp rdp idpr idpr-cmtp sdrp idrp rsvp gre
|
41
|
+
mobile ospf pim ipcomp vrrp sctp hopopt ipv6
|
42
|
+
ipv6-route ipv6-frag esp ah ipv6-icmp ipv6-nonxt ipv6-opts
|
43
|
+
/
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_version
|
47
|
+
assert_equal("1.0.1", Proto::VERSION)
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_getprotobynumber
|
51
|
+
assert_respond_to(Proto, :getprotobynumber)
|
52
|
+
assert_raises(TypeError){ Proto.getprotobynumber("foo") }
|
53
|
+
assert_raises(TypeError){ Proto.getprotobynumber(nil) }
|
54
|
+
assert_equal(nil, Proto.getprotobynumber(9999999))
|
55
|
+
assert_equal("tcp", Proto.getprotobynumber(6))
|
56
|
+
assert_nothing_raised{
|
57
|
+
0.upto(132){ |n| Proto.getprotobynumber(n) }
|
58
|
+
}
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_getprotobyname
|
62
|
+
assert_respond_to(Proto, :getprotobyname)
|
63
|
+
assert_raises(TypeError){ Proto.getprotobyname(1) }
|
64
|
+
assert_raises(TypeError){ Proto.getprotobyname(nil) }
|
65
|
+
assert_equal(nil, Proto.getprotobyname("foo"))
|
66
|
+
assert_equal(6, Proto.getprotobyname("tcp"))
|
67
|
+
@protocols.each{ |prot|
|
68
|
+
assert_nothing_raised{ Proto.getprotobyname(prot) }
|
69
|
+
}
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_getprotoent
|
73
|
+
if File::ALT_SEPARATOR
|
74
|
+
msg = "The getprotoent() function is not supported on this "
|
75
|
+
msg += "platform - test skipped"
|
76
|
+
STDERR.puts msg
|
77
|
+
else
|
78
|
+
assert_respond_to(Proto, :getprotoent)
|
79
|
+
p = Proto.getprotoent.first
|
80
|
+
assert_kind_of(Struct::ProtoStruct, p)
|
81
|
+
assert_equal(%w/name aliases proto/,p.members)
|
82
|
+
assert_kind_of(String, p.name, "Bad type for name")
|
83
|
+
assert_kind_of(Array, p.aliases, "Bad type for aliases")
|
84
|
+
assert_kind_of(Integer, p.proto, "Bad type for proto")
|
85
|
+
p.aliases.each{ |a|
|
86
|
+
assert_kind_of(String, a, "Bad type for aliases member")
|
87
|
+
}
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def teardown
|
92
|
+
@protocols = nil
|
93
|
+
end
|
94
|
+
end
|
metadata
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
rubygems_version: 0.9.0
|
3
|
+
specification_version: 1
|
4
|
+
name: net-proto
|
5
|
+
version: !ruby/object:Gem::Version
|
6
|
+
version: 1.0.1
|
7
|
+
date: 2006-06-30 00:00:00 -06:00
|
8
|
+
summary: The net-proto package provides the getprotobyname(), getprotobynumber() and the getprotoent() methods for Ruby.
|
9
|
+
require_paths:
|
10
|
+
- lib
|
11
|
+
email: djberg96@gmail.com
|
12
|
+
homepage: http://www.rubyforge.org/projects/sysutils
|
13
|
+
rubyforge_project: sysutils
|
14
|
+
description: The net-proto package provides the getprotobyname(), getprotobynumber() and the getprotoent() methods for Ruby.
|
15
|
+
autorequire:
|
16
|
+
default_executable:
|
17
|
+
bindir: bin
|
18
|
+
has_rdoc: true
|
19
|
+
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 1.8.0
|
24
|
+
version:
|
25
|
+
platform: ruby
|
26
|
+
signing_key:
|
27
|
+
cert_chain:
|
28
|
+
post_install_message:
|
29
|
+
authors:
|
30
|
+
- Daniel J. Berger
|
31
|
+
files:
|
32
|
+
- doc/netproto.txt
|
33
|
+
- test/tc_netproto.rb
|
34
|
+
- CHANGES
|
35
|
+
- MANIFEST
|
36
|
+
- README
|
37
|
+
- extconf.rb
|
38
|
+
- lib/version.h
|
39
|
+
- lib/net/sunos.c
|
40
|
+
test_files:
|
41
|
+
- test/tc_netproto.rb
|
42
|
+
rdoc_options: []
|
43
|
+
|
44
|
+
extra_rdoc_files:
|
45
|
+
- CHANGES
|
46
|
+
- README
|
47
|
+
executables: []
|
48
|
+
|
49
|
+
extensions:
|
50
|
+
- extconf.rb
|
51
|
+
requirements: []
|
52
|
+
|
53
|
+
dependencies: []
|
54
|
+
|