blackfoundry-pcap 0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +145 -0
- data/README +48 -0
- data/README.ja +50 -0
- data/Rakefile +23 -0
- data/ext/Pcap.c +798 -0
- data/ext/extconf.rb +16 -0
- data/ext/icmp_packet.c +444 -0
- data/ext/ip_packet.c +342 -0
- data/ext/packet.c +310 -0
- data/ext/ruby_pcap.h +133 -0
- data/ext/tcp_packet.c +121 -0
- data/ext/udp_packet.c +96 -0
- data/lib/pcap_misc.rb +116 -0
- data/lib/pcaplet.rb +113 -0
- metadata +79 -0
data/ext/ruby_pcap.h
ADDED
@@ -0,0 +1,133 @@
|
|
1
|
+
/*
|
2
|
+
* ruby_pcap.h
|
3
|
+
*
|
4
|
+
* $Id: ruby_pcap.h,v 1.4 2000/08/13 06:56:15 fukusima Exp $
|
5
|
+
*
|
6
|
+
* Copyright (C) 1998-2000 Masaki Fukushima
|
7
|
+
*/
|
8
|
+
|
9
|
+
#ifndef RUBY_PCAP_H
|
10
|
+
#define RUBY_PCAP_H
|
11
|
+
|
12
|
+
#include "ruby.h"
|
13
|
+
#include <pcap.h>
|
14
|
+
#include <stdio.h>
|
15
|
+
#include <netinet/in.h>
|
16
|
+
#include <netinet/in_systm.h>
|
17
|
+
#include <netinet/ip.h>
|
18
|
+
#include <arpa/inet.h>
|
19
|
+
#ifndef IP_OFFMASK
|
20
|
+
# define IP_OFFMASK 0x1fff
|
21
|
+
#endif
|
22
|
+
#ifdef linux
|
23
|
+
# define __FAVOR_BSD
|
24
|
+
#endif
|
25
|
+
#include <netinet/tcp.h>
|
26
|
+
#include <netinet/udp.h>
|
27
|
+
#include <netinet/ip_icmp.h>
|
28
|
+
#include <sys/socket.h>
|
29
|
+
#include <netdb.h>
|
30
|
+
|
31
|
+
#ifdef DEBUG
|
32
|
+
# define DEBUG_PRINT(x) \
|
33
|
+
((RTEST(ruby_debug) && RTEST(ruby_verbose))?\
|
34
|
+
(fprintf(stderr, "%s\n", x),fflush(stderr)) : 0)
|
35
|
+
#else
|
36
|
+
# define DEBUG_PRINT(x) (0)
|
37
|
+
#endif
|
38
|
+
|
39
|
+
#define UINT32_2_NUM(i) rb_uint2inum(i)
|
40
|
+
#ifndef UINT2NUM
|
41
|
+
# define UINT2NUM(i) rb_uint2inum(i)
|
42
|
+
#endif
|
43
|
+
#define MIN(x, y) ((x)<(y) ? (x) : (y))
|
44
|
+
|
45
|
+
|
46
|
+
#define PACKET_MARSHAL_VERSION 1
|
47
|
+
|
48
|
+
/* ruby config.h defines WORDS_BIGENDIAN if big-endian */
|
49
|
+
struct packet_object_header {
|
50
|
+
#ifdef WORDS_BIGENDIAN
|
51
|
+
u_char version:4; /* marshal format version */
|
52
|
+
u_char flags:4; /* flags */
|
53
|
+
#else
|
54
|
+
u_char flags:4; /* flags */
|
55
|
+
u_char version:4; /* marshal format version */
|
56
|
+
#endif
|
57
|
+
#define POH_UDATA 0x01 /* flag: user data exists */
|
58
|
+
#define POH_RSVD1 0x02 /* (reserved) */
|
59
|
+
#define POH_RSVD2 0x03 /* (reserved) */
|
60
|
+
#define POH_RSVD3 0x04 /* (reserved) */
|
61
|
+
u_char dl_type; /* data-link type (DLT_*) */
|
62
|
+
u_short layer3_off; /* layer 3 header offset */
|
63
|
+
u_short layer4_off; /* layer 4 header offset */
|
64
|
+
u_short layer5_off; /* layer 5 header offset */
|
65
|
+
#define OFF_NONEXIST 0xffff /* offset value for non-existent layer */
|
66
|
+
struct pcap_pkthdr pkthdr; /* pcap packet header */
|
67
|
+
};
|
68
|
+
|
69
|
+
struct packet_object {
|
70
|
+
struct packet_object_header hdr; /* packet object header */
|
71
|
+
u_char *data; /* packet data */
|
72
|
+
VALUE udata; /* user data */
|
73
|
+
};
|
74
|
+
|
75
|
+
#define PKTFLAG_TEST(pkt, flag) ((pkt)->hdr.flags & (flag))
|
76
|
+
#define PKTFLAG_SET(pkt, flag, val) \
|
77
|
+
((val) ? ((pkt)->hdr.flags |= (flag)) : ((pkt)->hdr.flags &= ~(flag)))
|
78
|
+
|
79
|
+
#define LAYER2_HDR(pkt) ((pkt)->data)
|
80
|
+
#define LAYER3_HDR(pkt) ((pkt)->data + (pkt)->hdr.layer3_off)
|
81
|
+
#define LAYER4_HDR(pkt) ((pkt)->data + (pkt)->hdr.layer4_off)
|
82
|
+
#define LAYER5_HDR(pkt) ((pkt)->data + (pkt)->hdr.layer5_off)
|
83
|
+
|
84
|
+
#define GetPacket(obj, pkt) Data_Get_Struct(obj, struct packet_object, pkt)
|
85
|
+
#define Caplen(pkt, from) ((pkt)->hdr.pkthdr.caplen - (from))
|
86
|
+
#define CheckTruncate(pkt, from, need, emsg) (\
|
87
|
+
(from) + (need) > (pkt)->hdr.pkthdr.caplen ? \
|
88
|
+
rb_raise(eTruncatedPacket, (emsg)) : 0 \
|
89
|
+
)
|
90
|
+
|
91
|
+
#define IsKindOf(v, class) RTEST(rb_obj_is_kind_of(v, class))
|
92
|
+
#define CheckClass(v, class) ((IsKindOf(v, class)) ? 0 :\
|
93
|
+
rb_raise(rb_eTypeError, "wrong type %s (expected %s)",\
|
94
|
+
rb_class2name(CLASS_OF(v)), rb_class2name(class)))
|
95
|
+
|
96
|
+
|
97
|
+
/* Pcap.c */
|
98
|
+
extern VALUE mPcap, rbpcap_convert;
|
99
|
+
extern VALUE ePcapError;
|
100
|
+
extern VALUE eTruncatedPacket;
|
101
|
+
extern VALUE cFilter;
|
102
|
+
void Init_pcap(void);
|
103
|
+
VALUE filter_match(VALUE self, VALUE v_pkt);
|
104
|
+
|
105
|
+
/* packet.c */
|
106
|
+
extern VALUE cPacket;
|
107
|
+
void Init_packet(void);
|
108
|
+
VALUE new_packet(const u_char *, const struct pcap_pkthdr *, int);
|
109
|
+
|
110
|
+
/* ip_packet.c */
|
111
|
+
#define IP_HDR(pkt) ((struct ip *)LAYER3_HDR(pkt))
|
112
|
+
#define IP_DATA(pkt) ((u_char *)LAYER4_HDR(pkt))
|
113
|
+
extern VALUE cIPPacket;
|
114
|
+
void Init_ip_packet(void);
|
115
|
+
VALUE setup_ip_packet(struct packet_object *, int);
|
116
|
+
VALUE new_ipaddr(struct in_addr *);
|
117
|
+
|
118
|
+
/* tcp_packet.c */
|
119
|
+
extern VALUE cTCPPacket;
|
120
|
+
void Init_tcp_packet(void);
|
121
|
+
VALUE setup_tcp_packet(struct packet_object *, int);
|
122
|
+
|
123
|
+
/* udp_packet.c */
|
124
|
+
extern VALUE cUDPPacket;
|
125
|
+
void Init_udp_packet(void);
|
126
|
+
VALUE setup_udp_packet(struct packet_object *, int);
|
127
|
+
|
128
|
+
/* icmp_packet.c */
|
129
|
+
extern VALUE cICMPPacket;
|
130
|
+
void Init_icmp_packet(void);
|
131
|
+
VALUE setup_icmp_packet(struct packet_object *, int);
|
132
|
+
|
133
|
+
#endif /* RUBY_PCAP_H */
|
data/ext/tcp_packet.c
ADDED
@@ -0,0 +1,121 @@
|
|
1
|
+
/*
|
2
|
+
* tcp_packet.c
|
3
|
+
*
|
4
|
+
* $Id: tcp_packet.c,v 1.1.1.1 1999/10/27 09:54:38 fukusima Exp $
|
5
|
+
*
|
6
|
+
* Copyright (C) 1998, 1999 Masaki Fukushima
|
7
|
+
*/
|
8
|
+
|
9
|
+
#include "ruby_pcap.h"
|
10
|
+
#include <limits.h>
|
11
|
+
|
12
|
+
#define TCP_HDR(pkt) ((struct tcphdr *)LAYER4_HDR(pkt))
|
13
|
+
#define TCP_DATA(pkt) ((u_char *)LAYER5_HDR(pkt))
|
14
|
+
#define TCP_DATALEN(pkt) (ntohs(IP_HDR(pkt)->ip_len) - \
|
15
|
+
(IP_HDR(pkt)->ip_hl + TCP_HDR(pkt)->th_off) * 4)
|
16
|
+
|
17
|
+
VALUE cTCPPacket;
|
18
|
+
|
19
|
+
#define CheckTruncateTcp(pkt, need) \
|
20
|
+
CheckTruncate(pkt, pkt->hdr.layer4_off, need, "truncated TCP")
|
21
|
+
|
22
|
+
VALUE
|
23
|
+
setup_tcp_packet(pkt, tl_len)
|
24
|
+
struct packet_object *pkt;
|
25
|
+
int tl_len;
|
26
|
+
{
|
27
|
+
VALUE class;
|
28
|
+
|
29
|
+
DEBUG_PRINT("setup_tcp_packet");
|
30
|
+
|
31
|
+
class = cTCPPacket;
|
32
|
+
if (tl_len > 20) {
|
33
|
+
int hl = TCP_HDR(pkt)->th_off * 4;
|
34
|
+
int layer5_len = tl_len - hl;
|
35
|
+
if (layer5_len > 0) {
|
36
|
+
pkt->hdr.layer5_off = pkt->hdr.layer4_off + hl;
|
37
|
+
/* upper layer */
|
38
|
+
}
|
39
|
+
}
|
40
|
+
return class;
|
41
|
+
}
|
42
|
+
|
43
|
+
#define TCPP_METHOD(func, need, val) \
|
44
|
+
static VALUE\
|
45
|
+
(func)(self)\
|
46
|
+
VALUE self;\
|
47
|
+
{\
|
48
|
+
struct packet_object *pkt;\
|
49
|
+
struct tcphdr *tcp;\
|
50
|
+
DEBUG_PRINT(#func);\
|
51
|
+
GetPacket(self, pkt);\
|
52
|
+
CheckTruncateTcp(pkt, (need));\
|
53
|
+
tcp = TCP_HDR(pkt);\
|
54
|
+
return (val);\
|
55
|
+
}
|
56
|
+
|
57
|
+
TCPP_METHOD(tcpp_sport, 2, INT2FIX(ntohs(tcp->th_sport)))
|
58
|
+
TCPP_METHOD(tcpp_dport, 4, INT2FIX(ntohs(tcp->th_dport)))
|
59
|
+
TCPP_METHOD(tcpp_seq, 8, UINT32_2_NUM(ntohl(tcp->th_seq)))
|
60
|
+
TCPP_METHOD(tcpp_acknum, 12, UINT32_2_NUM(ntohl(tcp->th_ack)))
|
61
|
+
TCPP_METHOD(tcpp_off, 13, INT2FIX(tcp->th_off))
|
62
|
+
TCPP_METHOD(tcpp_flags, 14, INT2FIX(tcp->th_flags))
|
63
|
+
TCPP_METHOD(tcpp_win, 16, INT2FIX(ntohs(tcp->th_win)))
|
64
|
+
TCPP_METHOD(tcpp_sum, 18, INT2FIX(ntohs(tcp->th_sum)))
|
65
|
+
TCPP_METHOD(tcpp_urp, 20, INT2FIX(ntohs(tcp->th_urp)))
|
66
|
+
|
67
|
+
#define TCPP_FLAG(func, flag) \
|
68
|
+
TCPP_METHOD(func, 14, (tcp->th_flags & flag) ? Qtrue : Qfalse)
|
69
|
+
TCPP_FLAG(tcpp_fin, TH_FIN)
|
70
|
+
TCPP_FLAG(tcpp_syn, TH_SYN)
|
71
|
+
TCPP_FLAG(tcpp_rst, TH_RST)
|
72
|
+
TCPP_FLAG(tcpp_psh, TH_PUSH)
|
73
|
+
TCPP_FLAG(tcpp_ack, TH_ACK)
|
74
|
+
TCPP_FLAG(tcpp_urg, TH_URG)
|
75
|
+
|
76
|
+
static VALUE
|
77
|
+
tcpp_data(self)
|
78
|
+
VALUE self;
|
79
|
+
{
|
80
|
+
struct packet_object *pkt;
|
81
|
+
VALUE v_len;
|
82
|
+
int len;
|
83
|
+
|
84
|
+
DEBUG_PRINT("tcpp_data");
|
85
|
+
GetPacket(self, pkt);
|
86
|
+
|
87
|
+
if (pkt->hdr.layer5_off == OFF_NONEXIST) return Qnil;
|
88
|
+
|
89
|
+
len = MIN(Caplen(pkt, pkt->hdr.layer5_off), TCP_DATALEN(pkt));
|
90
|
+
if (len < 1) return Qnil;
|
91
|
+
return rb_str_new(TCP_DATA(pkt), len);
|
92
|
+
}
|
93
|
+
|
94
|
+
void
|
95
|
+
Init_tcp_packet(void)
|
96
|
+
{
|
97
|
+
DEBUG_PRINT("Init_tcp_packet");
|
98
|
+
|
99
|
+
/* define class TcpPacket */
|
100
|
+
cTCPPacket = rb_define_class_under(mPcap, "TCPPacket", cIPPacket);
|
101
|
+
|
102
|
+
rb_define_method(cTCPPacket, "tcp_sport", tcpp_sport, 0);
|
103
|
+
rb_define_method(cTCPPacket, "sport", tcpp_sport, 0);
|
104
|
+
rb_define_method(cTCPPacket, "tcp_dport", tcpp_dport, 0);
|
105
|
+
rb_define_method(cTCPPacket, "dport", tcpp_dport, 0);
|
106
|
+
rb_define_method(cTCPPacket, "tcp_seq", tcpp_seq, 0);
|
107
|
+
rb_define_method(cTCPPacket, "tcp_ack", tcpp_acknum, 0);
|
108
|
+
rb_define_method(cTCPPacket, "tcp_off", tcpp_off, 0);
|
109
|
+
rb_define_method(cTCPPacket, "tcp_hlen", tcpp_off, 0);
|
110
|
+
rb_define_method(cTCPPacket, "tcp_flags", tcpp_flags, 0);
|
111
|
+
rb_define_method(cTCPPacket, "tcp_win", tcpp_win, 0);
|
112
|
+
rb_define_method(cTCPPacket, "tcp_sum", tcpp_sum, 0);
|
113
|
+
rb_define_method(cTCPPacket, "tcp_urp", tcpp_urp, 0);
|
114
|
+
rb_define_method(cTCPPacket, "tcp_fin?", tcpp_fin, 0);
|
115
|
+
rb_define_method(cTCPPacket, "tcp_syn?", tcpp_syn, 0);
|
116
|
+
rb_define_method(cTCPPacket, "tcp_rst?", tcpp_rst, 0);
|
117
|
+
rb_define_method(cTCPPacket, "tcp_psh?", tcpp_psh, 0);
|
118
|
+
rb_define_method(cTCPPacket, "tcp_ack?", tcpp_ack, 0);
|
119
|
+
rb_define_method(cTCPPacket, "tcp_urg?", tcpp_urg, 0);
|
120
|
+
rb_define_method(cTCPPacket, "tcp_data", tcpp_data, 0);
|
121
|
+
}
|
data/ext/udp_packet.c
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
/*
|
2
|
+
* udp_packet.c
|
3
|
+
*
|
4
|
+
* $Id: udp_packet.c,v 1.1.1.1 1999/10/27 09:54:38 fukusima Exp $
|
5
|
+
*
|
6
|
+
* Copyright (C) 1999 Masaki Fukushima
|
7
|
+
*/
|
8
|
+
|
9
|
+
#include "ruby_pcap.h"
|
10
|
+
#include <limits.h>
|
11
|
+
|
12
|
+
#define UDP_HDR(pkt) ((struct udphdr *)LAYER4_HDR(pkt))
|
13
|
+
#define UDP_DATA(pkt) ((u_char *)LAYER5_HDR(pkt))
|
14
|
+
#define UDP_LENGTH(pkt) (ntohs(UDP_HDR(pkt)->uh_ulen))
|
15
|
+
|
16
|
+
VALUE cUDPPacket;
|
17
|
+
|
18
|
+
#define CheckTruncateUdp(pkt, need) \
|
19
|
+
CheckTruncate(pkt, pkt->hdr.layer4_off, need, "truncated UDP")
|
20
|
+
|
21
|
+
VALUE
|
22
|
+
setup_udp_packet(pkt, tl_len)
|
23
|
+
struct packet_object *pkt;
|
24
|
+
int tl_len;
|
25
|
+
{
|
26
|
+
VALUE class;
|
27
|
+
|
28
|
+
DEBUG_PRINT("setup_udp_packet");
|
29
|
+
|
30
|
+
class = cUDPPacket;
|
31
|
+
if (tl_len > 8) {
|
32
|
+
int hl = 8;
|
33
|
+
int layer5_len;
|
34
|
+
|
35
|
+
tl_len = MIN(tl_len, UDP_LENGTH(pkt));
|
36
|
+
layer5_len = tl_len - hl;
|
37
|
+
if (layer5_len > 0) {
|
38
|
+
pkt->hdr.layer5_off = pkt->hdr.layer4_off + hl;
|
39
|
+
/* upper layer */
|
40
|
+
}
|
41
|
+
}
|
42
|
+
return class;
|
43
|
+
}
|
44
|
+
|
45
|
+
#define UDPP_METHOD(func, need, val) \
|
46
|
+
static VALUE\
|
47
|
+
(func)(self)\
|
48
|
+
VALUE self;\
|
49
|
+
{\
|
50
|
+
struct packet_object *pkt;\
|
51
|
+
struct udphdr *udp;\
|
52
|
+
DEBUG_PRINT(#func);\
|
53
|
+
GetPacket(self, pkt);\
|
54
|
+
CheckTruncateUdp(pkt, (need));\
|
55
|
+
udp = UDP_HDR(pkt);\
|
56
|
+
return (val);\
|
57
|
+
}
|
58
|
+
|
59
|
+
UDPP_METHOD(udpp_sport, 2, INT2FIX(ntohs(udp->uh_sport)))
|
60
|
+
UDPP_METHOD(udpp_dport, 4, INT2FIX(ntohs(udp->uh_dport)))
|
61
|
+
UDPP_METHOD(udpp_len, 6, INT2FIX(ntohs(udp->uh_ulen)))
|
62
|
+
UDPP_METHOD(udpp_sum, 8, INT2FIX(ntohs(udp->uh_sum)))
|
63
|
+
|
64
|
+
static VALUE
|
65
|
+
udpp_data(self)
|
66
|
+
VALUE self;
|
67
|
+
{
|
68
|
+
struct packet_object *pkt;
|
69
|
+
int len;
|
70
|
+
|
71
|
+
DEBUG_PRINT("udpp_data");
|
72
|
+
GetPacket(self, pkt);
|
73
|
+
CheckTruncateUdp(pkt, 8);
|
74
|
+
|
75
|
+
if (pkt->hdr.layer5_off == OFF_NONEXIST) return Qnil;
|
76
|
+
|
77
|
+
len = MIN(Caplen(pkt, pkt->hdr.layer5_off), UDP_LENGTH(pkt)-8);
|
78
|
+
return rb_str_new(UDP_DATA(pkt), len);
|
79
|
+
}
|
80
|
+
|
81
|
+
void
|
82
|
+
Init_udp_packet(void)
|
83
|
+
{
|
84
|
+
DEBUG_PRINT("Init_udp_packet");
|
85
|
+
|
86
|
+
/* define class UdpPacket */
|
87
|
+
cUDPPacket = rb_define_class_under(mPcap, "UDPPacket", cIPPacket);
|
88
|
+
|
89
|
+
rb_define_method(cUDPPacket, "udp_sport", udpp_sport, 0);
|
90
|
+
rb_define_method(cUDPPacket, "sport", udpp_sport, 0);
|
91
|
+
rb_define_method(cUDPPacket, "udp_dport", udpp_dport, 0);
|
92
|
+
rb_define_method(cUDPPacket, "dport", udpp_dport, 0);
|
93
|
+
rb_define_method(cUDPPacket, "udp_len", udpp_len, 0);
|
94
|
+
rb_define_method(cUDPPacket, "udp_sum", udpp_sum, 0);
|
95
|
+
rb_define_method(cUDPPacket, "udp_data", udpp_data, 0);
|
96
|
+
}
|
data/lib/pcap_misc.rb
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
|
2
|
+
module Pcap
|
3
|
+
class Packet
|
4
|
+
def to_s
|
5
|
+
'Some packet'
|
6
|
+
end
|
7
|
+
|
8
|
+
def inspect
|
9
|
+
"#<#{self.class}: #{self}>"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class IPPacket
|
14
|
+
def to_s
|
15
|
+
"#{ip_src} > #{ip_dst}"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class TCPPacket
|
20
|
+
def tcp_data_len
|
21
|
+
ip_len - 4 * (ip_hlen + tcp_hlen)
|
22
|
+
end
|
23
|
+
|
24
|
+
def tcp_flags_s
|
25
|
+
return \
|
26
|
+
(tcp_urg? ? 'U' : '.') +
|
27
|
+
(tcp_ack? ? 'A' : '.') +
|
28
|
+
(tcp_psh? ? 'P' : '.') +
|
29
|
+
(tcp_rst? ? 'R' : '.') +
|
30
|
+
(tcp_syn? ? 'S' : '.') +
|
31
|
+
(tcp_fin? ? 'F' : '.')
|
32
|
+
end
|
33
|
+
|
34
|
+
def to_s
|
35
|
+
"#{src}:#{sport} > #{dst}:#{dport} #{tcp_flags_s}"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
class UDPPacket
|
40
|
+
def to_s
|
41
|
+
"#{src}:#{sport} > #{dst}:#{dport} len #{udp_len} sum #{udp_sum}"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
class ICMPPacket
|
46
|
+
def to_s
|
47
|
+
"#{src} > #{dst}: icmp: #{icmp_typestr}"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
#
|
52
|
+
# Backword compatibility
|
53
|
+
#
|
54
|
+
IpPacket = IPPacket
|
55
|
+
IpAddress = IPAddress
|
56
|
+
TcpPacket = TCPPacket
|
57
|
+
UdpPacket = UDPPacket
|
58
|
+
|
59
|
+
# IpAddress is now obsolete.
|
60
|
+
# New class IPAddress is implemented in C.
|
61
|
+
=begin
|
62
|
+
class IpAddress
|
63
|
+
def initialize(a)
|
64
|
+
raise AurgumentError unless a.is_a?(Integer)
|
65
|
+
@addr = a
|
66
|
+
end
|
67
|
+
|
68
|
+
def to_i
|
69
|
+
return @addr
|
70
|
+
end
|
71
|
+
|
72
|
+
def ==(other)
|
73
|
+
@addr == other.to_i
|
74
|
+
end
|
75
|
+
|
76
|
+
alias === ==
|
77
|
+
alias eql? ==
|
78
|
+
|
79
|
+
def to_num_s
|
80
|
+
return ((@addr >> 24) & 0xff).to_s + "." +
|
81
|
+
((@addr >> 16) & 0xff).to_s + "." +
|
82
|
+
((@addr >> 8) & 0xff).to_s + "." +
|
83
|
+
(@addr & 0xff).to_s;
|
84
|
+
end
|
85
|
+
|
86
|
+
def hostname
|
87
|
+
addr = self.to_num_s
|
88
|
+
# "require 'socket'" is here because of the order of
|
89
|
+
# ext initialization in static linked binary
|
90
|
+
require 'socket'
|
91
|
+
begin
|
92
|
+
return Socket.gethostbyname(addr)[0]
|
93
|
+
rescue SocketError
|
94
|
+
return addr
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def to_s
|
99
|
+
if Pcap.convert?
|
100
|
+
return hostname
|
101
|
+
else
|
102
|
+
return to_num_s
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
=end
|
107
|
+
end
|
108
|
+
|
109
|
+
class Time
|
110
|
+
# tcpdump style format
|
111
|
+
def tcpdump
|
112
|
+
sprintf "%0.2d:%0.2d:%0.2d.%0.6d", hour, min, sec, tv_usec
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
autoload :Pcaplet, 'pcaplet'
|