rb-wartslib 0.9.10
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 +6 -0
- data/COPYING +340 -0
- data/README +79 -0
- data/bin/analyze-order +37 -0
- data/bin/scdump +101 -0
- data/bin/wdump +81 -0
- data/ext/extconf.rb +32 -0
- data/ext/scaddr.c +223 -0
- data/ext/scaddr.h +32 -0
- data/ext/scext.c +52 -0
- data/ext/scfile.c +688 -0
- data/ext/scfile.h +29 -0
- data/ext/sclist.c +632 -0
- data/ext/sclist.h +34 -0
- data/ext/sctrace.c +873 -0
- data/ext/sctrace.h +35 -0
- data/lib/wartslib.rb +27 -0
- data/lib/wartslib/wl-file.rb +85 -0
- data/lib/wartslib/wl-trace.rb +111 -0
- metadata +67 -0
data/bin/scdump
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
#############################################################################
|
4
|
+
## Ruby version of sc_analsysis_dump.
|
5
|
+
##
|
6
|
+
## $Id: scdump,v 1.11 2007/11/29 20:39:13 youngh Exp $
|
7
|
+
#############################################################################
|
8
|
+
|
9
|
+
require 'rubygems'
|
10
|
+
require 'wartslib'
|
11
|
+
|
12
|
+
$halt_reason = []
|
13
|
+
$halt_reason[Warts::Trace::STOP_COMPLETED] = "S"
|
14
|
+
$halt_reason[Warts::Trace::STOP_NONE] = "S"
|
15
|
+
$halt_reason[Warts::Trace::STOP_UNREACH] = "U"
|
16
|
+
$halt_reason[Warts::Trace::STOP_LOOP] = "L"
|
17
|
+
$halt_reason[Warts::Trace::STOP_DEAD] = "G"
|
18
|
+
|
19
|
+
# NOTE: This method is included for demonstration purposes only. You can
|
20
|
+
# generate the same output line directly from rb-wartslib by invoking
|
21
|
+
# Trace#dump. Hence, you could have implemented this method as follows:
|
22
|
+
#
|
23
|
+
# def show_trace(trace)
|
24
|
+
# puts trace.dump
|
25
|
+
# end
|
26
|
+
|
27
|
+
def show_trace(trace)
|
28
|
+
fields = ["T"]
|
29
|
+
|
30
|
+
fields.push trace.src, trace.dst, trace.list_id, trace.cycle_id, trace.start
|
31
|
+
|
32
|
+
dest_response = trace.find_dest_response
|
33
|
+
if dest_response
|
34
|
+
fields.push "R", trace.hop_rtt_str(*dest_response),
|
35
|
+
trace.hop_probe_ttl(*dest_response),
|
36
|
+
trace.hop_reply_ttl(*dest_response)
|
37
|
+
else
|
38
|
+
fields.push "N", 0, 0, 0
|
39
|
+
end
|
40
|
+
|
41
|
+
fields.push($halt_reason[trace.stop_reason] || "?")
|
42
|
+
fields.push trace.stop_data
|
43
|
+
|
44
|
+
# The following algorithm for determining path_complete is a transcription
|
45
|
+
# of the algorithm used by sc_analysis_dump for compatibility reasons.
|
46
|
+
=begin
|
47
|
+
path_complete = "I"
|
48
|
+
if dest_response
|
49
|
+
hop = 0
|
50
|
+
trace.each do |hop, attempt, exists|
|
51
|
+
break if !exists || hop >= dest_response[0]
|
52
|
+
end
|
53
|
+
path_complete = "C" if hop == dest_response[0]
|
54
|
+
end
|
55
|
+
fields.push path_complete
|
56
|
+
=end
|
57
|
+
fields.push(trace.complete? ? "C" : "I")
|
58
|
+
|
59
|
+
# For compatibility with sc_analysis_dump, we don't print missing hops
|
60
|
+
# at the end of the trace.
|
61
|
+
unresponsive = 0
|
62
|
+
trace.each_hop do |hop, exists|
|
63
|
+
if exists
|
64
|
+
hop_str = ""
|
65
|
+
trace.each_attempt(hop) do |attempt|
|
66
|
+
# sc_analysis_dump compatibility
|
67
|
+
next if dest_response &&
|
68
|
+
hop == dest_response[0] && attempt == dest_response[1]
|
69
|
+
|
70
|
+
hop_str << ";" unless hop_str.empty?
|
71
|
+
hop_str << trace.hop_addr(hop, attempt)
|
72
|
+
hop_str << "," << trace.hop_rtt_str(hop, attempt)
|
73
|
+
hop_str << "," << trace.hop_probe_id(hop, attempt).to_s
|
74
|
+
end
|
75
|
+
|
76
|
+
unless hop_str.empty?
|
77
|
+
unresponsive.times { fields.push "q" }
|
78
|
+
unresponsive = 0
|
79
|
+
|
80
|
+
fields.push hop_str
|
81
|
+
end
|
82
|
+
else
|
83
|
+
unresponsive += 1
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
puts fields.join("\t")
|
88
|
+
end
|
89
|
+
|
90
|
+
|
91
|
+
#############################################################################
|
92
|
+
# Main
|
93
|
+
#############################################################################
|
94
|
+
|
95
|
+
ARGV.each do |path|
|
96
|
+
file = Warts::File::open path
|
97
|
+
file.add_filters Warts::File::TRACE
|
98
|
+
while (trace = file.read)
|
99
|
+
show_trace trace
|
100
|
+
end
|
101
|
+
end
|
data/bin/wdump
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
#############################################################################
|
4
|
+
## A primitive version of warts-dump that demonstrates use of some of the
|
5
|
+
## accessor methods on traces and trace hops.
|
6
|
+
##
|
7
|
+
## Maybe I'll expand this to be a replacement for warts-dump, like scdump
|
8
|
+
## replaces sc_analysis_dump, as a more complete demonstration of using
|
9
|
+
## rb-wartslib.
|
10
|
+
##
|
11
|
+
## $Id: wdump,v 1.9 2007/11/29 20:35:10 youngh Exp $
|
12
|
+
#############################################################################
|
13
|
+
|
14
|
+
require 'rubygems'
|
15
|
+
require 'wartslib'
|
16
|
+
|
17
|
+
def show_attr(object, name, *args)
|
18
|
+
print name.to_s, ": "
|
19
|
+
p object.send(name, *args)
|
20
|
+
end
|
21
|
+
|
22
|
+
def show_trace(trace)
|
23
|
+
[
|
24
|
+
:src,
|
25
|
+
:dst,
|
26
|
+
:hop_count,
|
27
|
+
:stop_reason,
|
28
|
+
:type,
|
29
|
+
:flags,
|
30
|
+
:attempts,
|
31
|
+
:hoplimit ,
|
32
|
+
:gaplimit,
|
33
|
+
:firsthop,
|
34
|
+
:tos,
|
35
|
+
:wait,
|
36
|
+
:loops,
|
37
|
+
:probe_size,
|
38
|
+
:sport,
|
39
|
+
:dport
|
40
|
+
].each do |name|
|
41
|
+
show_attr trace, name
|
42
|
+
end
|
43
|
+
|
44
|
+
trace.each do |hop, attempt, exists|
|
45
|
+
unless exists
|
46
|
+
puts "hop #{hop}, attempt 0: *"
|
47
|
+
next
|
48
|
+
end
|
49
|
+
|
50
|
+
puts "hop #{hop}, attempt #{attempt}"
|
51
|
+
[
|
52
|
+
:hop_addr,
|
53
|
+
:hop_flags,
|
54
|
+
:hop_probe_id,
|
55
|
+
:hop_probe_ttl,
|
56
|
+
:hop_reply_ttl,
|
57
|
+
:hop_probe_size,
|
58
|
+
:hop_reply_size,
|
59
|
+
:hop_icmp_type,
|
60
|
+
:hop_icmp_code,
|
61
|
+
:hop_tcp_flags,
|
62
|
+
:hop_rtt_sec,
|
63
|
+
:hop_rtt_usec
|
64
|
+
].each do |name|
|
65
|
+
print " "
|
66
|
+
show_attr trace, name, hop, attempt
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
ARGV.each do |path|
|
72
|
+
puts "\n:::: #{path} ::::"
|
73
|
+
Warts::File::open(path) do |file|
|
74
|
+
file.add_filters Warts::File::TRACE
|
75
|
+
file.read do |trace|
|
76
|
+
puts "=" * 70
|
77
|
+
show_trace trace
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
data/ext/extconf.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
##===========================================================================
|
2
|
+
## Execute:
|
3
|
+
##
|
4
|
+
## SCAMPER=../scamper-cvs-20070523h
|
5
|
+
## ruby extconf.rb --with-scamper-include=$SCAMPER --with-scamper-lib=$SCAMPER
|
6
|
+
##
|
7
|
+
## --------------------------------------------------------------------------
|
8
|
+
## Copyright (C) 2007 The Regents of the University of California.
|
9
|
+
##
|
10
|
+
## This program is free software; you can redistribute it and/or modify
|
11
|
+
## it under the terms of the GNU General Public License as published by
|
12
|
+
## the Free Software Foundation; either version 2 of the License, or
|
13
|
+
## (at your option) any later version.
|
14
|
+
##
|
15
|
+
## This program is distributed in the hope that it will be useful,
|
16
|
+
## but WITHOUT ANY WARRANTY; without even the implied warranty of
|
17
|
+
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
18
|
+
## GNU General Public License for more details.
|
19
|
+
##
|
20
|
+
## You should have received a copy of the GNU General Public License
|
21
|
+
## along with this program; if not, write to the Free Software
|
22
|
+
## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
23
|
+
##
|
24
|
+
## $Id: extconf.rb,v 1.6 2007/11/29 01:41:47 youngh Exp $
|
25
|
+
##===========================================================================
|
26
|
+
|
27
|
+
require 'mkmf'
|
28
|
+
|
29
|
+
have_header("stdint.h")
|
30
|
+
dir_config("scamper")
|
31
|
+
have_library("scamperfile", "scamper_trace_alloc")
|
32
|
+
create_makefile("wartslibext")
|
data/ext/scaddr.c
ADDED
@@ -0,0 +1,223 @@
|
|
1
|
+
/*
|
2
|
+
** Ruby bindings to scamper_addr_t.
|
3
|
+
**
|
4
|
+
** --------------------------------------------------------------------------
|
5
|
+
** Copyright (C) 2007 The Regents of the University of California.
|
6
|
+
**
|
7
|
+
** This program is free software; you can redistribute it and/or modify
|
8
|
+
** it under the terms of the GNU General Public License as published by
|
9
|
+
** the Free Software Foundation; either version 2 of the License, or
|
10
|
+
** (at your option) any later version.
|
11
|
+
**
|
12
|
+
** This program is distributed in the hope that it will be useful,
|
13
|
+
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
|
+
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
15
|
+
** GNU General Public License for more details.
|
16
|
+
**
|
17
|
+
** You should have received a copy of the GNU General Public License
|
18
|
+
** along with this program; if not, write to the Free Software
|
19
|
+
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
20
|
+
**
|
21
|
+
** $Id: scaddr.c,v 1.9 2007/11/29 01:42:07 youngh Exp $
|
22
|
+
**/
|
23
|
+
|
24
|
+
#include "ruby.h"
|
25
|
+
|
26
|
+
#if defined(__HAVE_STDINT_H__)
|
27
|
+
#include <stdint.h>
|
28
|
+
#endif
|
29
|
+
|
30
|
+
#include "scamper_file.h"
|
31
|
+
#include "scaddr.h"
|
32
|
+
|
33
|
+
extern VALUE mWarts;
|
34
|
+
|
35
|
+
static VALUE cAddr;
|
36
|
+
|
37
|
+
static ID iv_element_type;
|
38
|
+
|
39
|
+
/*-------------------------------------------------------------------------*/
|
40
|
+
|
41
|
+
#define DEF_CONST(name) \
|
42
|
+
rb_define_const(cAddr, #name, INT2FIX(SCAMPER_ADDR_TYPE_##name));
|
43
|
+
|
44
|
+
|
45
|
+
/*-------------------------------------------------------------------------*/
|
46
|
+
|
47
|
+
#define DEF_ATTR(name) \
|
48
|
+
rb_define_method(cAddr, #name, scaddr_attr_##name, 0);
|
49
|
+
|
50
|
+
#define NUM_ATTR_FIELD_FUN(name,field) \
|
51
|
+
static VALUE scaddr_attr_##name(VALUE self) \
|
52
|
+
{ \
|
53
|
+
scamper_addr_t *addr; \
|
54
|
+
Data_Get_Struct(self, scamper_addr_t, addr); \
|
55
|
+
return INT2NUM(addr->field); \
|
56
|
+
}
|
57
|
+
|
58
|
+
#define NUM_ATTR_FUN(name) NUM_ATTR_FIELD_FUN(name,name)
|
59
|
+
|
60
|
+
NUM_ATTR_FUN(type);
|
61
|
+
NUM_ATTR_FUN(refcnt); /* for debugging purposes only */
|
62
|
+
|
63
|
+
|
64
|
+
/*-------------------------------------------------------------------------*/
|
65
|
+
|
66
|
+
#define DEF_QUERY(name) \
|
67
|
+
rb_define_method(cAddr, #name "?", scaddr_query_##name, 0);
|
68
|
+
|
69
|
+
#define QUERY_FUN(name,macro) \
|
70
|
+
static VALUE scaddr_query_##name(VALUE self) \
|
71
|
+
{ \
|
72
|
+
scamper_addr_t *addr; \
|
73
|
+
Data_Get_Struct(self, scamper_addr_t, addr); \
|
74
|
+
return (addr->type == SCAMPER_ADDR_TYPE_##macro ? Qtrue: Qfalse); \
|
75
|
+
}
|
76
|
+
|
77
|
+
QUERY_FUN(ipv4, IPV4);
|
78
|
+
QUERY_FUN(ipv6, IPV6);
|
79
|
+
QUERY_FUN(ethernet, ETHERNET);
|
80
|
+
QUERY_FUN(firewire, FIREWIRE);
|
81
|
+
|
82
|
+
|
83
|
+
/***************************************************************************/
|
84
|
+
|
85
|
+
static void scaddr_free(void *data)
|
86
|
+
{
|
87
|
+
if (data) {
|
88
|
+
scamper_addr_free((scamper_addr_t *)data);
|
89
|
+
}
|
90
|
+
}
|
91
|
+
|
92
|
+
static VALUE scaddr_alloc(VALUE klass)
|
93
|
+
{
|
94
|
+
return Data_Wrap_Struct(klass, 0, scaddr_free, 0);
|
95
|
+
}
|
96
|
+
|
97
|
+
|
98
|
+
static VALUE scaddr_init(VALUE self)
|
99
|
+
{
|
100
|
+
rb_ivar_set(self, iv_element_type, INT2FIX(SCAMPER_FILE_OBJ_ADDR));
|
101
|
+
return self;
|
102
|
+
}
|
103
|
+
|
104
|
+
|
105
|
+
#if 0
|
106
|
+
static VALUE scaddr_init_copy(VALUE copy, VALUE orig)
|
107
|
+
{
|
108
|
+
scamper_addr_t *orig_addr;
|
109
|
+
|
110
|
+
if (copy == orig) {
|
111
|
+
return copy;
|
112
|
+
}
|
113
|
+
|
114
|
+
/* See Pragmatic Programmer's book. */
|
115
|
+
if (TYPE(orig) != T_DATA || RDATA(orig)->dfree != scaddr_free) {
|
116
|
+
rb_raise(rb_eTypeError, "wrong argument type");
|
117
|
+
}
|
118
|
+
|
119
|
+
Data_Get_Struct(orig, scamper_addr_t, orig_addr);
|
120
|
+
DATA_PTR(copy) = scamper_addr_use(orig_addr);
|
121
|
+
|
122
|
+
return copy;
|
123
|
+
}
|
124
|
+
#endif
|
125
|
+
|
126
|
+
|
127
|
+
static VALUE scaddr_cmp(VALUE self, VALUE other)
|
128
|
+
{
|
129
|
+
scamper_addr_t *self_addr;
|
130
|
+
scamper_addr_t *other_addr;
|
131
|
+
|
132
|
+
if (other == self) {
|
133
|
+
return INT2FIX(0);
|
134
|
+
}
|
135
|
+
|
136
|
+
/* See Pragmatic Programmer's book. */
|
137
|
+
if (TYPE(other) != T_DATA || RDATA(other)->dfree != scaddr_free) {
|
138
|
+
rb_raise(rb_eTypeError, "wrong argument type");
|
139
|
+
}
|
140
|
+
|
141
|
+
Data_Get_Struct(self, scamper_addr_t, self_addr);
|
142
|
+
Data_Get_Struct(other, scamper_addr_t, other_addr);
|
143
|
+
return INT2FIX(scamper_addr_cmp(self_addr, other_addr));
|
144
|
+
}
|
145
|
+
|
146
|
+
|
147
|
+
static VALUE scaddr_addr(VALUE self)
|
148
|
+
{
|
149
|
+
scamper_addr_t *addr;
|
150
|
+
char buf[128];
|
151
|
+
|
152
|
+
Data_Get_Struct(self, scamper_addr_t, addr);
|
153
|
+
return rb_str_new2(scamper_addr_tostr(addr, buf, 128));
|
154
|
+
}
|
155
|
+
|
156
|
+
|
157
|
+
static VALUE scaddr_write_to(VALUE self, VALUE file)
|
158
|
+
{
|
159
|
+
return self; /* nothing to do: users shouldn't write addrs themselves */
|
160
|
+
}
|
161
|
+
|
162
|
+
|
163
|
+
/*-------------------------------------------------------------------------*/
|
164
|
+
|
165
|
+
VALUE scaddr_create(scamper_addr_t *addr)
|
166
|
+
{
|
167
|
+
VALUE obj = Data_Wrap_Struct(cAddr, 0, scaddr_free, addr);
|
168
|
+
|
169
|
+
if (NIL_P(scaddr_init(obj))) {
|
170
|
+
return Qnil;
|
171
|
+
}
|
172
|
+
|
173
|
+
return obj;
|
174
|
+
}
|
175
|
+
|
176
|
+
|
177
|
+
/***************************************************************************/
|
178
|
+
/***************************************************************************/
|
179
|
+
|
180
|
+
void Init_scaddr(void)
|
181
|
+
{
|
182
|
+
ID private_class_method_ID, private_ID;
|
183
|
+
ID new_ID, dup_ID, clone_ID;
|
184
|
+
|
185
|
+
iv_element_type = rb_intern("@element_type");
|
186
|
+
|
187
|
+
cAddr = rb_define_class_under(mWarts, "Addr", rb_cObject);
|
188
|
+
|
189
|
+
rb_include_module(cAddr, rb_mComparable);
|
190
|
+
|
191
|
+
DEF_CONST(IPV4);
|
192
|
+
DEF_CONST(IPV6);
|
193
|
+
DEF_CONST(ETHERNET);
|
194
|
+
DEF_CONST(FIREWIRE);
|
195
|
+
|
196
|
+
DEF_ATTR(type);
|
197
|
+
DEF_ATTR(refcnt);
|
198
|
+
|
199
|
+
DEF_QUERY(ipv4);
|
200
|
+
DEF_QUERY(ipv6);
|
201
|
+
DEF_QUERY(ethernet);
|
202
|
+
DEF_QUERY(firewire);
|
203
|
+
|
204
|
+
rb_define_alloc_func(cAddr, scaddr_alloc);
|
205
|
+
|
206
|
+
rb_define_attr(cAddr, "element_type", 1, 0);
|
207
|
+
|
208
|
+
rb_define_method(cAddr, "initialize", scaddr_init, 0);
|
209
|
+
/* rb_define_method(cAddr, "initialize_copy", scaddr_init_copy, 1); */
|
210
|
+
rb_define_method(cAddr, "<=>", scaddr_cmp, 1);
|
211
|
+
rb_define_method(cAddr, "addr", scaddr_addr, 0);
|
212
|
+
rb_define_method(cAddr, "write_to", scaddr_write_to, 1);
|
213
|
+
|
214
|
+
private_class_method_ID = rb_intern("private_class_method");
|
215
|
+
private_ID = rb_intern("private");
|
216
|
+
new_ID = rb_intern("new");
|
217
|
+
dup_ID = rb_intern("dup");
|
218
|
+
clone_ID = rb_intern("clone");
|
219
|
+
|
220
|
+
rb_funcall(cAddr, private_class_method_ID, 1, ID2SYM(new_ID));
|
221
|
+
rb_funcall(cAddr, private_ID, 1, ID2SYM(dup_ID));
|
222
|
+
rb_funcall(cAddr, private_ID, 1, ID2SYM(clone_ID));
|
223
|
+
}
|
data/ext/scaddr.h
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
/*
|
2
|
+
** Ruby bindings to scamper_addr_t.
|
3
|
+
**
|
4
|
+
** --------------------------------------------------------------------------
|
5
|
+
** Copyright (C) 2007 The Regents of the University of California.
|
6
|
+
**
|
7
|
+
** This program is free software; you can redistribute it and/or modify
|
8
|
+
** it under the terms of the GNU General Public License as published by
|
9
|
+
** the Free Software Foundation; either version 2 of the License, or
|
10
|
+
** (at your option) any later version.
|
11
|
+
**
|
12
|
+
** This program is distributed in the hope that it will be useful,
|
13
|
+
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
|
+
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
15
|
+
** GNU General Public License for more details.
|
16
|
+
**
|
17
|
+
** You should have received a copy of the GNU General Public License
|
18
|
+
** along with this program; if not, write to the Free Software
|
19
|
+
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
20
|
+
**
|
21
|
+
** $Id: scaddr.h,v 1.2 2007/11/29 01:29:59 youngh Exp $
|
22
|
+
**/
|
23
|
+
|
24
|
+
#ifndef __SCADDR_H
|
25
|
+
#define __SCADDR_H
|
26
|
+
|
27
|
+
#include "scamper_addr.h"
|
28
|
+
|
29
|
+
VALUE scaddr_create(scamper_addr_t *addr);
|
30
|
+
void Init_scaddr(void);
|
31
|
+
|
32
|
+
#endif # __SCADDR_H
|