rev 0.2.4 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +20 -0
- data/{README → README.textile} +30 -63
- data/Rakefile +3 -3
- data/ext/libev/Changes +64 -1
- data/ext/libev/LICENSE +1 -1
- data/ext/libev/ev.c +741 -263
- data/ext/libev/ev.h +108 -53
- data/ext/libev/ev_epoll.c +14 -3
- data/ext/libev/ev_kqueue.c +3 -1
- data/ext/libev/ev_poll.c +6 -2
- data/ext/libev/ev_port.c +3 -1
- data/ext/libev/ev_select.c +10 -2
- data/ext/libev/ev_vars.h +34 -11
- data/ext/libev/ev_win32.c +13 -14
- data/ext/libev/ev_wrap.h +44 -16
- data/ext/rev/extconf.rb +5 -5
- data/ext/rev/rev.h +1 -0
- data/ext/rev/rev_ext.c +1 -3
- data/ext/rev/rev_io_watcher.c +0 -2
- data/ext/rev/rev_stat_watcher.c +182 -0
- data/lib/rev.rb +11 -12
- data/lib/rev/dns_resolver.rb +6 -6
- data/lib/rev/http_client.rb +1 -1
- data/lib/rev/io.rb +1 -1
- data/lib/rev/listener.rb +19 -4
- data/lib/rev/server.rb +18 -3
- data/lib/rev/socket.rb +1 -1
- data/lib/rev/ssl.rb +6 -1
- data/lib/revem.rb +16 -1
- data/rev.gemspec +7 -4
- metadata +21 -14
- data/ext/rev/rev_buffer.c +0 -629
data/ext/libev/ev_win32.c
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
/*
|
2
2
|
* libev win32 compatibility cruft (_not_ a backend)
|
3
3
|
*
|
4
|
-
* Copyright (c) 2007,2008 Marc Alexander Lehmann <libev@schmorp.de>
|
4
|
+
* Copyright (c) 2007,2008,2009 Marc Alexander Lehmann <libev@schmorp.de>
|
5
5
|
* All rights reserved.
|
6
6
|
*
|
7
7
|
* Redistribution and use in source and binary forms, with or without modifica-
|
@@ -55,7 +55,7 @@ ev_pipe (int filedes [2])
|
|
55
55
|
struct sockaddr_in addr = { 0 };
|
56
56
|
int addr_size = sizeof (addr);
|
57
57
|
struct sockaddr_in adr2;
|
58
|
-
int adr2_size;
|
58
|
+
int adr2_size = sizeof (adr2);
|
59
59
|
SOCKET listener;
|
60
60
|
SOCKET sock [2] = { -1, -1 };
|
61
61
|
|
@@ -133,22 +133,21 @@ fail:
|
|
133
133
|
|
134
134
|
#undef pipe
|
135
135
|
#define pipe(filedes) ev_pipe (filedes)
|
136
|
-
|
137
|
-
|
138
|
-
|
136
|
+
|
137
|
+
#define EV_HAVE_EV_TIME 1
|
138
|
+
ev_tstamp
|
139
|
+
ev_time (void)
|
139
140
|
{
|
140
|
-
|
141
|
-
|
142
|
-
_ftime (&tb);
|
141
|
+
FILETIME ft;
|
142
|
+
ULARGE_INTEGER ui;
|
143
143
|
|
144
|
-
|
145
|
-
|
144
|
+
GetSystemTimeAsFileTime (&ft);
|
145
|
+
ui.u.LowPart = ft.dwLowDateTime;
|
146
|
+
ui.u.HighPart = ft.dwHighDateTime;
|
146
147
|
|
147
|
-
|
148
|
+
/* msvc cannot convert ulonglong to double... yes, it is that sucky */
|
149
|
+
return (LONGLONG)(ui.QuadPart - 116444736000000000) * 1e-7;
|
148
150
|
}
|
149
151
|
|
150
|
-
#undef gettimeofday
|
151
|
-
#define gettimeofday(tv,tz) ev_gettimeofday (tv, tz)
|
152
|
-
|
153
152
|
#endif
|
154
153
|
|
data/ext/libev/ev_wrap.h
CHANGED
@@ -8,14 +8,23 @@
|
|
8
8
|
#define timeout_blocktime ((loop)->timeout_blocktime)
|
9
9
|
#define backend ((loop)->backend)
|
10
10
|
#define activecnt ((loop)->activecnt)
|
11
|
-
#define
|
11
|
+
#define loop_done ((loop)->loop_done)
|
12
12
|
#define backend_fd ((loop)->backend_fd)
|
13
13
|
#define backend_fudge ((loop)->backend_fudge)
|
14
14
|
#define backend_modify ((loop)->backend_modify)
|
15
15
|
#define backend_poll ((loop)->backend_poll)
|
16
|
+
#define anfds ((loop)->anfds)
|
17
|
+
#define anfdmax ((loop)->anfdmax)
|
18
|
+
#define pendings ((loop)->pendings)
|
19
|
+
#define pendingmax ((loop)->pendingmax)
|
20
|
+
#define pendingcnt ((loop)->pendingcnt)
|
21
|
+
#define pending_w ((loop)->pending_w)
|
22
|
+
#define rfeeds ((loop)->rfeeds)
|
23
|
+
#define rfeedmax ((loop)->rfeedmax)
|
24
|
+
#define rfeedcnt ((loop)->rfeedcnt)
|
16
25
|
#define evfd ((loop)->evfd)
|
17
26
|
#define evpipe ((loop)->evpipe)
|
18
|
-
#define
|
27
|
+
#define pipe_w ((loop)->pipe_w)
|
19
28
|
#define curpid ((loop)->curpid)
|
20
29
|
#define postfork ((loop)->postfork)
|
21
30
|
#define vec_ri ((loop)->vec_ri)
|
@@ -38,11 +47,6 @@
|
|
38
47
|
#define kqueue_eventmax ((loop)->kqueue_eventmax)
|
39
48
|
#define port_events ((loop)->port_events)
|
40
49
|
#define port_eventmax ((loop)->port_eventmax)
|
41
|
-
#define anfds ((loop)->anfds)
|
42
|
-
#define anfdmax ((loop)->anfdmax)
|
43
|
-
#define pendings ((loop)->pendings)
|
44
|
-
#define pendingmax ((loop)->pendingmax)
|
45
|
-
#define pendingcnt ((loop)->pendingcnt)
|
46
50
|
#define fdchanges ((loop)->fdchanges)
|
47
51
|
#define fdchangemax ((loop)->fdchangemax)
|
48
52
|
#define fdchangecnt ((loop)->fdchangecnt)
|
@@ -65,7 +69,7 @@
|
|
65
69
|
#define forks ((loop)->forks)
|
66
70
|
#define forkmax ((loop)->forkmax)
|
67
71
|
#define forkcnt ((loop)->forkcnt)
|
68
|
-
#define
|
72
|
+
#define async_pending ((loop)->async_pending)
|
69
73
|
#define asyncs ((loop)->asyncs)
|
70
74
|
#define asyncmax ((loop)->asyncmax)
|
71
75
|
#define asynccnt ((loop)->asynccnt)
|
@@ -73,6 +77,16 @@
|
|
73
77
|
#define fs_w ((loop)->fs_w)
|
74
78
|
#define fs_2625 ((loop)->fs_2625)
|
75
79
|
#define fs_hash ((loop)->fs_hash)
|
80
|
+
#define sig_pending ((loop)->sig_pending)
|
81
|
+
#define sigfd ((loop)->sigfd)
|
82
|
+
#define sigfd_w ((loop)->sigfd_w)
|
83
|
+
#define sigfd_set ((loop)->sigfd_set)
|
84
|
+
#define loop_count ((loop)->loop_count)
|
85
|
+
#define loop_depth ((loop)->loop_depth)
|
86
|
+
#define userdata ((loop)->userdata)
|
87
|
+
#define release_cb ((loop)->release_cb)
|
88
|
+
#define acquire_cb ((loop)->acquire_cb)
|
89
|
+
#define invoke_cb ((loop)->invoke_cb)
|
76
90
|
#else
|
77
91
|
#undef EV_WRAP_H
|
78
92
|
#undef now_floor
|
@@ -82,14 +96,23 @@
|
|
82
96
|
#undef timeout_blocktime
|
83
97
|
#undef backend
|
84
98
|
#undef activecnt
|
85
|
-
#undef
|
99
|
+
#undef loop_done
|
86
100
|
#undef backend_fd
|
87
101
|
#undef backend_fudge
|
88
102
|
#undef backend_modify
|
89
103
|
#undef backend_poll
|
104
|
+
#undef anfds
|
105
|
+
#undef anfdmax
|
106
|
+
#undef pendings
|
107
|
+
#undef pendingmax
|
108
|
+
#undef pendingcnt
|
109
|
+
#undef pending_w
|
110
|
+
#undef rfeeds
|
111
|
+
#undef rfeedmax
|
112
|
+
#undef rfeedcnt
|
90
113
|
#undef evfd
|
91
114
|
#undef evpipe
|
92
|
-
#undef
|
115
|
+
#undef pipe_w
|
93
116
|
#undef curpid
|
94
117
|
#undef postfork
|
95
118
|
#undef vec_ri
|
@@ -112,11 +135,6 @@
|
|
112
135
|
#undef kqueue_eventmax
|
113
136
|
#undef port_events
|
114
137
|
#undef port_eventmax
|
115
|
-
#undef anfds
|
116
|
-
#undef anfdmax
|
117
|
-
#undef pendings
|
118
|
-
#undef pendingmax
|
119
|
-
#undef pendingcnt
|
120
138
|
#undef fdchanges
|
121
139
|
#undef fdchangemax
|
122
140
|
#undef fdchangecnt
|
@@ -139,7 +157,7 @@
|
|
139
157
|
#undef forks
|
140
158
|
#undef forkmax
|
141
159
|
#undef forkcnt
|
142
|
-
#undef
|
160
|
+
#undef async_pending
|
143
161
|
#undef asyncs
|
144
162
|
#undef asyncmax
|
145
163
|
#undef asynccnt
|
@@ -147,4 +165,14 @@
|
|
147
165
|
#undef fs_w
|
148
166
|
#undef fs_2625
|
149
167
|
#undef fs_hash
|
168
|
+
#undef sig_pending
|
169
|
+
#undef sigfd
|
170
|
+
#undef sigfd_w
|
171
|
+
#undef sigfd_set
|
172
|
+
#undef loop_count
|
173
|
+
#undef loop_depth
|
174
|
+
#undef userdata
|
175
|
+
#undef release_cb
|
176
|
+
#undef acquire_cb
|
177
|
+
#undef invoke_cb
|
150
178
|
#endif
|
data/ext/rev/extconf.rb
CHANGED
@@ -36,7 +36,7 @@ if have_header('port.h')
|
|
36
36
|
$defs << '-DEV_USE_PORT'
|
37
37
|
end
|
38
38
|
|
39
|
-
if have_header('openssl/ssl.h')
|
39
|
+
if have_header('openssl/ssl.h') and RUBY_PLATFORM !~ /mingw|win32/ # win32 and SSL no go currently...needs some help to work
|
40
40
|
$defs << '-DHAVE_OPENSSL_SSL_H'
|
41
41
|
libs << '-lssl -lcrypto'
|
42
42
|
end
|
@@ -60,11 +60,11 @@ $LIBS << ' ' << libs.join(' ')
|
|
60
60
|
dir_config('rev_ext')
|
61
61
|
create_makefile('rev_ext')
|
62
62
|
|
63
|
-
|
64
|
-
|
63
|
+
# win32 needs to link in "just the right order" for some reason or ioctlsocket will be mapped to an [inverted] ruby specific version. See libev mailing list for (not so helpful discussion--true cause I'm not sure, but this overcomes the symptom)
|
64
|
+
if RUBY_PLATFORM =~ /mingw|win32/
|
65
65
|
makefile_contents = File.read 'Makefile'
|
66
|
-
makefile_contents.gsub!('-DHAVE_OPENSSL_SSL_H', '')
|
67
|
-
makefile_contents.gsub! 'LIBS = $(LIBRUBYARG_SHARED)', 'LIBS = -lws2_32 $(LIBRUBYARG_SHARED)' # for some reason has to come first or ioctlsocket will be mapped to an [inverted] ruby specific version
|
68
66
|
|
67
|
+
makefile_contents.gsub! 'LIBS = $(LIBRUBYARG_SHARED)', 'LIBS = -lws2_32 $(LIBRUBYARG_SHARED)'
|
69
68
|
File.open('Makefile', 'w') { |f| f.write makefile_contents }
|
70
69
|
end
|
70
|
+
|
data/ext/rev/rev.h
CHANGED
data/ext/rev/rev_ext.c
CHANGED
@@ -16,14 +16,12 @@ static VALUE mRev = Qnil;
|
|
16
16
|
|
17
17
|
void Init_rev_ext()
|
18
18
|
{
|
19
|
-
ev_set_allocator((void *(*)(void *, long))xrealloc);
|
20
|
-
|
21
19
|
/* Initializers for other modules */
|
22
20
|
Init_rev_loop();
|
23
21
|
Init_rev_watcher();
|
24
22
|
Init_rev_io_watcher();
|
25
23
|
Init_rev_timer_watcher();
|
26
|
-
|
24
|
+
Init_rev_stat_watcher();
|
27
25
|
Init_rev_utils();
|
28
26
|
|
29
27
|
#ifdef HAVE_OPENSSL_SSL_H
|
data/ext/rev/rev_io_watcher.c
CHANGED
@@ -32,8 +32,6 @@ static void Rev_IOWatcher_dispatch_callback(VALUE self, int revents);
|
|
32
32
|
* Rev::IOWatcher monitors Ruby IO objects for readability or writability.
|
33
33
|
* This allows your application to block while the kernel is writing out
|
34
34
|
* data and fill the read or write buffer whenever there is space available.
|
35
|
-
* It's used by the Rev::BufferedIO class to provide high performace I/O
|
36
|
-
* which is bound by the kernel's ability to read and write data.
|
37
35
|
*/
|
38
36
|
void Init_rev_io_watcher()
|
39
37
|
{
|
@@ -0,0 +1,182 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (C) 2009 Tony Arcieri
|
3
|
+
* You may redistribute this under the terms of the Ruby license.
|
4
|
+
* See LICENSE for details
|
5
|
+
*/
|
6
|
+
|
7
|
+
#include "ruby.h"
|
8
|
+
|
9
|
+
#include "ev_wrap.h"
|
10
|
+
|
11
|
+
#include "rev.h"
|
12
|
+
#include "rev_watcher.h"
|
13
|
+
|
14
|
+
static VALUE mRev = Qnil;
|
15
|
+
static VALUE cRev_Watcher = Qnil;
|
16
|
+
static VALUE cRev_StatWatcher = Qnil;
|
17
|
+
static VALUE cRev_Loop = Qnil;
|
18
|
+
|
19
|
+
static VALUE Rev_StatWatcher_initialize(VALUE self, VALUE path);
|
20
|
+
static VALUE Rev_StatWatcher_attach(VALUE self, VALUE loop);
|
21
|
+
static VALUE Rev_StatWatcher_detach(VALUE self);
|
22
|
+
static VALUE Rev_StatWatcher_enable(VALUE self);
|
23
|
+
static VALUE Rev_StatWatcher_disable(VALUE self);
|
24
|
+
static VALUE Rev_StatWatcher_on_change(VALUE self);
|
25
|
+
static VALUE Rev_StatWatcher_path(VALUE self);
|
26
|
+
|
27
|
+
static void Rev_StatWatcher_libev_callback(struct ev_loop *ev_loop, struct ev_stat *stat, int revents);
|
28
|
+
static void Rev_StatWatcher_dispatch_callback(VALUE self, int revents);
|
29
|
+
|
30
|
+
/*
|
31
|
+
* Rev::StatWatcher lets you create either one-shot or periodic stats which
|
32
|
+
* run within Rev's event loop. It's useful for creating timeouts or
|
33
|
+
* events which fire periodically.
|
34
|
+
*/
|
35
|
+
void Init_rev_stat_watcher()
|
36
|
+
{
|
37
|
+
mRev = rb_define_module("Rev");
|
38
|
+
cRev_Watcher = rb_define_class_under(mRev, "Watcher", rb_cObject);
|
39
|
+
cRev_StatWatcher = rb_define_class_under(mRev, "StatWatcher", cRev_Watcher);
|
40
|
+
cRev_Loop = rb_define_class_under(mRev, "Loop", rb_cObject);
|
41
|
+
|
42
|
+
rb_define_method(cRev_StatWatcher, "initialize", Rev_StatWatcher_initialize, 1);
|
43
|
+
rb_define_method(cRev_StatWatcher, "attach", Rev_StatWatcher_attach, 1);
|
44
|
+
rb_define_method(cRev_StatWatcher, "detach", Rev_StatWatcher_detach, 0);
|
45
|
+
rb_define_method(cRev_StatWatcher, "enable", Rev_StatWatcher_enable, 0);
|
46
|
+
rb_define_method(cRev_StatWatcher, "disable", Rev_StatWatcher_disable, 0);
|
47
|
+
rb_define_method(cRev_StatWatcher, "on_change", Rev_StatWatcher_on_change, 0);
|
48
|
+
rb_define_method(cRev_StatWatcher, "path", Rev_StatWatcher_path, 0);
|
49
|
+
}
|
50
|
+
|
51
|
+
/**
|
52
|
+
* call-seq:
|
53
|
+
* Rev::StatWatcher.initialize(path) -> Rev::StatWatcher
|
54
|
+
*
|
55
|
+
* Create a new Rev::StatWatcher for the given path. This will monitor the
|
56
|
+
* given path for changes at the filesystem level.
|
57
|
+
*/
|
58
|
+
static VALUE Rev_StatWatcher_initialize(VALUE self, VALUE path)
|
59
|
+
{
|
60
|
+
struct Rev_Watcher *watcher_data;
|
61
|
+
|
62
|
+
path = rb_String(path);
|
63
|
+
rb_iv_set(self, "@path", path);
|
64
|
+
|
65
|
+
Data_Get_Struct(self, struct Rev_Watcher, watcher_data);
|
66
|
+
|
67
|
+
watcher_data->dispatch_callback = Rev_StatWatcher_dispatch_callback;
|
68
|
+
ev_stat_init(
|
69
|
+
&watcher_data->event_types.ev_stat,
|
70
|
+
Rev_StatWatcher_libev_callback,
|
71
|
+
RSTRING_PTR(path),
|
72
|
+
0
|
73
|
+
);
|
74
|
+
watcher_data->event_types.ev_stat.data = (void *)self;
|
75
|
+
|
76
|
+
return Qnil;
|
77
|
+
}
|
78
|
+
|
79
|
+
/**
|
80
|
+
* call-seq:
|
81
|
+
* Rev::StatWatcher.attach(loop) -> Rev::StatWatcher
|
82
|
+
*
|
83
|
+
* Attach the stat watcher to the given Rev::Loop. If the watcher is already
|
84
|
+
* attached to a loop, detach it from the old one and attach it to the new one.
|
85
|
+
*/
|
86
|
+
static VALUE Rev_StatWatcher_attach(VALUE self, VALUE loop)
|
87
|
+
{
|
88
|
+
ev_tstamp interval, timeout;
|
89
|
+
struct Rev_Loop *loop_data;
|
90
|
+
struct Rev_Watcher *watcher_data;
|
91
|
+
|
92
|
+
if(!rb_obj_is_kind_of(loop, cRev_Loop))
|
93
|
+
rb_raise(rb_eArgError, "expected loop to be an instance of Rev::Loop");
|
94
|
+
|
95
|
+
Data_Get_Struct(loop, struct Rev_Loop, loop_data);
|
96
|
+
Data_Get_Struct(self, struct Rev_Watcher, watcher_data);
|
97
|
+
|
98
|
+
if(watcher_data->loop != Qnil)
|
99
|
+
Rev_StatWatcher_detach(self);
|
100
|
+
|
101
|
+
watcher_data->loop = loop;
|
102
|
+
|
103
|
+
ev_stat_start(loop_data->ev_loop, &watcher_data->event_types.ev_stat);
|
104
|
+
rb_call_super(1, &loop);
|
105
|
+
|
106
|
+
return self;
|
107
|
+
}
|
108
|
+
|
109
|
+
/**
|
110
|
+
* call-seq:
|
111
|
+
* Rev::StatWatcher.detach -> Rev::StatWatcher
|
112
|
+
*
|
113
|
+
* Detach the stat watcher from its current Rev::Loop.
|
114
|
+
*/
|
115
|
+
static VALUE Rev_StatWatcher_detach(VALUE self)
|
116
|
+
{
|
117
|
+
Watcher_Detach(stat, self);
|
118
|
+
|
119
|
+
return self;
|
120
|
+
}
|
121
|
+
|
122
|
+
/**
|
123
|
+
* call-seq:
|
124
|
+
* Rev::StatWatcher.enable -> Rev::StatWatcher
|
125
|
+
*
|
126
|
+
* Re-enable a stat watcher which has been temporarily disabled. See the
|
127
|
+
* disable method for a more thorough explanation.
|
128
|
+
*/
|
129
|
+
static VALUE Rev_StatWatcher_enable(VALUE self)
|
130
|
+
{
|
131
|
+
Watcher_Enable(stat, self);
|
132
|
+
|
133
|
+
return self;
|
134
|
+
}
|
135
|
+
|
136
|
+
/**
|
137
|
+
* call-seq:
|
138
|
+
* Rev::StatWatcher.disable -> Rev::StatWatcher
|
139
|
+
*
|
140
|
+
* Temporarily disable a stat watcher which is attached to a loop.
|
141
|
+
* This is useful if you wish to toggle event monitoring on and off.
|
142
|
+
*/
|
143
|
+
static VALUE Rev_StatWatcher_disable(VALUE self)
|
144
|
+
{
|
145
|
+
Watcher_Disable(stat, self);
|
146
|
+
|
147
|
+
return self;
|
148
|
+
}
|
149
|
+
|
150
|
+
/**
|
151
|
+
* call-seq:
|
152
|
+
* Rev::StatWatcher#on_change -> nil
|
153
|
+
*
|
154
|
+
* Called whenever the status of the given path changes
|
155
|
+
*/
|
156
|
+
static VALUE Rev_StatWatcher_on_change(VALUE self)
|
157
|
+
{
|
158
|
+
return Qnil;
|
159
|
+
}
|
160
|
+
|
161
|
+
/**
|
162
|
+
* call-seq:
|
163
|
+
* Rev::StatWatcher#path -> String
|
164
|
+
*
|
165
|
+
* Retrieve the path associated with this StatWatcher
|
166
|
+
*/
|
167
|
+
static VALUE Rev_StatWatcher_path(VALUE self)
|
168
|
+
{
|
169
|
+
return rb_iv_get(self, "@path");
|
170
|
+
}
|
171
|
+
|
172
|
+
/* libev callback */
|
173
|
+
static void Rev_StatWatcher_libev_callback(struct ev_loop *ev_loop, struct ev_stat *stat, int revents)
|
174
|
+
{
|
175
|
+
Rev_Loop_process_event((VALUE)stat->data, revents);
|
176
|
+
}
|
177
|
+
|
178
|
+
/* Rev::Loop dispatch callback */
|
179
|
+
static void Rev_StatWatcher_dispatch_callback(VALUE self, int revents)
|
180
|
+
{
|
181
|
+
rb_funcall(self, rb_intern("on_change"), 0, 0);
|
182
|
+
}
|
data/lib/rev.rb
CHANGED
@@ -10,18 +10,17 @@ begin
|
|
10
10
|
rescue LoadError
|
11
11
|
end
|
12
12
|
|
13
|
-
|
14
|
-
require
|
15
|
-
require
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
require File.dirname(__FILE__) +
|
23
|
-
|
24
|
-
require File.dirname(__FILE__) + '/rev/http_client'
|
13
|
+
# Pull in iobuffer gem
|
14
|
+
require 'rubygems'
|
15
|
+
require 'iobuffer'
|
16
|
+
|
17
|
+
%w(
|
18
|
+
/rev_ext /rev/loop /rev/meta /rev/io_watcher /rev/timer_watcher
|
19
|
+
/rev/async_watcher /rev/listener /rev/io /rev/dns_resolver
|
20
|
+
/rev/socket /rev/server /rev/http_client
|
21
|
+
).each do |file|
|
22
|
+
require File.dirname(__FILE__) + file
|
23
|
+
end
|
25
24
|
|
26
25
|
module Rev
|
27
26
|
Rev::VERSION = '0.2.3' unless defined? Rev::VERSION
|
data/lib/rev/dns_resolver.rb
CHANGED
@@ -24,8 +24,8 @@ module Rev
|
|
24
24
|
# automatically detach themselves from the event loop and cannot be used
|
25
25
|
# again.
|
26
26
|
class DNSResolver < IOWatcher
|
27
|
-
|
28
|
-
|
27
|
+
#--
|
28
|
+
# TODO check if it's caching right
|
29
29
|
RESOLV_CONF = '/etc/resolv.conf'
|
30
30
|
HOSTS = '/etc/hosts'
|
31
31
|
DNS_PORT = 53
|
@@ -89,7 +89,7 @@ module Rev
|
|
89
89
|
|
90
90
|
# Called if we don't receive a response, defaults to calling on_failure
|
91
91
|
def on_timeout
|
92
|
-
|
92
|
+
on_failure
|
93
93
|
end
|
94
94
|
|
95
95
|
#########
|
@@ -102,9 +102,8 @@ module Rev
|
|
102
102
|
@nameservers << nameserver # rotate them
|
103
103
|
@socket.connect @nameservers.first, DNS_PORT
|
104
104
|
begin
|
105
|
-
|
105
|
+
@socket.send request_message, 0
|
106
106
|
rescue Errno::EHOSTUNREACH # TODO figure out why it has to be wrapper here, when the other wrapper should be wrapping this one!
|
107
|
-
|
108
107
|
end
|
109
108
|
end
|
110
109
|
|
@@ -112,9 +111,10 @@ module Rev
|
|
112
111
|
def on_readable
|
113
112
|
datagram = nil
|
114
113
|
begin
|
115
|
-
|
114
|
+
datagram = @socket.recvfrom_nonblock(DATAGRAM_SIZE).first
|
116
115
|
rescue Errno::ECONNREFUSED
|
117
116
|
end
|
117
|
+
|
118
118
|
address = response_address datagram rescue nil
|
119
119
|
address ? on_success(address) : on_failure
|
120
120
|
detach
|