net-proto 1.1.0 → 1.1.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/CHANGES +4 -0
- data/README +0 -4
- data/Rakefile +7 -2
- data/doc/netproto.txt +5 -6
- data/lib/net/proto.rb +8 -6
- data/lib/net/proto/common.rb +1 -1
- data/lib/windows/net/proto.rb +123 -0
- data/net-proto.gemspec +3 -4
- data/test/test_net_proto.rb +3 -12
- metadata +66 -70
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 83b848fce79a24c404a269ecfaf838c8999e000a
|
4
|
+
data.tar.gz: 33fada4059a1ac04b305e0d04b621d777cc4e5e9
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: fd37187da1d51e62cf87fb54dab95ab6a5dc718aa397f25b9fb7e2e7898926d00ef38445bfa71619606ddee887610bbb89fb103b7f39fcc989fddb3ef8e5b270
|
7
|
+
data.tar.gz: d36e65afe0656f492d34ada92d6833aa18da0c36ec3846b26bb1cef8172c64a82dadda712d6c282d86c811013e597bb7745e9cb5a1ecc500ec23f06dab869968
|
data/CHANGES
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
== 1.1.1 - 9-Oct-2014
|
2
|
+
* Implemented getprotoent on Windows using pure Ruby.
|
3
|
+
* Miscellaneous minor updates to the Rakefile, gemspec and docs.
|
4
|
+
|
1
5
|
== 1.1.0 - 18-Jan-2012
|
2
6
|
* Switched to FFI instead of C backend. Now works with JRuby, too.
|
3
7
|
* Added the generic get_protocol instance method that accepts either a
|
data/README
CHANGED
@@ -26,10 +26,6 @@ Net::Proto.getprotoent do |ent|
|
|
26
26
|
p ent
|
27
27
|
end
|
28
28
|
|
29
|
-
== MS Windows
|
30
|
-
The Proto.getprotoent method is not supported on MS Windows because the
|
31
|
-
underlying function isn't supported by the MS Windows API.
|
32
|
-
|
33
29
|
== Why should I use this?
|
34
30
|
Ruby has a predefined set of constants in socket.c in the general form of
|
35
31
|
IPPROTO_XXX, Y. However, using constants in this fashion can be unreliable
|
data/Rakefile
CHANGED
@@ -8,13 +8,18 @@ namespace 'gem' do
|
|
8
8
|
desc 'Create the net-proto gem'
|
9
9
|
task :create => :clean do
|
10
10
|
spec = eval(IO.read('net-proto.gemspec'))
|
11
|
-
Gem::
|
11
|
+
if Gem::VERSION.to_f < 2.0
|
12
|
+
Gem::Builder.new(spec).build
|
13
|
+
else
|
14
|
+
require 'rubygems/package'
|
15
|
+
Gem::Package.build(spec)
|
16
|
+
end
|
12
17
|
end
|
13
18
|
|
14
19
|
desc 'Install the net-proto gem'
|
15
20
|
task :install => [:create] do
|
16
21
|
file = Dir["net-proto*.gem"].last
|
17
|
-
sh "gem install #{file}"
|
22
|
+
sh "gem install -l #{file}"
|
18
23
|
end
|
19
24
|
end
|
20
25
|
|
data/doc/netproto.txt
CHANGED
@@ -39,8 +39,6 @@ Proto.getprotoent{ |struct| ... }
|
|
39
39
|
|
40
40
|
The fields are 'name' (a String), 'aliases' (an Array of String's,
|
41
41
|
though often only one element), and 'proto' (a Fixnum).
|
42
|
-
|
43
|
-
This method is NOT supported on MS Windows.
|
44
42
|
|
45
43
|
== Notes
|
46
44
|
This module uses the reentrant (i.e. thread safe) functions on those
|
@@ -52,11 +50,12 @@ Proto.getprotoent{ |struct| ... }
|
|
52
50
|
separate method calls. Rather, these are called internally by the various
|
53
51
|
methods, except on Windows, which does not support them.
|
54
52
|
|
55
|
-
The 'getprotoent()' method is
|
56
|
-
|
53
|
+
The 'getprotoent()' method on Windows is using Ruby to read directly from
|
54
|
+
your %SystemRoot%\system32\drivers\etc\protocol file. If you do not have
|
55
|
+
read access to that file, the method will fail.
|
57
56
|
|
58
57
|
== Known Bugs
|
59
|
-
None that I'm aware of.
|
58
|
+
None that I'm aware of. Please log any bug reports on the project page
|
60
59
|
at https://github.com/djberg96/net-proto.
|
61
60
|
|
62
61
|
== Future Plans
|
@@ -64,7 +63,7 @@ Proto.getprotoent{ |struct| ... }
|
|
64
63
|
WSAAsyncGetProtoByNumber) on MS Windows systems.
|
65
64
|
|
66
65
|
== Copyright
|
67
|
-
(C) 2003-
|
66
|
+
(C) 2003-2014 Daniel J. Berger
|
68
67
|
All rights reserved.
|
69
68
|
|
70
69
|
== Warranty
|
data/lib/net/proto.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
1
|
require 'rbconfig'
|
2
2
|
|
3
3
|
case RbConfig::CONFIG['host_os']
|
4
|
-
when /linux/i
|
5
|
-
|
6
|
-
when /sunos|solaris/i
|
7
|
-
|
8
|
-
|
9
|
-
|
4
|
+
when /linux/i
|
5
|
+
require 'linux/net/proto'
|
6
|
+
when /sunos|solaris/i
|
7
|
+
require 'sunos/net/proto'
|
8
|
+
when /mingw|cygwin|win32|windows|mswin/i
|
9
|
+
require 'windows/net/proto'
|
10
|
+
else
|
11
|
+
require 'generic/net/proto'
|
10
12
|
end
|
data/lib/net/proto/common.rb
CHANGED
@@ -0,0 +1,123 @@
|
|
1
|
+
require 'net/proto/common'
|
2
|
+
|
3
|
+
# The Net module serves as a namespace only.
|
4
|
+
module Net
|
5
|
+
# The Proto class serves as the base class for the various protocol methods.
|
6
|
+
class Proto
|
7
|
+
extend FFI::Library
|
8
|
+
|
9
|
+
ffi_lib FFI::Library::LIBC
|
10
|
+
ffi_lib 'ws2_32'
|
11
|
+
ffi_convention :stdcall
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
# These should exist on every platform.
|
16
|
+
attach_function :getprotobyname_c, :getprotobyname, [:string], :pointer
|
17
|
+
attach_function :getprotobynumber_c, :getprotobynumber, [:int], :pointer
|
18
|
+
|
19
|
+
private_class_method :getprotobyname_c
|
20
|
+
private_class_method :getprotobynumber_c
|
21
|
+
|
22
|
+
public
|
23
|
+
|
24
|
+
# If given a protocol string, returns the corresponding number. If
|
25
|
+
# given a protocol number, returns the corresponding string.
|
26
|
+
#
|
27
|
+
# Returns nil if not found in either case.
|
28
|
+
#
|
29
|
+
# Examples:
|
30
|
+
#
|
31
|
+
# Net::Proto.get_protocol('tcp') # => 6
|
32
|
+
# Net::Proto.get_protocol(1) # => 'icmp'
|
33
|
+
#
|
34
|
+
def self.get_protocol(arg)
|
35
|
+
if arg.is_a?(String)
|
36
|
+
getprotobyname(arg)
|
37
|
+
else
|
38
|
+
getprotobynumber(arg)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# Given a protocol string, returns the corresponding number, or nil if
|
43
|
+
# not found.
|
44
|
+
#
|
45
|
+
# Examples:
|
46
|
+
#
|
47
|
+
# Net::Proto.getprotobyname('tcp') # => 6
|
48
|
+
# Net::Proto.getprotobyname('bogus') # => nil
|
49
|
+
#
|
50
|
+
def self.getprotobyname(protocol)
|
51
|
+
raise TypeError unless protocol.is_a?(String)
|
52
|
+
|
53
|
+
begin
|
54
|
+
ptr = getprotobyname_c(protocol)
|
55
|
+
struct = ProtocolStruct.new(ptr) unless ptr.null?
|
56
|
+
ensure
|
57
|
+
endprotoent() if respond_to?(:endprotoent, true)
|
58
|
+
end
|
59
|
+
|
60
|
+
ptr.null? ? nil : struct[:p_proto]
|
61
|
+
end
|
62
|
+
|
63
|
+
# Given a protocol number, returns the corresponding string, or nil if
|
64
|
+
# not found.
|
65
|
+
#
|
66
|
+
# Examples:
|
67
|
+
#
|
68
|
+
# Net::Proto.getprotobynumber(6) # => 'tcp'
|
69
|
+
# Net::Proto.getprotobynumber(999) # => nil
|
70
|
+
#
|
71
|
+
def self.getprotobynumber(protocol)
|
72
|
+
raise TypeError unless protocol.is_a?(Integer)
|
73
|
+
|
74
|
+
begin
|
75
|
+
ptr = getprotobynumber_c(protocol)
|
76
|
+
struct = ProtocolStruct.new(ptr) unless ptr.null?
|
77
|
+
ensure
|
78
|
+
endprotoent() if respond_to?(:endprotoent, true)
|
79
|
+
end
|
80
|
+
|
81
|
+
ptr.null? ? nil: struct[:p_name]
|
82
|
+
end
|
83
|
+
|
84
|
+
# In block form, yields each entry from /etc/protocol as a struct of type
|
85
|
+
# Proto::ProtoStruct. In non-block form, returns an array of structs.
|
86
|
+
#
|
87
|
+
# The fields are 'name' (a string), 'aliases' (an array of strings,
|
88
|
+
# though often only one element), and 'proto' (a number).
|
89
|
+
#
|
90
|
+
# Example:
|
91
|
+
#
|
92
|
+
# Net::Proto.getprotoent.each{ |prot|
|
93
|
+
# p prot.name
|
94
|
+
# p prot.aliases
|
95
|
+
# p prot.proto
|
96
|
+
# }
|
97
|
+
#
|
98
|
+
# Note that on Windows this code reads directly out of a %SystemRoot%
|
99
|
+
# subfolder using pure Ruby, so you will need read access or this method
|
100
|
+
# will fail.
|
101
|
+
#
|
102
|
+
def self.getprotoent
|
103
|
+
structs = block_given? ? nil : []
|
104
|
+
file = ENV['SystemRoot'] + '/system32/drivers/etc/protocol'
|
105
|
+
|
106
|
+
IO.foreach(file) do |line|
|
107
|
+
next if line.lstrip[0] == '#' # Skip comments
|
108
|
+
next if line.lstrip.size == 0 # Skip blank lines
|
109
|
+
line = line.split
|
110
|
+
|
111
|
+
ruby_struct = ProtoStruct.new(line[0], line[2].split(','), line[1].to_i).freeze
|
112
|
+
|
113
|
+
if block_given?
|
114
|
+
yield ruby_struct
|
115
|
+
else
|
116
|
+
structs << ruby_struct
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
structs
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
data/net-proto.gemspec
CHANGED
@@ -2,21 +2,20 @@ require 'rubygems'
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |gem|
|
4
4
|
gem.name = 'net-proto'
|
5
|
-
gem.version = '1.1.
|
5
|
+
gem.version = '1.1.1'
|
6
6
|
gem.author = 'Daniel J. Berger'
|
7
7
|
gem.license = 'Artistic 2.0'
|
8
8
|
gem.email = 'djberg96@gmail.com'
|
9
|
-
gem.homepage = '
|
10
|
-
gem.platform = Gem::Platform::RUBY
|
9
|
+
gem.homepage = 'https://github.com/djberg96/net-proto'
|
11
10
|
gem.summary = 'A Ruby interface for determining protocol information'
|
12
11
|
gem.test_file = 'test/test_net_proto.rb'
|
13
12
|
gem.files = Dir['**/*'].reject{ |f| f.include?('git') }
|
14
13
|
|
15
|
-
gem.rubyforge_project = 'sysutils'
|
16
14
|
gem.extra_rdoc_files = ['CHANGES', 'README', 'MANIFEST', 'doc/netproto.txt']
|
17
15
|
|
18
16
|
gem.add_dependency('ffi', '>= 1.0.0')
|
19
17
|
gem.add_development_dependency('test-unit', '>= 2.2.0')
|
18
|
+
gem.add_development_dependency('rake')
|
20
19
|
|
21
20
|
gem.description = <<-EOF
|
22
21
|
The net-proto library provides an interface for get protocol information
|
data/test/test_net_proto.rb
CHANGED
@@ -4,10 +4,8 @@
|
|
4
4
|
# Test suite for net-proto - all platforms. This test suite should be run
|
5
5
|
# via the 'rake test' task.
|
6
6
|
###########################################################################
|
7
|
-
require 'rubygems'
|
8
|
-
gem 'test-unit'
|
9
7
|
require 'net/proto'
|
10
|
-
require 'test
|
8
|
+
require 'test-unit'
|
11
9
|
|
12
10
|
class TC_Net_Proto < Test::Unit::TestCase
|
13
11
|
|
@@ -19,8 +17,6 @@ class TC_Net_Proto < Test::Unit::TestCase
|
|
19
17
|
mobile ospf pim ipcomp vrrp sctp hopopt ipv6
|
20
18
|
ipv6-route ipv6-frag esp ah ipv6-icmp ipv6-nonxt ipv6-opts
|
21
19
|
/
|
22
|
-
|
23
|
-
@@windows = File::ALT_SEPARATOR
|
24
20
|
end
|
25
21
|
|
26
22
|
def setup
|
@@ -28,7 +24,7 @@ class TC_Net_Proto < Test::Unit::TestCase
|
|
28
24
|
end
|
29
25
|
|
30
26
|
test "version number is set to expected value" do
|
31
|
-
assert_equal('1.1.
|
27
|
+
assert_equal('1.1.1', Net::Proto::VERSION)
|
32
28
|
end
|
33
29
|
|
34
30
|
test "get_protocol method basic functionality" do
|
@@ -91,35 +87,30 @@ class TC_Net_Proto < Test::Unit::TestCase
|
|
91
87
|
end
|
92
88
|
|
93
89
|
test "getprotoent basic functionality" do
|
94
|
-
omit_if(@@windows, 'getprotoent tests skipped on MS Windows')
|
95
90
|
assert_respond_to(Net::Proto, :getprotoent)
|
96
91
|
assert_nothing_raised{ Net::Proto.getprotoent }
|
97
92
|
assert_kind_of(Array, Net::Proto.getprotoent)
|
98
93
|
end
|
99
94
|
|
100
95
|
test "getprotoent method returns the expected results" do
|
101
|
-
omit_if(@@windows, 'getprotoent tests skipped on MS Windows')
|
102
96
|
assert_kind_of(Struct::ProtoStruct, Net::Proto.getprotoent.first)
|
103
97
|
assert_nil(Net::Proto.getprotoent{})
|
104
98
|
end
|
105
99
|
|
106
100
|
test "struct returned by getprotoent method contains the expected data" do
|
107
|
-
omit_if(@@windows, 'getprotoent tests skipped on MS Windows')
|
108
101
|
@protoent = Net::Proto.getprotoent.first
|
109
|
-
assert_equal([
|
102
|
+
assert_equal([:name, :aliases, :proto], @protoent.members)
|
110
103
|
assert_kind_of(String, @protoent.name)
|
111
104
|
assert_kind_of(Array, @protoent.aliases)
|
112
105
|
assert_kind_of(Integer, @protoent.proto)
|
113
106
|
end
|
114
107
|
|
115
108
|
test "all members of the aliases struct member are strings" do
|
116
|
-
omit_if(@@windows, 'getprotoent tests on MS Windows')
|
117
109
|
@protoent = Net::Proto.getprotoent.first
|
118
110
|
assert_true(@protoent.aliases.all?{ |e| e.is_a?(String) })
|
119
111
|
end
|
120
112
|
|
121
113
|
test "struct returned by getprotoent method is frozen" do
|
122
|
-
omit_if(@@windows, 'getprotoent tests skipped on MS Windows')
|
123
114
|
@protoent = Net::Proto.getprotoent.first
|
124
115
|
assert_true(@protoent.frozen?)
|
125
116
|
end
|
metadata
CHANGED
@@ -1,111 +1,107 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: net-proto
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 1
|
8
|
-
- 1
|
9
|
-
- 0
|
10
|
-
version: 1.1.0
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.1.1
|
11
5
|
platform: ruby
|
12
|
-
authors:
|
6
|
+
authors:
|
13
7
|
- Daniel J. Berger
|
14
8
|
autorequire:
|
15
9
|
bindir: bin
|
16
10
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
11
|
+
date: 2014-10-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
21
14
|
name: ffi
|
22
|
-
|
23
|
-
|
24
|
-
none: false
|
25
|
-
requirements:
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
26
17
|
- - ">="
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
hash: 23
|
29
|
-
segments:
|
30
|
-
- 1
|
31
|
-
- 0
|
32
|
-
- 0
|
18
|
+
- !ruby/object:Gem::Version
|
33
19
|
version: 1.0.0
|
34
20
|
type: :runtime
|
35
|
-
|
36
|
-
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.0.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
37
28
|
name: test-unit
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 2.2.0
|
34
|
+
type: :development
|
38
35
|
prerelease: false
|
39
|
-
|
40
|
-
|
41
|
-
requirements:
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
42
38
|
- - ">="
|
43
|
-
- !ruby/object:Gem::Version
|
44
|
-
hash: 7
|
45
|
-
segments:
|
46
|
-
- 2
|
47
|
-
- 2
|
48
|
-
- 0
|
39
|
+
- !ruby/object:Gem::Version
|
49
40
|
version: 2.2.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
50
48
|
type: :development
|
51
|
-
|
52
|
-
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
description: |2
|
56
|
+
The net-proto library provides an interface for get protocol information
|
57
|
+
by name or by number. It can also iterate over the list of protocol
|
58
|
+
entries defined on your system.
|
53
59
|
email: djberg96@gmail.com
|
54
60
|
executables: []
|
55
|
-
|
56
61
|
extensions: []
|
57
|
-
|
58
|
-
extra_rdoc_files:
|
62
|
+
extra_rdoc_files:
|
59
63
|
- CHANGES
|
60
64
|
- README
|
61
65
|
- MANIFEST
|
62
66
|
- doc/netproto.txt
|
63
|
-
files:
|
67
|
+
files:
|
64
68
|
- CHANGES
|
69
|
+
- MANIFEST
|
70
|
+
- README
|
71
|
+
- Rakefile
|
65
72
|
- doc/netproto.txt
|
66
73
|
- examples/example_net_proto.rb
|
67
74
|
- lib/generic/net/proto.rb
|
68
75
|
- lib/linux/net/proto.rb
|
69
|
-
- lib/net/proto/common.rb
|
70
76
|
- lib/net/proto.rb
|
77
|
+
- lib/net/proto/common.rb
|
71
78
|
- lib/sunos/net/proto.rb
|
72
|
-
-
|
79
|
+
- lib/windows/net/proto.rb
|
73
80
|
- net-proto.gemspec
|
74
|
-
- Rakefile
|
75
|
-
- README
|
76
81
|
- test/test_net_proto.rb
|
77
|
-
homepage:
|
78
|
-
licenses:
|
82
|
+
homepage: https://github.com/djberg96/net-proto
|
83
|
+
licenses:
|
79
84
|
- Artistic 2.0
|
85
|
+
metadata: {}
|
80
86
|
post_install_message:
|
81
87
|
rdoc_options: []
|
82
|
-
|
83
|
-
require_paths:
|
88
|
+
require_paths:
|
84
89
|
- lib
|
85
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
86
|
-
|
87
|
-
requirements:
|
90
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
88
92
|
- - ">="
|
89
|
-
- !ruby/object:Gem::Version
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
version: "0"
|
94
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
95
|
-
none: false
|
96
|
-
requirements:
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
95
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
97
|
- - ">="
|
98
|
-
- !ruby/object:Gem::Version
|
99
|
-
|
100
|
-
segments:
|
101
|
-
- 0
|
102
|
-
version: "0"
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '0'
|
103
100
|
requirements: []
|
104
|
-
|
105
|
-
|
106
|
-
rubygems_version: 1.8.10
|
101
|
+
rubyforge_project:
|
102
|
+
rubygems_version: 2.4.1
|
107
103
|
signing_key:
|
108
|
-
specification_version:
|
104
|
+
specification_version: 4
|
109
105
|
summary: A Ruby interface for determining protocol information
|
110
|
-
test_files:
|
106
|
+
test_files:
|
111
107
|
- test/test_net_proto.rb
|