dakrone-pcap-ffi 0.0.0 → 0.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/Manifest.txt +0 -14
- data/Rakefile +9 -4
- data/VERSION +1 -1
- data/lib/pcap/dumper.rb +4 -17
- data/lib/pcap/ffi.rb +10 -10
- data/lib/pcap/handler.rb +13 -107
- data/lib/pcap/if.rb +0 -8
- data/lib/pcap/packet_header.rb +0 -12
- data/lib/pcap/packets/ethernet.rb +0 -3
- data/lib/pcap/packets/ip.rb +0 -3
- data/lib/pcap/packets/tcp.rb +0 -3
- data/lib/pcap/pcap.rb +7 -59
- data/lib/pcap/stat.rb +0 -12
- data/lib/pcap/time_val.rb +0 -8
- data/lib/pcap/typedefs.rb +1 -1
- data/pcap-ffi.gemspec +7 -32
- metadata +9 -29
- data/examples/print_bytes.rb +0 -17
- data/lib/pcap/error_buffer.rb +0 -26
- data/lib/pcap/exceptions.rb +0 -1
- data/lib/pcap/exceptions/read_error.rb +0 -6
- data/spec/data_link_spec.rb +0 -29
- data/spec/dumps/simple_tcp.pcap +0 -0
- data/spec/error_buffer.rb +0 -18
- data/spec/handler_examples.rb +0 -71
- data/spec/handler_spec.rb +0 -80
- data/spec/helpers/dumps.rb +0 -3
- data/spec/pcap_spec.rb +0 -51
- data/spec/spec_helper.rb +0 -8
- data/tasks/spec.rb +0 -9
data/Manifest.txt
CHANGED
@@ -2,10 +2,7 @@ History.txt
|
|
2
2
|
Manifest.txt
|
3
3
|
Rakefile
|
4
4
|
README.txt
|
5
|
-
examples/print_bytes.rb
|
6
5
|
lib/pcap.rb
|
7
|
-
lib/pcap/exceptions.rb
|
8
|
-
lib/pcap/exceptions/read_error.rb
|
9
6
|
lib/pcap/typedefs.rb
|
10
7
|
lib/pcap/time_val.rb
|
11
8
|
lib/pcap/in_addr.rb
|
@@ -15,7 +12,6 @@ lib/pcap/if.rb
|
|
15
12
|
lib/pcap/addr.rb
|
16
13
|
lib/pcap/file_header.rb
|
17
14
|
lib/pcap/packet_header.rb
|
18
|
-
lib/pcap/packet.rb
|
19
15
|
lib/pcap/packets.rb
|
20
16
|
lib/pcap/packets/typedefs.rb
|
21
17
|
lib/pcap/packets/ethernet.rb
|
@@ -23,18 +19,8 @@ lib/pcap/packets/ip.rb
|
|
23
19
|
lib/pcap/packets/tcp.rb
|
24
20
|
lib/pcap/stat.rb
|
25
21
|
lib/pcap/data_link.rb
|
26
|
-
lib/pcap/error_buffer.rb
|
27
22
|
lib/pcap/handler.rb
|
28
23
|
lib/pcap/dumper.rb
|
29
24
|
lib/pcap/version.rb
|
30
25
|
lib/pcap/ffi.rb
|
31
26
|
lib/pcap/pcap.rb
|
32
|
-
tasks/spec.rb
|
33
|
-
spec/spec_helper.rb
|
34
|
-
spec/helpers/dumps.rb
|
35
|
-
spec/dumps/simple_tcp.pcap
|
36
|
-
spec/error_buffer.rb
|
37
|
-
spec/data_link_spec.rb
|
38
|
-
spec/handler_examples.rb
|
39
|
-
spec/handler_spec.rb
|
40
|
-
spec/pcap_spec.rb
|
data/Rakefile
CHANGED
@@ -2,17 +2,22 @@
|
|
2
2
|
|
3
3
|
require 'rubygems'
|
4
4
|
require './lib/pcap/version.rb'
|
5
|
-
|
5
|
+
|
6
|
+
#Hoe.new('pcap-ffi', FFI::PCap::VERSION) do |p|
|
7
|
+
#p.rubyforge_name = 'pcap-ffi'
|
8
|
+
#p.developer('Postmodern','postmodern.mod3@gmail.com')
|
9
|
+
#p.remote_rdoc_dir = ''
|
10
|
+
#p.extra_deps = [['ffi', '>=0.4.0']]
|
11
|
+
#end
|
6
12
|
|
7
13
|
# Generate a gem using jeweler
|
8
14
|
begin
|
9
15
|
require 'jeweler'
|
10
16
|
Jeweler::Tasks.new do |gemspec|
|
11
|
-
gemspec.rubyforge_project = 'pcap-ffi'
|
12
17
|
gemspec.name = "pcap-ffi"
|
13
18
|
gemspec.summary = "FFI bindings for libpcap"
|
14
|
-
gemspec.email = "
|
15
|
-
gemspec.homepage = "http://github.com/
|
19
|
+
gemspec.email = "lee@writequit.org"
|
20
|
+
gemspec.homepage = "http://github.com/dakrone/pcap-ffi"
|
16
21
|
gemspec.description = "Bindings to sniff packets using the FFI interface in Ruby."
|
17
22
|
gemspec.authors = ["Postmodern, Dakrone"]
|
18
23
|
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.1
|
data/lib/pcap/dumper.rb
CHANGED
@@ -6,32 +6,19 @@ module FFI
|
|
6
6
|
module PCap
|
7
7
|
class Dumper < FFI::MemoryPointer
|
8
8
|
|
9
|
-
def
|
10
|
-
@dumper = dumper
|
11
|
-
end
|
12
|
-
|
13
|
-
def write(header,bytes)
|
14
|
-
PCap.pcap_dump(@dumper,header,bytes)
|
9
|
+
def self.open(path)
|
15
10
|
end
|
16
11
|
|
17
12
|
def tell
|
18
|
-
PCap.pcap_dump_ftell(
|
13
|
+
PCap.pcap_dump_ftell(self)
|
19
14
|
end
|
20
15
|
|
21
16
|
def flush
|
22
|
-
PCap.pcap_dump_flush(
|
17
|
+
PCap.pcap_dump_flush(self)
|
23
18
|
end
|
24
19
|
|
25
20
|
def close
|
26
|
-
PCap.pcap_dump_close(
|
27
|
-
end
|
28
|
-
|
29
|
-
def to_ptr
|
30
|
-
@dumper
|
31
|
-
end
|
32
|
-
|
33
|
-
def inspect
|
34
|
-
"#<#{self.class}: 0x#{@dumper.address.to_s(16)}>"
|
21
|
+
PCap.pcap_dump_close(self)
|
35
22
|
end
|
36
23
|
|
37
24
|
end
|
data/lib/pcap/ffi.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'pcap/typedefs'
|
2
|
-
|
3
1
|
require 'ffi'
|
4
2
|
|
5
3
|
module FFI
|
@@ -8,6 +6,8 @@ module FFI
|
|
8
6
|
|
9
7
|
ffi_lib 'libpcap'
|
10
8
|
|
9
|
+
ERRBUF_SIZE = 256
|
10
|
+
|
11
11
|
enum :pcap_direction, [
|
12
12
|
:pcap_d_inout,
|
13
13
|
:pcap_d_in,
|
@@ -16,11 +16,11 @@ module FFI
|
|
16
16
|
|
17
17
|
callback :pcap_handler, [:pointer, :pointer, :pointer], :void
|
18
18
|
|
19
|
-
attach_function :pcap_lookupdev, [:
|
20
|
-
attach_function :pcap_lookupnet, [:string, :pointer, :pointer, :
|
21
|
-
attach_function :pcap_open_live, [:string, :int, :int, :int, :
|
19
|
+
attach_function :pcap_lookupdev, [:string], :string
|
20
|
+
attach_function :pcap_lookupnet, [:string, :pointer, :pointer, :string], :int
|
21
|
+
attach_function :pcap_open_live, [:string, :int, :int, :int, :string], :pointer
|
22
22
|
attach_function :pcap_open_dead, [:int, :int], :pointer
|
23
|
-
attach_function :pcap_open_offline, [:string, :
|
23
|
+
attach_function :pcap_open_offline, [:string, :string], :pointer
|
24
24
|
attach_function :pcap_fopen_offline, [:pointer, :string], :pointer
|
25
25
|
attach_function :pcap_close, [:pointer], :void
|
26
26
|
attach_function :pcap_loop, [:pointer, :int, :pcap_handler, :pointer], :int
|
@@ -30,9 +30,9 @@ module FFI
|
|
30
30
|
attach_function :pcap_breakloop, [:pointer], :void
|
31
31
|
attach_function :pcap_stats, [:pointer, :pointer], :int
|
32
32
|
attach_function :pcap_setfilter, [:pointer, :pointer], :int
|
33
|
-
attach_function :pcap_setdirection, [:pointer, :
|
34
|
-
attach_function :pcap_getnonblock, [:pointer, :
|
35
|
-
attach_function :pcap_setnonblock, [:pointer, :int, :
|
33
|
+
attach_function :pcap_setdirection, [:pointer, :pcap_direction_t], :int
|
34
|
+
attach_function :pcap_getnonblock, [:pointer, :string], :int
|
35
|
+
attach_function :pcap_setnonblock, [:pointer, :int, :string], :int
|
36
36
|
attach_function :pcap_perror, [:pointer, :string], :void
|
37
37
|
attach_function :pcap_inject, [:pointer, :pointer, :int], :int
|
38
38
|
attach_function :pcap_sendpacket, [:pointer, :pointer, :int], :int
|
@@ -63,7 +63,7 @@ module FFI
|
|
63
63
|
attach_function :pcap_dump_close, [:pointer], :void
|
64
64
|
attach_function :pcap_dump, [:pointer, :pointer, :pointer], :void
|
65
65
|
|
66
|
-
attach_function :pcap_findalldevs, [:pointer, :
|
66
|
+
attach_function :pcap_findalldevs, [:pointer, :string], :int
|
67
67
|
attach_function :pcap_freealldevs, [:pointer], :void
|
68
68
|
|
69
69
|
attach_function :pcap_lib_version, [], :string
|
data/lib/pcap/handler.rb
CHANGED
@@ -1,9 +1,5 @@
|
|
1
|
-
require 'pcap/exceptions/read_error'
|
2
1
|
require 'pcap/ffi'
|
3
|
-
require 'pcap/error_buffer'
|
4
2
|
require 'pcap/data_link'
|
5
|
-
require 'pcap/packet_header'
|
6
|
-
require 'pcap/stat'
|
7
3
|
|
8
4
|
require 'ffi'
|
9
5
|
|
@@ -22,26 +18,8 @@ module FFI
|
|
22
18
|
# Number of packets to sniff
|
23
19
|
attr_accessor :count
|
24
20
|
|
25
|
-
def initialize(pcap
|
21
|
+
def initialize(pcap)
|
26
22
|
@pcap = pcap
|
27
|
-
@closed = false
|
28
|
-
|
29
|
-
# Default is to infinitely loop over packets.
|
30
|
-
@count = (options[:count] || -1)
|
31
|
-
|
32
|
-
if options[:direction]
|
33
|
-
self.direction = options[:direction]
|
34
|
-
end
|
35
|
-
|
36
|
-
@callback_wrapper = Proc.new do |user,header,bytes|
|
37
|
-
if @callback
|
38
|
-
@callback.call(user,PacketHeader.new(header),bytes)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
callback(&block)
|
43
|
-
|
44
|
-
trap('SIGINT') { self.close }
|
45
23
|
end
|
46
24
|
|
47
25
|
def datalink
|
@@ -49,120 +27,48 @@ module FFI
|
|
49
27
|
end
|
50
28
|
|
51
29
|
def callback(&block)
|
52
|
-
|
53
|
-
|
54
|
-
end
|
55
|
-
|
56
|
-
def direction=(dir)
|
57
|
-
directions = PCap.enum_type(:pcap_direction)
|
58
|
-
|
59
|
-
return PCap.pcap_setdirection(@pcap,directions[:"pcap_d_#{dir}"])
|
60
|
-
end
|
61
|
-
|
62
|
-
def non_blocking=(mode)
|
63
|
-
errbuf = ErrorBuffer.new
|
64
|
-
mode = if mode
|
65
|
-
1
|
66
|
-
else
|
67
|
-
0
|
68
|
-
end
|
69
|
-
|
70
|
-
if PCap.pcap_setnonblock(@pcap,mode,errbuf) == -1
|
71
|
-
raise(RuntimeError,errbuf.to_s,caller)
|
30
|
+
if block
|
31
|
+
@callback = block
|
72
32
|
end
|
73
33
|
|
74
|
-
return
|
34
|
+
return @callback
|
75
35
|
end
|
76
36
|
|
77
|
-
def
|
78
|
-
|
79
|
-
mode = PCap.pcap_getnonblock(@pcap,errbuf)
|
80
|
-
|
81
|
-
if mode == -1
|
82
|
-
raise(RuntimeError,errbuf.to_s,caller)
|
83
|
-
end
|
84
|
-
|
85
|
-
return mode == 1
|
37
|
+
def direction=(dir)
|
38
|
+
PCap.pcap_setdirection(@pcap,dir)
|
86
39
|
end
|
87
40
|
|
88
|
-
def loop(data
|
41
|
+
def loop(data,&block)
|
89
42
|
callback(&block) if block
|
90
43
|
|
91
|
-
PCap.pcap_loop(@pcap,@count,@
|
44
|
+
PCap.pcap_loop(@pcap,@count,@callback,data)
|
92
45
|
end
|
93
46
|
|
94
|
-
alias each loop
|
47
|
+
alias :each :loop
|
95
48
|
|
96
|
-
def dispatch(data
|
49
|
+
def dispatch(data,&block)
|
97
50
|
callback(&block) if block
|
98
51
|
|
99
|
-
|
52
|
+
PCap.pcap_dispatch(@pcap,@count,@callback,data)
|
100
53
|
end
|
101
54
|
|
102
55
|
def next
|
103
56
|
header = PacketHeader.new
|
104
57
|
data = PCap.pcap_next(@pcap,header)
|
105
58
|
|
106
|
-
return [nil, nil] if data.null?
|
107
59
|
return [header, data]
|
108
60
|
end
|
109
61
|
|
110
|
-
def next_extra
|
111
|
-
header_ptr = MemoryPointer.new(:pointer)
|
112
|
-
data_ptr = MemoryPointer.new(:pointer)
|
113
|
-
|
114
|
-
case PCap.pcap_next_ex(@pcap,header_ptr,data_ptr)
|
115
|
-
when -1
|
116
|
-
raise(ReadError,"an error occurred while reading the packet",caller)
|
117
|
-
when -2
|
118
|
-
raise(ReadError,"the 'savefile' contains no more packets",caller)
|
119
|
-
end
|
120
|
-
|
121
|
-
return [header_ptr.get_pointer(0), data_ptr.get_pointer(0)]
|
122
|
-
end
|
123
|
-
|
124
|
-
def open_dump(path)
|
125
|
-
dump_ptr = PCap.pcap_dump_open(@pcap,File.expand_path(path))
|
126
|
-
|
127
|
-
if dump_ptr.null?
|
128
|
-
raise(RuntimeError,error,caller)
|
129
|
-
end
|
130
|
-
|
131
|
-
return Dumper.new(dump_ptr)
|
132
|
-
end
|
133
|
-
|
134
|
-
def stats
|
135
|
-
stats = Stat.new
|
136
|
-
|
137
|
-
PCap.pcap_stats(@pcap,stats)
|
138
|
-
return stats
|
139
|
-
end
|
140
|
-
|
141
|
-
def error
|
142
|
-
PCap.pcap_geterr(@pcap)
|
143
|
-
end
|
144
|
-
|
145
62
|
def stop
|
146
63
|
PCap.pcap_breakloop(@pcap)
|
147
64
|
end
|
148
65
|
|
149
|
-
def closed?
|
150
|
-
@closed == true
|
151
|
-
end
|
152
|
-
|
153
66
|
def close
|
154
|
-
|
155
|
-
@closed = true
|
156
|
-
PCap.pcap_close(@pcap)
|
157
|
-
end
|
158
|
-
end
|
159
|
-
|
160
|
-
def to_ptr
|
161
|
-
@pcap
|
67
|
+
PCap.pcap_close(@pcap)
|
162
68
|
end
|
163
69
|
|
164
70
|
def inspect
|
165
|
-
"#<#{self.class}: 0x#{@pcap.
|
71
|
+
"#<#{self.class}: 0x#{@pcap.to_s(16)}>"
|
166
72
|
end
|
167
73
|
|
168
74
|
end
|
data/lib/pcap/if.rb
CHANGED
data/lib/pcap/packet_header.rb
CHANGED
data/lib/pcap/packets/ip.rb
CHANGED
data/lib/pcap/packets/tcp.rb
CHANGED
data/lib/pcap/pcap.rb
CHANGED
@@ -1,85 +1,33 @@
|
|
1
1
|
require 'pcap/ffi'
|
2
2
|
require 'pcap/data_link'
|
3
|
-
require 'pcap/if'
|
4
3
|
require 'pcap/handler'
|
5
|
-
require 'pcap/error_buffer'
|
6
4
|
|
7
5
|
module FFI
|
8
6
|
module PCap
|
9
|
-
def PCap.
|
10
|
-
PCap.pcap_lib_version
|
11
|
-
end
|
12
|
-
|
13
|
-
def PCap.device
|
14
|
-
errbuf = ErrorBuffer.new
|
15
|
-
|
16
|
-
unless (name = PCap.pcap_lookupdev(errbuf))
|
17
|
-
raise(StandardError,errbuf.to_s,caller)
|
18
|
-
end
|
19
|
-
|
20
|
-
return name
|
21
|
-
end
|
22
|
-
|
23
|
-
def PCap.each_device(&block)
|
24
|
-
devices = MemoryPointer.new(:pointer)
|
25
|
-
errbuf = ErrorBuffer.new
|
26
|
-
|
27
|
-
PCap.pcap_findalldevs(devices,errbuf)
|
28
|
-
node = devices.get_pointer(0)
|
29
|
-
|
30
|
-
if node.null?
|
31
|
-
raise(StandardError,errbuf.to_s,caller)
|
32
|
-
end
|
33
|
-
|
34
|
-
device = IF.new(node)
|
35
|
-
|
36
|
-
until device
|
37
|
-
block.call(device) if block
|
38
|
-
device = device.next
|
39
|
-
end
|
40
|
-
|
41
|
-
PCap.pcap_freealldevs(node)
|
42
|
-
return nil
|
43
|
-
end
|
44
|
-
|
45
|
-
def PCap.open_live(options={},&block)
|
7
|
+
def PCap.open_live(options={})
|
46
8
|
device = options[:device]
|
47
9
|
promisc = if options[:promisc]
|
48
10
|
1
|
49
11
|
else
|
50
12
|
0
|
51
13
|
end
|
52
|
-
snaplen = (options[:snaplen] ||
|
14
|
+
snaplen = (options[:snaplen] || SNAPLEN)
|
53
15
|
to_ms = (options[:timeout] || 0)
|
54
|
-
errbuf = ErrorBuffer.new
|
55
16
|
|
56
17
|
ptr = PCap.pcap_open_live(device,snaplen,promisc,to_ms,nil)
|
57
18
|
|
58
|
-
|
59
|
-
raise(StandardError,errbuf
|
19
|
+
unless ptr
|
20
|
+
raise(StandardError,errbuf,caller)
|
60
21
|
end
|
61
22
|
|
62
|
-
return Handler.new(ptr
|
23
|
+
return Handler.new(ptr)
|
63
24
|
end
|
64
25
|
|
65
|
-
def
|
26
|
+
def self.open_dead(datalink,snaplen=SNAPLEN)
|
66
27
|
datalink = DataLink[datalink]
|
67
|
-
snaplen = (options[:snaplen] || Handler::SNAPLEN)
|
68
28
|
|
69
|
-
return Handler.new(PCap.pcap_open_dead(datalink,snaplen)
|
29
|
+
return Handler.new(PCap.pcap_open_dead(datalink,snaplen))
|
70
30
|
end
|
71
31
|
|
72
|
-
def PCap.open_offline(path,options={})
|
73
|
-
path = File.expand_path(path)
|
74
|
-
errbuf = ErrorBuffer.new
|
75
|
-
|
76
|
-
ptr = PCap.pcap_open_offline(path,errbuf)
|
77
|
-
|
78
|
-
if ptr.null?
|
79
|
-
raise(StandardError,errbuf.to_s,caller)
|
80
|
-
end
|
81
|
-
|
82
|
-
return Handler.new(ptr,options)
|
83
|
-
end
|
84
32
|
end
|
85
33
|
end
|
data/lib/pcap/stat.rb
CHANGED
data/lib/pcap/time_val.rb
CHANGED
data/lib/pcap/typedefs.rb
CHANGED
data/pcap-ffi.gemspec
CHANGED
@@ -2,13 +2,13 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{pcap-ffi}
|
5
|
-
s.version = "0.0.
|
5
|
+
s.version = "0.0.1"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Postmodern, Dakrone"]
|
9
|
-
s.date = %q{2009-05-
|
9
|
+
s.date = %q{2009-05-24}
|
10
10
|
s.description = %q{Bindings to sniff packets using the FFI interface in Ruby.}
|
11
|
-
s.email = %q{
|
11
|
+
s.email = %q{lee@writequit.org}
|
12
12
|
s.extra_rdoc_files = [
|
13
13
|
"README.txt"
|
14
14
|
]
|
@@ -19,14 +19,10 @@ Gem::Specification.new do |s|
|
|
19
19
|
"README.txt",
|
20
20
|
"Rakefile",
|
21
21
|
"VERSION",
|
22
|
-
"examples/print_bytes.rb",
|
23
22
|
"lib/pcap.rb",
|
24
23
|
"lib/pcap/addr.rb",
|
25
24
|
"lib/pcap/data_link.rb",
|
26
25
|
"lib/pcap/dumper.rb",
|
27
|
-
"lib/pcap/error_buffer.rb",
|
28
|
-
"lib/pcap/exceptions.rb",
|
29
|
-
"lib/pcap/exceptions/read_error.rb",
|
30
26
|
"lib/pcap/ffi.rb",
|
31
27
|
"lib/pcap/file_header.rb",
|
32
28
|
"lib/pcap/handler.rb",
|
@@ -45,38 +41,17 @@ Gem::Specification.new do |s|
|
|
45
41
|
"lib/pcap/time_val.rb",
|
46
42
|
"lib/pcap/typedefs.rb",
|
47
43
|
"lib/pcap/version.rb",
|
48
|
-
"pcap-ffi.gemspec"
|
49
|
-
"spec/data_link_spec.rb",
|
50
|
-
"spec/dumps/simple_tcp.pcap",
|
51
|
-
"spec/error_buffer.rb",
|
52
|
-
"spec/handler_examples.rb",
|
53
|
-
"spec/handler_spec.rb",
|
54
|
-
"spec/helpers/dumps.rb",
|
55
|
-
"spec/pcap_spec.rb",
|
56
|
-
"spec/spec_helper.rb",
|
57
|
-
"tasks/spec.rb"
|
44
|
+
"pcap-ffi.gemspec"
|
58
45
|
]
|
59
|
-
s.
|
60
|
-
s.homepage = %q{http://github.com/postmodern/pcap-ffi}
|
46
|
+
s.homepage = %q{http://github.com/dakrone/pcap-ffi}
|
61
47
|
s.rdoc_options = ["--charset=UTF-8"]
|
62
48
|
s.require_paths = ["lib"]
|
63
|
-
s.
|
64
|
-
s.rubygems_version = %q{1.3.1}
|
49
|
+
s.rubygems_version = %q{1.3.3}
|
65
50
|
s.summary = %q{FFI bindings for libpcap}
|
66
|
-
s.test_files = [
|
67
|
-
"spec/pcap_spec.rb",
|
68
|
-
"spec/data_link_spec.rb",
|
69
|
-
"spec/error_buffer.rb",
|
70
|
-
"spec/spec_helper.rb",
|
71
|
-
"spec/handler_spec.rb",
|
72
|
-
"spec/handler_examples.rb",
|
73
|
-
"spec/helpers/dumps.rb",
|
74
|
-
"examples/print_bytes.rb"
|
75
|
-
]
|
76
51
|
|
77
52
|
if s.respond_to? :specification_version then
|
78
53
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
79
|
-
s.specification_version =
|
54
|
+
s.specification_version = 3
|
80
55
|
|
81
56
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
82
57
|
else
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dakrone-pcap-ffi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Postmodern, Dakrone
|
@@ -9,12 +9,12 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-05-
|
12
|
+
date: 2009-05-24 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
16
16
|
description: Bindings to sniff packets using the FFI interface in Ruby.
|
17
|
-
email:
|
17
|
+
email: lee@writequit.org
|
18
18
|
executables: []
|
19
19
|
|
20
20
|
extensions: []
|
@@ -28,14 +28,10 @@ files:
|
|
28
28
|
- README.txt
|
29
29
|
- Rakefile
|
30
30
|
- VERSION
|
31
|
-
- examples/print_bytes.rb
|
32
31
|
- lib/pcap.rb
|
33
32
|
- lib/pcap/addr.rb
|
34
33
|
- lib/pcap/data_link.rb
|
35
34
|
- lib/pcap/dumper.rb
|
36
|
-
- lib/pcap/error_buffer.rb
|
37
|
-
- lib/pcap/exceptions.rb
|
38
|
-
- lib/pcap/exceptions/read_error.rb
|
39
35
|
- lib/pcap/ffi.rb
|
40
36
|
- lib/pcap/file_header.rb
|
41
37
|
- lib/pcap/handler.rb
|
@@ -55,17 +51,8 @@ files:
|
|
55
51
|
- lib/pcap/typedefs.rb
|
56
52
|
- lib/pcap/version.rb
|
57
53
|
- pcap-ffi.gemspec
|
58
|
-
|
59
|
-
|
60
|
-
- spec/error_buffer.rb
|
61
|
-
- spec/handler_examples.rb
|
62
|
-
- spec/handler_spec.rb
|
63
|
-
- spec/helpers/dumps.rb
|
64
|
-
- spec/pcap_spec.rb
|
65
|
-
- spec/spec_helper.rb
|
66
|
-
- tasks/spec.rb
|
67
|
-
has_rdoc: true
|
68
|
-
homepage: http://github.com/postmodern/pcap-ffi
|
54
|
+
has_rdoc: false
|
55
|
+
homepage: http://github.com/dakrone/pcap-ffi
|
69
56
|
post_install_message:
|
70
57
|
rdoc_options:
|
71
58
|
- --charset=UTF-8
|
@@ -85,17 +72,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
85
72
|
version:
|
86
73
|
requirements: []
|
87
74
|
|
88
|
-
rubyforge_project:
|
75
|
+
rubyforge_project:
|
89
76
|
rubygems_version: 1.2.0
|
90
77
|
signing_key:
|
91
|
-
specification_version:
|
78
|
+
specification_version: 3
|
92
79
|
summary: FFI bindings for libpcap
|
93
|
-
test_files:
|
94
|
-
|
95
|
-
- spec/data_link_spec.rb
|
96
|
-
- spec/error_buffer.rb
|
97
|
-
- spec/spec_helper.rb
|
98
|
-
- spec/handler_spec.rb
|
99
|
-
- spec/handler_examples.rb
|
100
|
-
- spec/helpers/dumps.rb
|
101
|
-
- examples/print_bytes.rb
|
80
|
+
test_files: []
|
81
|
+
|
data/examples/print_bytes.rb
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'rubygems'
|
4
|
-
require 'pcap'
|
5
|
-
|
6
|
-
include FFI
|
7
|
-
|
8
|
-
pcap = PCap.open_live(:device => ARGV[0]) do |user,header,bytes|
|
9
|
-
puts "#{header.timestamp}:"
|
10
|
-
|
11
|
-
header.captured.times { |i|
|
12
|
-
print ' %.2x' % bytes.get_uchar(i)
|
13
|
-
}
|
14
|
-
putc "\n"
|
15
|
-
end
|
16
|
-
|
17
|
-
pcap.loop
|
data/lib/pcap/error_buffer.rb
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
require 'ffi'
|
2
|
-
|
3
|
-
module FFI
|
4
|
-
module PCap
|
5
|
-
class ErrorBuffer < FFI::Buffer
|
6
|
-
|
7
|
-
# Size of the error buffers
|
8
|
-
SIZE = 256
|
9
|
-
|
10
|
-
#
|
11
|
-
# Creates a new ErrorBuffer object.
|
12
|
-
#
|
13
|
-
def initialize
|
14
|
-
super(SIZE)
|
15
|
-
end
|
16
|
-
|
17
|
-
#
|
18
|
-
# Returns the error message within the error buffer.
|
19
|
-
#
|
20
|
-
def to_s
|
21
|
-
get_string(SIZE)
|
22
|
-
end
|
23
|
-
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
data/lib/pcap/exceptions.rb
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
require 'pcap/exceptions/read_error'
|
data/spec/data_link_spec.rb
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
require 'pcap/data_link'
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
describe DataLink do
|
6
|
-
before(:all) do
|
7
|
-
@datalink = DataLink.new(0)
|
8
|
-
end
|
9
|
-
|
10
|
-
it "should be initialized from a pcap datalink value" do
|
11
|
-
@datalink.name.should == 'NULL'
|
12
|
-
end
|
13
|
-
|
14
|
-
it "should map datalink names to pcap datalink values" do
|
15
|
-
DataLink[:en10mb].should == 1
|
16
|
-
end
|
17
|
-
|
18
|
-
it "should have a description" do
|
19
|
-
@datalink.description.should_not be_empty
|
20
|
-
end
|
21
|
-
|
22
|
-
it "should be able to convert to an Integer" do
|
23
|
-
@datalink.to_i.should == 0
|
24
|
-
end
|
25
|
-
|
26
|
-
it "should be able to convert to a String" do
|
27
|
-
@datalink.to_s.should == 'NULL'
|
28
|
-
end
|
29
|
-
end
|
data/spec/dumps/simple_tcp.pcap
DELETED
Binary file
|
data/spec/error_buffer.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
require 'pcap/error_buffer'
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
describe PCap::ErrorBuffer do
|
6
|
-
before(:all) do
|
7
|
-
@errbuf = PCap::ErrorBuffer.new
|
8
|
-
end
|
9
|
-
|
10
|
-
it "should have a size of 256" do
|
11
|
-
@errbuf.size.should == 256
|
12
|
-
end
|
13
|
-
|
14
|
-
it "should return the error message for to_s" do
|
15
|
-
@errbuf.write_string('test')
|
16
|
-
@errbuf.to_s.should == 'test'
|
17
|
-
end
|
18
|
-
end
|
data/spec/handler_examples.rb
DELETED
@@ -1,71 +0,0 @@
|
|
1
|
-
require 'pcap/handler'
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
shared_examples_for "Handler" do
|
6
|
-
it "must have a datalink" do
|
7
|
-
datalink = @pcap.datalink
|
8
|
-
|
9
|
-
datalink.value.should_not be_nil
|
10
|
-
datalink.name.should_not be_empty
|
11
|
-
end
|
12
|
-
|
13
|
-
it "should pass packets to a callback" do
|
14
|
-
@pcap.callback do |user,header,bytes|
|
15
|
-
header.captured.should_not == 0
|
16
|
-
header.length.should_not == 0
|
17
|
-
|
18
|
-
bytes.should_not be_null
|
19
|
-
end
|
20
|
-
|
21
|
-
@pcap.loop
|
22
|
-
end
|
23
|
-
|
24
|
-
it "should be able to get the next packet" do
|
25
|
-
header, data = @pcap.next
|
26
|
-
|
27
|
-
header.should_not be_nil
|
28
|
-
header.captured.should_not == 0
|
29
|
-
header.length.should_not == 0
|
30
|
-
|
31
|
-
data.should_not be_nil
|
32
|
-
data.should_not be_null
|
33
|
-
end
|
34
|
-
|
35
|
-
it "should be able to open a dump file" do
|
36
|
-
lambda {
|
37
|
-
dumper = @pcap.open_dump(Tempfile.new.path)
|
38
|
-
dumper.close
|
39
|
-
}.should_not raise_error(RuntimeError)
|
40
|
-
end
|
41
|
-
|
42
|
-
it "should raise an exception when opening a bad dump file" do
|
43
|
-
lambda {
|
44
|
-
@pcap.open_dump(File.join('','obviously','not','there'))
|
45
|
-
}.should raise_error(RuntimeError)
|
46
|
-
end
|
47
|
-
|
48
|
-
it "should return an empty String when an error has not occurred" do
|
49
|
-
@pcap.error.should be_empty
|
50
|
-
end
|
51
|
-
|
52
|
-
it "should be able to break out of the Handler#loop" do
|
53
|
-
stopped = false
|
54
|
-
|
55
|
-
@pcap.loop do |user,pkthdr,bytes|
|
56
|
-
stopped = true
|
57
|
-
@pcap.stop
|
58
|
-
end
|
59
|
-
|
60
|
-
stopped.should == true
|
61
|
-
end
|
62
|
-
|
63
|
-
it "should prevent double closes" do
|
64
|
-
@pcap.close
|
65
|
-
@pcap.should be_closed
|
66
|
-
|
67
|
-
lambda {
|
68
|
-
@pcap.close
|
69
|
-
}.should_not raise_error(StandardError)
|
70
|
-
end
|
71
|
-
end
|
data/spec/handler_spec.rb
DELETED
@@ -1,80 +0,0 @@
|
|
1
|
-
require 'pcap/handler'
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
require 'helpers/dumps'
|
5
|
-
require 'handler_examples'
|
6
|
-
|
7
|
-
describe PCap::Handler do
|
8
|
-
describe "offline" do
|
9
|
-
before(:each) do
|
10
|
-
@pcap = PCap.open_offline(dump_path('simple_tcp'))
|
11
|
-
end
|
12
|
-
|
13
|
-
after(:each) do
|
14
|
-
@pcap.close
|
15
|
-
end
|
16
|
-
|
17
|
-
it_should_behave_like "Handler"
|
18
|
-
|
19
|
-
it "should not support non-blocking mode" do
|
20
|
-
@pcap.non_blocking = true
|
21
|
-
@pcap.should_not be_non_blocking
|
22
|
-
end
|
23
|
-
|
24
|
-
it "should return a nil if there are no packets left in the dump file" do
|
25
|
-
@pcap.loop
|
26
|
-
|
27
|
-
header, data = @pcap.next
|
28
|
-
|
29
|
-
header.should be_nil
|
30
|
-
data.should be_nil
|
31
|
-
end
|
32
|
-
|
33
|
-
it "should raise a ReadError when reading past the end of a dump file" do
|
34
|
-
@pcap.loop
|
35
|
-
|
36
|
-
lambda {
|
37
|
-
@pcap.next_extra
|
38
|
-
}.should raise_error(ReadError)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
describe "live" do
|
43
|
-
before(:each) do
|
44
|
-
@pcap = PCap.open_live(:count => 2)
|
45
|
-
end
|
46
|
-
|
47
|
-
after(:each) do
|
48
|
-
@pcap.close
|
49
|
-
end
|
50
|
-
|
51
|
-
it_should_behave_like "Handler"
|
52
|
-
|
53
|
-
it "should support non-blocking mode" do
|
54
|
-
@pcap.non_blocking = true
|
55
|
-
@pcap.should be_non_blocking
|
56
|
-
end
|
57
|
-
|
58
|
-
it "should provide statistics about packets received/dropped" do
|
59
|
-
@pcap.loop
|
60
|
-
|
61
|
-
stats = @pcap.stats
|
62
|
-
stats.received.should > 0
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
describe "dead" do
|
67
|
-
before(:each) do
|
68
|
-
@pcap = PCap.open_dead
|
69
|
-
end
|
70
|
-
|
71
|
-
after(:each) do
|
72
|
-
@pcap.close
|
73
|
-
end
|
74
|
-
|
75
|
-
it "should support non-blocking mode" do
|
76
|
-
@pcap.non_blocking = true
|
77
|
-
@pcap.should be_non_blocking
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
data/spec/helpers/dumps.rb
DELETED
data/spec/pcap_spec.rb
DELETED
@@ -1,51 +0,0 @@
|
|
1
|
-
require 'pcap/pcap'
|
2
|
-
require 'pcap/version'
|
3
|
-
|
4
|
-
require 'spec_helper'
|
5
|
-
require 'helpers/dumps'
|
6
|
-
|
7
|
-
describe PCap do
|
8
|
-
it "should define a VERSION constant" do
|
9
|
-
PCap.const_defined?('VERSION').should == true
|
10
|
-
end
|
11
|
-
|
12
|
-
it "should have a library version" do
|
13
|
-
PCap.lib_version.should_not be_empty
|
14
|
-
end
|
15
|
-
|
16
|
-
it "should return the name of a device suitable for open_live" do
|
17
|
-
dev = PCap.device
|
18
|
-
|
19
|
-
dev.should_not be_nil
|
20
|
-
dev.should_not be_empty
|
21
|
-
end
|
22
|
-
|
23
|
-
it "should enumerate over all usable devices" do
|
24
|
-
PCap.each_device do |dev|
|
25
|
-
dev.should_not be_nil
|
26
|
-
dev.should_not be_null
|
27
|
-
dev.class.should == PCap::IF
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
it "should be able to open a live pcap handler" do
|
32
|
-
lambda {
|
33
|
-
pcap = PCap.open_live
|
34
|
-
pcap.close
|
35
|
-
}.should_not raise_error(StandardError)
|
36
|
-
end
|
37
|
-
|
38
|
-
it "should be able to open a dead pcap handler" do
|
39
|
-
lambda {
|
40
|
-
pcap = PCap.open_dead('null')
|
41
|
-
pcap.close
|
42
|
-
}.should_not raise_error(StandardError)
|
43
|
-
end
|
44
|
-
|
45
|
-
it "should be able to open a pcap dump file" do
|
46
|
-
lambda {
|
47
|
-
pcap = PCap.open_offline(dump_path('simple_tcp'))
|
48
|
-
pcap.close
|
49
|
-
}.should_not raise_error(StandardError)
|
50
|
-
end
|
51
|
-
end
|
data/spec/spec_helper.rb
DELETED