eventmachine 1.0.9.1-java → 1.2.0.1-java
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 +4 -4
- data/CHANGELOG.md +26 -0
- data/README.md +2 -2
- data/ext/cmain.cpp +77 -5
- data/ext/ed.cpp +112 -42
- data/ext/ed.h +27 -13
- data/ext/em.cpp +105 -163
- data/ext/em.h +10 -7
- data/ext/eventmachine.h +13 -1
- data/ext/extconf.rb +23 -14
- data/ext/fastfilereader/extconf.rb +1 -2
- data/ext/fastfilereader/rubymain.cpp +6 -6
- data/ext/project.h +9 -4
- data/ext/rubymain.cpp +155 -36
- data/ext/ssl.cpp +157 -13
- data/ext/ssl.h +7 -2
- data/lib/em/channel.rb +5 -0
- data/lib/em/completion.rb +2 -2
- data/lib/em/connection.rb +61 -3
- data/lib/em/iterator.rb +26 -5
- data/lib/em/pool.rb +1 -1
- data/lib/em/protocols/line_and_text.rb +1 -1
- data/lib/em/pure_ruby.rb +6 -1
- data/lib/em/queue.rb +16 -7
- data/lib/em/resolver.rb +46 -23
- data/lib/em/threaded_resource.rb +2 -2
- data/lib/em/version.rb +1 -1
- data/lib/eventmachine.rb +59 -42
- data/lib/rubyeventmachine.jar +0 -0
- data/rakelib/package.rake +23 -1
- data/tests/dhparam.pem +13 -0
- data/tests/em_test_helper.rb +79 -0
- data/tests/test_basic.rb +17 -26
- data/tests/test_channel.rb +14 -1
- data/tests/test_connection_write.rb +2 -2
- data/tests/test_defer.rb +17 -0
- data/tests/test_epoll.rb +1 -1
- data/tests/test_fork.rb +75 -0
- data/tests/test_ipv4.rb +125 -0
- data/tests/test_ipv6.rb +131 -0
- data/tests/test_iterator.rb +18 -0
- data/tests/test_many_fds.rb +1 -1
- data/tests/test_queue.rb +14 -0
- data/tests/test_resolver.rb +23 -0
- data/tests/test_set_sock_opt.rb +2 -0
- data/tests/test_ssl_dhparam.rb +83 -0
- data/tests/test_ssl_ecdh_curve.rb +79 -0
- data/tests/test_ssl_extensions.rb +49 -0
- data/tests/test_ssl_methods.rb +19 -0
- data/tests/test_ssl_protocols.rb +246 -0
- data/tests/test_ssl_verify.rb +44 -0
- data/tests/test_system.rb +4 -0
- data/tests/test_unbind_reason.rb +5 -1
- metadata +101 -20
- data/.gitignore +0 -21
- data/.travis.yml +0 -22
- data/.yardopts +0 -7
- data/Gemfile +0 -2
- data/Rakefile +0 -20
- data/eventmachine.gemspec +0 -38
- data/rakelib/cpp.rake_example +0 -77
data/ext/em.h
CHANGED
@@ -37,7 +37,7 @@ See the file COPYING for complete licensing information.
|
|
37
37
|
#include <ruby/io.h>
|
38
38
|
#endif
|
39
39
|
|
40
|
-
#if defined(
|
40
|
+
#if defined(HAVE_RB_TRAP_IMMEDIATE)
|
41
41
|
#include <rubysig.h>
|
42
42
|
#elif defined(HAVE_RB_ENABLE_INTERRUPT)
|
43
43
|
extern "C" {
|
@@ -69,7 +69,7 @@ See the file COPYING for complete licensing information.
|
|
69
69
|
#define EmSelect select
|
70
70
|
#endif
|
71
71
|
|
72
|
-
#if !defined(
|
72
|
+
#if !defined(HAVE_TYPE_RB_FDSET_T)
|
73
73
|
#define fd_check(n) (((n) < FD_SETSIZE) ? 1 : 0*fprintf(stderr, "fd %d too large for select\n", (n)))
|
74
74
|
// These definitions are cribbed from include/ruby/intern.h in Ruby 1.9.3,
|
75
75
|
// with this change: any macros that read or write the nth element of an
|
@@ -140,6 +140,7 @@ class EventMachine_t
|
|
140
140
|
bool RunOnce();
|
141
141
|
void Run();
|
142
142
|
void ScheduleHalt();
|
143
|
+
bool Stopping();
|
143
144
|
void SignalLoopBreaker();
|
144
145
|
const uintptr_t InstallOneshotTimer (int);
|
145
146
|
const uintptr_t ConnectToServer (const char *, int, const char *, int);
|
@@ -148,7 +149,7 @@ class EventMachine_t
|
|
148
149
|
const uintptr_t CreateTcpServer (const char *, int);
|
149
150
|
const uintptr_t OpenDatagramSocket (const char *, int);
|
150
151
|
const uintptr_t CreateUnixDomainServer (const char*);
|
151
|
-
const uintptr_t AttachSD (
|
152
|
+
const uintptr_t AttachSD (SOCKET);
|
152
153
|
const uintptr_t OpenKeyboard();
|
153
154
|
//const char *Popen (const char*, const char*);
|
154
155
|
const uintptr_t Socketpair (char* const*);
|
@@ -157,7 +158,7 @@ class EventMachine_t
|
|
157
158
|
void Modify (EventableDescriptor*);
|
158
159
|
void Deregister (EventableDescriptor*);
|
159
160
|
|
160
|
-
const uintptr_t AttachFD (
|
161
|
+
const uintptr_t AttachFD (SOCKET, bool);
|
161
162
|
int DetachFD (EventableDescriptor*);
|
162
163
|
|
163
164
|
void ArmKqueueWriter (EventableDescriptor*);
|
@@ -200,6 +201,8 @@ class EventMachine_t
|
|
200
201
|
|
201
202
|
Poller_t GetPoller() { return Poller; }
|
202
203
|
|
204
|
+
static bool name2address (const char *server, int port, struct sockaddr *addr, size_t *addr_len);
|
205
|
+
|
203
206
|
private:
|
204
207
|
void _RunTimers();
|
205
208
|
void _UpdateTime();
|
@@ -241,8 +244,8 @@ class EventMachine_t
|
|
241
244
|
vector<EventableDescriptor*> NewDescriptors;
|
242
245
|
set<EventableDescriptor*> ModifiedDescriptors;
|
243
246
|
|
244
|
-
|
245
|
-
|
247
|
+
SOCKET LoopBreakerReader;
|
248
|
+
SOCKET LoopBreakerWriter;
|
246
249
|
#ifdef OS_WIN32
|
247
250
|
struct sockaddr_in LoopBreakerTarget;
|
248
251
|
#endif
|
@@ -294,7 +297,7 @@ struct SelectData_t
|
|
294
297
|
int _Select();
|
295
298
|
void _Clear();
|
296
299
|
|
297
|
-
|
300
|
+
SOCKET maxsocket;
|
298
301
|
rb_fdset_t fdreads;
|
299
302
|
rb_fdset_t fdwrites;
|
300
303
|
rb_fdset_t fderrors;
|
data/ext/eventmachine.h
CHANGED
@@ -37,7 +37,14 @@ extern "C" {
|
|
37
37
|
EM_SSL_VERIFY = 109,
|
38
38
|
EM_PROXY_TARGET_UNBOUND = 110,
|
39
39
|
EM_PROXY_COMPLETED = 111
|
40
|
+
};
|
40
41
|
|
42
|
+
enum { // SSL/TLS Protocols
|
43
|
+
EM_PROTO_SSLv2 = 2,
|
44
|
+
EM_PROTO_SSLv3 = 4,
|
45
|
+
EM_PROTO_TLSv1 = 8,
|
46
|
+
EM_PROTO_TLSv1_1 = 16,
|
47
|
+
EM_PROTO_TLSv1_2 = 32
|
41
48
|
};
|
42
49
|
|
43
50
|
void evma_initialize_library (EMCallback);
|
@@ -68,11 +75,15 @@ extern "C" {
|
|
68
75
|
const uintptr_t evma_attach_sd (int sd);
|
69
76
|
const uintptr_t evma_open_datagram_socket (const char *server, int port);
|
70
77
|
const uintptr_t evma_open_keyboard();
|
71
|
-
void evma_set_tls_parms (const uintptr_t binding, const char *privatekey_filename, const char *certchain_filenane, int verify_peer);
|
78
|
+
void evma_set_tls_parms (const uintptr_t binding, const char *privatekey_filename, const char *certchain_filenane, int verify_peer, int fail_if_no_peer_cert, const char *sni_hostname, const char *cipherlist, const char *ecdh_curve, const char *dhparam, int protocols);
|
72
79
|
void evma_start_tls (const uintptr_t binding);
|
73
80
|
|
74
81
|
#ifdef WITH_SSL
|
75
82
|
X509 *evma_get_peer_cert (const uintptr_t binding);
|
83
|
+
int evma_get_cipher_bits (const uintptr_t binding);
|
84
|
+
const char *evma_get_cipher_name (const uintptr_t binding);
|
85
|
+
const char *evma_get_cipher_protocol (const uintptr_t binding);
|
86
|
+
const char *evma_get_sni_hostname (const uintptr_t binding);
|
76
87
|
void evma_accept_ssl_peer (const uintptr_t binding);
|
77
88
|
#endif
|
78
89
|
|
@@ -101,6 +112,7 @@ extern "C" {
|
|
101
112
|
void evma_set_simultaneous_accept_count (int);
|
102
113
|
void evma_setuid_string (const char *username);
|
103
114
|
void evma_stop_machine();
|
115
|
+
bool evma_stopping();
|
104
116
|
float evma_get_heartbeat_interval();
|
105
117
|
int evma_set_heartbeat_interval(float);
|
106
118
|
|
data/ext/extconf.rb
CHANGED
@@ -103,22 +103,27 @@ elsif dir_config_search('OpenSSL', 'ssl', ['/usr/local', '/opt/local', '/usr/loc
|
|
103
103
|
end
|
104
104
|
|
105
105
|
add_define 'BUILD_FOR_RUBY'
|
106
|
-
add_define 'HAVE_RBTRAP' if have_var('rb_trap_immediate', ['ruby.h', 'rubysig.h'])
|
107
|
-
add_define "HAVE_TBR" if have_func('rb_thread_blocking_region')# and have_macro('RUBY_UBF_IO', 'ruby.h')
|
108
|
-
add_define "HAVE_RB_THREAD_CALL_WITHOUT_GVL" if have_header('ruby/thread.h') && have_func('rb_thread_call_without_gvl', 'ruby/thread.h')
|
109
|
-
add_define "HAVE_INOTIFY" if inotify = have_func('inotify_init', 'sys/inotify.h')
|
110
|
-
add_define "HAVE_OLD_INOTIFY" if !inotify && have_macro('__NR_inotify_init', 'sys/syscall.h')
|
111
|
-
add_define 'HAVE_WRITEV' if have_func('writev', 'sys/uio.h')
|
112
|
-
add_define 'HAVE_RB_THREAD_FD_SELECT' if have_func('rb_thread_fd_select')
|
113
|
-
add_define 'HAVE_RB_FDSET_T' if have_type('rb_fdset_t', 'ruby/intern.h')
|
114
|
-
add_define 'HAVE_PIPE2' if have_func('pipe2', 'unistd.h')
|
115
|
-
add_define 'HAVE_ACCEPT4' if have_func('accept4', 'sys/socket.h')
|
116
|
-
add_define 'HAVE_SOCK_CLOEXEC' if have_const('SOCK_CLOEXEC', 'sys/socket.h')
|
117
106
|
|
107
|
+
# Ruby features:
|
108
|
+
|
109
|
+
have_var('rb_trap_immediate', ['ruby.h', 'rubysig.h'])
|
110
|
+
have_func('rb_thread_blocking_region')
|
111
|
+
have_func('rb_thread_call_without_gvl', 'ruby/thread.h')
|
112
|
+
have_func('rb_thread_fd_select')
|
113
|
+
have_type('rb_fdset_t', 'ruby/intern.h')
|
118
114
|
have_func('rb_wait_for_single_fd')
|
119
115
|
have_func('rb_enable_interrupt')
|
120
116
|
have_func('rb_time_new')
|
121
117
|
|
118
|
+
# System features:
|
119
|
+
|
120
|
+
add_define('HAVE_INOTIFY') if inotify = have_func('inotify_init', 'sys/inotify.h')
|
121
|
+
add_define('HAVE_OLD_INOTIFY') if !inotify && have_macro('__NR_inotify_init', 'sys/syscall.h')
|
122
|
+
have_func('writev', 'sys/uio.h')
|
123
|
+
have_func('pipe2', 'unistd.h')
|
124
|
+
have_func('accept4', 'sys/socket.h')
|
125
|
+
have_const('SOCK_CLOEXEC', 'sys/socket.h')
|
126
|
+
|
122
127
|
# Minor platform details between *nix and Windows:
|
123
128
|
|
124
129
|
if RUBY_PLATFORM =~ /(mswin|mingw|bccwin)/
|
@@ -130,7 +135,7 @@ else
|
|
130
135
|
OS_UNIX = true
|
131
136
|
add_define 'OS_UNIX'
|
132
137
|
|
133
|
-
add_define "HAVE_KQUEUE" if have_header("sys/event.h")
|
138
|
+
add_define "HAVE_KQUEUE" if have_header("sys/event.h") && have_header("sys/queue.h")
|
134
139
|
end
|
135
140
|
|
136
141
|
# Adjust number of file descriptors (FD) on Windows
|
@@ -156,13 +161,17 @@ when /mswin32/, /mingw32/, /bccwin32/
|
|
156
161
|
$defs.push "-GR"
|
157
162
|
end
|
158
163
|
|
164
|
+
# Newer versions of Ruby already define _WIN32_WINNT, which is needed
|
165
|
+
# to get access to newer POSIX networking functions (e.g. getaddrinfo)
|
166
|
+
add_define '_WIN32_WINNT=0x0501' unless have_func('getaddrinfo')
|
167
|
+
|
159
168
|
when /solaris/
|
160
169
|
add_define 'OS_SOLARIS8'
|
161
170
|
check_libs(%w[nsl socket], true)
|
162
171
|
|
163
172
|
# If Ruby was compiled for 32-bits, then select() can only handle 1024 fds
|
164
173
|
# There is an alternate function, select_large_fdset, that supports more.
|
165
|
-
|
174
|
+
have_func('select_large_fdset', 'sys/select.h')
|
166
175
|
|
167
176
|
if CONFIG['CC'] == 'cc' && (
|
168
177
|
`cc -flags 2>&1` =~ /Sun/ || # detect SUNWspro compiler
|
@@ -202,7 +211,7 @@ when /linux/
|
|
202
211
|
CONFIG['LDSHARED'] = "$(CXX) -shared"
|
203
212
|
|
204
213
|
when /aix/
|
205
|
-
CONFIG['LDSHARED'] = "$(CXX) -
|
214
|
+
CONFIG['LDSHARED'] = "$(CXX) -Wl,-bstatic -Wl,-bdynamic -Wl,-G -Wl,-brtl"
|
206
215
|
|
207
216
|
when /cygwin/
|
208
217
|
# For rubies built with Cygwin, CXX may be set to CC, which is just
|
@@ -90,8 +90,7 @@ when /linux/
|
|
90
90
|
CONFIG['LDSHARED'] = "$(CXX) -shared"
|
91
91
|
|
92
92
|
when /aix/
|
93
|
-
|
94
|
-
CONFIG['LDSHARED'] = "$(CXX) -shared -Wl,-G"
|
93
|
+
CONFIG['LDSHARED'] = "$(CXX) -Wl,-bstatic -Wl,-bdynamic -Wl,-G -Wl,-brtl"
|
95
94
|
|
96
95
|
when /cygwin/
|
97
96
|
# For rubies built with Cygwin, CXX may be set to CC, which is just
|
@@ -50,7 +50,7 @@ static VALUE mapper_new (VALUE self, VALUE filename)
|
|
50
50
|
{
|
51
51
|
Mapper_t *m = new Mapper_t (StringValueCStr (filename));
|
52
52
|
if (!m)
|
53
|
-
rb_raise (
|
53
|
+
rb_raise (rb_eStandardError, "No Mapper Object");
|
54
54
|
VALUE v = Data_Wrap_Struct (Mapper, 0, mapper_dt, (void*)m);
|
55
55
|
return v;
|
56
56
|
}
|
@@ -65,17 +65,17 @@ static VALUE mapper_get_chunk (VALUE self, VALUE start, VALUE length)
|
|
65
65
|
Mapper_t *m = NULL;
|
66
66
|
Data_Get_Struct (self, Mapper_t, m);
|
67
67
|
if (!m)
|
68
|
-
rb_raise (
|
68
|
+
rb_raise (rb_eStandardError, "No Mapper Object");
|
69
69
|
|
70
70
|
// TODO, what if some moron sends us a negative start value?
|
71
71
|
unsigned _start = NUM2INT (start);
|
72
72
|
unsigned _length = NUM2INT (length);
|
73
73
|
if ((_start + _length) > m->GetFileSize())
|
74
|
-
rb_raise (
|
74
|
+
rb_raise (rb_eStandardError, "Mapper Range Error");
|
75
75
|
|
76
76
|
const char *chunk = m->GetChunk (_start);
|
77
77
|
if (!chunk)
|
78
|
-
rb_raise (
|
78
|
+
rb_raise (rb_eStandardError, "No Mapper Chunk");
|
79
79
|
return rb_str_new (chunk, _length);
|
80
80
|
}
|
81
81
|
|
@@ -88,7 +88,7 @@ static VALUE mapper_close (VALUE self)
|
|
88
88
|
Mapper_t *m = NULL;
|
89
89
|
Data_Get_Struct (self, Mapper_t, m);
|
90
90
|
if (!m)
|
91
|
-
rb_raise (
|
91
|
+
rb_raise (rb_eStandardError, "No Mapper Object");
|
92
92
|
m->Close();
|
93
93
|
return Qnil;
|
94
94
|
}
|
@@ -102,7 +102,7 @@ static VALUE mapper_size (VALUE self)
|
|
102
102
|
Mapper_t *m = NULL;
|
103
103
|
Data_Get_Struct (self, Mapper_t, m);
|
104
104
|
if (!m)
|
105
|
-
rb_raise (
|
105
|
+
rb_raise (rb_eStandardError, "No Mapper Object");
|
106
106
|
return INT2NUM (m->GetFileSize());
|
107
107
|
}
|
108
108
|
|
data/ext/project.h
CHANGED
@@ -22,10 +22,6 @@ See the file COPYING for complete licensing information.
|
|
22
22
|
#define __Project__H_
|
23
23
|
|
24
24
|
|
25
|
-
#ifdef OS_WIN32
|
26
|
-
#pragma warning(disable:4786)
|
27
|
-
#endif
|
28
|
-
|
29
25
|
#include <iostream>
|
30
26
|
#include <map>
|
31
27
|
#include <set>
|
@@ -100,6 +96,15 @@ typedef int SOCKET;
|
|
100
96
|
#include <fcntl.h>
|
101
97
|
#include <assert.h>
|
102
98
|
|
99
|
+
// Older versions of MinGW in the Ruby Dev Kit do not provide the getaddrinfo hint flags
|
100
|
+
#ifndef AI_ADDRCONFIG
|
101
|
+
#define AI_ADDRCONFIG 0x0400
|
102
|
+
#endif
|
103
|
+
|
104
|
+
#ifndef AI_NUMERICSERV
|
105
|
+
#define AI_NUMERICSERV 0x0008
|
106
|
+
#endif
|
107
|
+
|
103
108
|
// Use the Win32 wrapper library that Ruby owns to be able to close sockets with the close() function
|
104
109
|
#define RUBY_EXPORT
|
105
110
|
#include <ruby/defines.h>
|
data/ext/rubymain.cpp
CHANGED
@@ -30,9 +30,19 @@ See the file COPYING for complete licensing information.
|
|
30
30
|
#if SIZEOF_VOIDP == SIZEOF_LONG
|
31
31
|
# define BSIG2NUM(x) (ULONG2NUM((unsigned long)(x)))
|
32
32
|
# define NUM2BSIG(x) (NUM2ULONG(x))
|
33
|
+
# ifdef OS_WIN32
|
34
|
+
# define PRIFBSIG "I32u"
|
35
|
+
# else
|
36
|
+
# define PRIFBSIG "lu"
|
37
|
+
# endif
|
33
38
|
#else
|
34
39
|
# define BSIG2NUM(x) (ULL2NUM((unsigned long long)(x)))
|
35
40
|
# define NUM2BSIG(x) (NUM2ULL(x))
|
41
|
+
# ifdef OS_WIN32
|
42
|
+
# define PRIFBSIG "I64u"
|
43
|
+
# else
|
44
|
+
# define PRIFBSIG "llu"
|
45
|
+
# endif
|
36
46
|
#endif
|
37
47
|
|
38
48
|
/*******
|
@@ -57,6 +67,7 @@ static VALUE Intern_event_callback;
|
|
57
67
|
static VALUE Intern_run_deferred_callbacks;
|
58
68
|
static VALUE Intern_delete;
|
59
69
|
static VALUE Intern_call;
|
70
|
+
static VALUE Intern_at;
|
60
71
|
static VALUE Intern_receive_data;
|
61
72
|
static VALUE Intern_ssl_handshake_completed;
|
62
73
|
static VALUE Intern_ssl_verify_peer;
|
@@ -79,7 +90,7 @@ static inline VALUE ensure_conn(const uintptr_t signature)
|
|
79
90
|
{
|
80
91
|
VALUE conn = rb_hash_aref (EmConnsHash, BSIG2NUM (signature));
|
81
92
|
if (conn == Qnil)
|
82
|
-
rb_raise (EM_eConnectionNotBound, "unknown connection: %
|
93
|
+
rb_raise (EM_eConnectionNotBound, "unknown connection: %" PRIFBSIG, signature);
|
83
94
|
return conn;
|
84
95
|
}
|
85
96
|
|
@@ -100,7 +111,7 @@ static inline void event_callback (struct em_event* e)
|
|
100
111
|
{
|
101
112
|
VALUE conn = rb_hash_aref (EmConnsHash, BSIG2NUM (signature));
|
102
113
|
if (conn == Qnil)
|
103
|
-
rb_raise (EM_eConnectionNotBound, "received %lu bytes of data for unknown signature: %
|
114
|
+
rb_raise (EM_eConnectionNotBound, "received %lu bytes of data for unknown signature: %" PRIFBSIG, data_num, signature);
|
104
115
|
rb_funcall (conn, Intern_receive_data, 1, rb_str_new (data_str, data_num));
|
105
116
|
return;
|
106
117
|
}
|
@@ -330,14 +341,14 @@ static VALUE t_start_tls (VALUE self UNUSED, VALUE signature)
|
|
330
341
|
t_set_tls_parms
|
331
342
|
***************/
|
332
343
|
|
333
|
-
static VALUE t_set_tls_parms (VALUE self UNUSED, VALUE signature, VALUE privkeyfile, VALUE certchainfile, VALUE verify_peer)
|
344
|
+
static VALUE t_set_tls_parms (VALUE self UNUSED, VALUE signature, VALUE privkeyfile, VALUE certchainfile, VALUE verify_peer, VALUE fail_if_no_peer_cert, VALUE snihostname, VALUE cipherlist, VALUE ecdh_curve, VALUE dhparam, VALUE ssl_version)
|
334
345
|
{
|
335
346
|
/* set_tls_parms takes a series of positional arguments for specifying such things
|
336
347
|
* as private keys and certificate chains.
|
337
348
|
* It's expected that the parameter list will grow as we add more supported features.
|
338
349
|
* ALL of these parameters are optional, and can be specified as empty or NULL strings.
|
339
350
|
*/
|
340
|
-
evma_set_tls_parms (NUM2BSIG (signature), StringValueCStr (privkeyfile), StringValueCStr (certchainfile), (verify_peer == Qtrue ? 1 : 0));
|
351
|
+
evma_set_tls_parms (NUM2BSIG (signature), StringValueCStr (privkeyfile), StringValueCStr (certchainfile), (verify_peer == Qtrue ? 1 : 0), (fail_if_no_peer_cert == Qtrue ? 1 : 0), StringValueCStr (snihostname), StringValueCStr (cipherlist), StringValueCStr (ecdh_curve), StringValueCStr (dhparam), NUM2INT (ssl_version));
|
341
352
|
return Qnil;
|
342
353
|
}
|
343
354
|
|
@@ -374,6 +385,85 @@ static VALUE t_get_peer_cert (VALUE self UNUSED, VALUE signature UNUSED)
|
|
374
385
|
}
|
375
386
|
#endif
|
376
387
|
|
388
|
+
/***************
|
389
|
+
t_get_cipher_bits
|
390
|
+
***************/
|
391
|
+
|
392
|
+
#ifdef WITH_SSL
|
393
|
+
static VALUE t_get_cipher_bits (VALUE self UNUSED, VALUE signature)
|
394
|
+
{
|
395
|
+
int bits = evma_get_cipher_bits (NUM2BSIG (signature));
|
396
|
+
if (bits == -1)
|
397
|
+
return Qnil;
|
398
|
+
return INT2NUM (bits);
|
399
|
+
}
|
400
|
+
#else
|
401
|
+
static VALUE t_get_cipher_bits (VALUE self UNUSED, VALUE signature UNUSED)
|
402
|
+
{
|
403
|
+
return Qnil;
|
404
|
+
}
|
405
|
+
#endif
|
406
|
+
|
407
|
+
/***************
|
408
|
+
t_get_cipher_name
|
409
|
+
***************/
|
410
|
+
|
411
|
+
#ifdef WITH_SSL
|
412
|
+
static VALUE t_get_cipher_name (VALUE self UNUSED, VALUE signature)
|
413
|
+
{
|
414
|
+
const char *protocol = evma_get_cipher_name (NUM2BSIG (signature));
|
415
|
+
if (protocol)
|
416
|
+
return rb_str_new2 (protocol);
|
417
|
+
|
418
|
+
return Qnil;
|
419
|
+
}
|
420
|
+
#else
|
421
|
+
static VALUE t_get_cipher_name (VALUE self UNUSED, VALUE signature UNUSED)
|
422
|
+
{
|
423
|
+
return Qnil;
|
424
|
+
}
|
425
|
+
#endif
|
426
|
+
|
427
|
+
/***************
|
428
|
+
t_get_cipher_protocol
|
429
|
+
***************/
|
430
|
+
|
431
|
+
#ifdef WITH_SSL
|
432
|
+
static VALUE t_get_cipher_protocol (VALUE self UNUSED, VALUE signature)
|
433
|
+
{
|
434
|
+
const char *cipher = evma_get_cipher_protocol (NUM2BSIG (signature));
|
435
|
+
if (cipher)
|
436
|
+
return rb_str_new2 (cipher);
|
437
|
+
|
438
|
+
return Qnil;
|
439
|
+
}
|
440
|
+
#else
|
441
|
+
static VALUE t_get_cipher_protocol (VALUE self UNUSED, VALUE signature UNUSED)
|
442
|
+
{
|
443
|
+
return Qnil;
|
444
|
+
}
|
445
|
+
#endif
|
446
|
+
|
447
|
+
/***************
|
448
|
+
t_get_sni_hostname
|
449
|
+
***************/
|
450
|
+
|
451
|
+
#ifdef WITH_SSL
|
452
|
+
static VALUE t_get_sni_hostname (VALUE self UNUSED, VALUE signature)
|
453
|
+
{
|
454
|
+
const char *sni_hostname = evma_get_sni_hostname (NUM2BSIG (signature));
|
455
|
+
if (sni_hostname)
|
456
|
+
return rb_str_new2 (sni_hostname);
|
457
|
+
|
458
|
+
return Qnil;
|
459
|
+
}
|
460
|
+
#else
|
461
|
+
static VALUE t_get_sni_hostname (VALUE self UNUSED, VALUE signature UNUSED)
|
462
|
+
{
|
463
|
+
return Qnil;
|
464
|
+
}
|
465
|
+
#endif
|
466
|
+
|
377
467
|
/**************
|
378
468
|
t_get_peername
|
379
469
|
**************/
|
@@ -442,9 +532,9 @@ static VALUE t_get_subprocess_status (VALUE self UNUSED, VALUE signature)
|
|
442
532
|
rb_iv_set(proc_status, "@pid", INT2FIX(pid));
|
443
533
|
if (WIFEXITED(status)) {
|
444
534
|
rb_iv_set(proc_status, "@status", INT2FIX(WEXITSTATUS(status)));
|
445
|
-
} else if(WIFSIGNALED(status)) {
|
535
|
+
} else if (WIFSIGNALED(status)) {
|
446
536
|
rb_iv_set(proc_status, "@termsig", INT2FIX(WTERMSIG(status)));
|
447
|
-
} else if(WIFSTOPPED(status)){
|
537
|
+
} else if (WIFSTOPPED(status)){
|
448
538
|
rb_iv_set(proc_status, "@stopsig", INT2FIX(WSTOPSIG(status)));
|
449
539
|
}
|
450
540
|
#endif
|
@@ -514,6 +604,8 @@ t_send_datagram
|
|
514
604
|
static VALUE t_send_datagram (VALUE self UNUSED, VALUE signature, VALUE data, VALUE data_length, VALUE address, VALUE port)
|
515
605
|
{
|
516
606
|
int b = evma_send_datagram (NUM2BSIG (signature), StringValuePtr (data), FIX2INT (data_length), StringValueCStr(address), FIX2INT(port));
|
607
|
+
if (b < 0)
|
608
|
+
rb_raise (EM_eConnectionError, "%s", "error in sending datagram"); // FIXME: this could be more specific.
|
517
609
|
return INT2NUM (b);
|
518
610
|
}
|
519
611
|
|
@@ -870,12 +962,11 @@ t_invoke_popen
|
|
870
962
|
|
871
963
|
static VALUE t_invoke_popen (VALUE self UNUSED, VALUE cmd)
|
872
964
|
{
|
873
|
-
|
874
|
-
|
875
|
-
int len = RARRAY_LEN(cmd);
|
876
|
-
#else
|
877
|
-
int len = RARRAY (cmd)->len;
|
965
|
+
#ifdef OS_WIN32
|
966
|
+
rb_raise (EM_eUnsupported, "popen is not available on this platform");
|
878
967
|
#endif
|
968
|
+
|
969
|
+
int len = RARRAY_LEN(cmd);
|
879
970
|
if (len >= 2048)
|
880
971
|
rb_raise (rb_eRuntimeError, "%s", "too many arguments to popen");
|
881
972
|
char *strings [2048];
|
@@ -890,7 +981,7 @@ static VALUE t_invoke_popen (VALUE self UNUSED, VALUE cmd)
|
|
890
981
|
try {
|
891
982
|
f = evma_popen (strings);
|
892
983
|
} catch (std::runtime_error e) {
|
893
|
-
|
984
|
+
rb_raise (rb_eRuntimeError, "%s", e.what());
|
894
985
|
}
|
895
986
|
if (!f) {
|
896
987
|
char *err = strerror (errno);
|
@@ -1061,6 +1152,23 @@ static VALUE t__ssl_p (VALUE self UNUSED)
|
|
1061
1152
|
#endif
|
1062
1153
|
}
|
1063
1154
|
|
1155
|
+
/********
|
1156
|
+
t_stopping
|
1157
|
+
********/
|
1158
|
+
|
1159
|
+
static VALUE t_stopping ()
|
1160
|
+
{
|
1161
|
+
if (evma_stopping())
|
1162
|
+
{
|
1163
|
+
return Qtrue;
|
1164
|
+
}
|
1165
|
+
else
|
1166
|
+
{
|
1167
|
+
return Qfalse;
|
1168
|
+
}
|
1169
|
+
|
1170
|
+
}
|
1171
|
+
|
1064
1172
|
|
1065
1173
|
/****************
|
1066
1174
|
t_send_file_data
|
@@ -1131,20 +1239,17 @@ t_get_loop_time
|
|
1131
1239
|
|
1132
1240
|
static VALUE t_get_loop_time (VALUE self UNUSED)
|
1133
1241
|
{
|
1134
|
-
#ifndef HAVE_RB_TIME_NEW
|
1135
|
-
static VALUE cTime = rb_path2class("Time");
|
1136
|
-
static ID at = rb_intern("at");
|
1137
|
-
#endif
|
1138
|
-
|
1139
1242
|
uint64_t current_time = evma_get_current_loop_time();
|
1140
|
-
if (current_time
|
1141
|
-
|
1142
|
-
|
1143
|
-
|
1243
|
+
if (current_time == 0) {
|
1244
|
+
return Qnil;
|
1245
|
+
}
|
1246
|
+
|
1247
|
+
// Generally the industry has moved to 64-bit time_t, this is just in case we're 32-bit time_t.
|
1248
|
+
if (sizeof(time_t) < 8 && current_time > INT_MAX) {
|
1249
|
+
return rb_funcall(rb_cTime, Intern_at, 2, INT2NUM(current_time / 1000000), INT2NUM(current_time % 1000000));
|
1250
|
+
} else {
|
1144
1251
|
return rb_time_new(current_time / 1000000, current_time % 1000000);
|
1145
|
-
#endif
|
1146
1252
|
}
|
1147
|
-
return Qnil;
|
1148
1253
|
}
|
1149
1254
|
|
1150
1255
|
|
@@ -1259,6 +1364,7 @@ extern "C" void Init_rubyeventmachine()
|
|
1259
1364
|
Intern_run_deferred_callbacks = rb_intern ("run_deferred_callbacks");
|
1260
1365
|
Intern_delete = rb_intern ("delete");
|
1261
1366
|
Intern_call = rb_intern ("call");
|
1367
|
+
Intern_at = rb_intern("at");
|
1262
1368
|
Intern_receive_data = rb_intern ("receive_data");
|
1263
1369
|
Intern_ssl_handshake_completed = rb_intern ("ssl_handshake_completed");
|
1264
1370
|
Intern_ssl_verify_peer = rb_intern ("ssl_verify_peer");
|
@@ -1289,9 +1395,13 @@ extern "C" void Init_rubyeventmachine()
|
|
1289
1395
|
rb_define_module_function (EmModule, "stop_tcp_server", (VALUE(*)(...))t_stop_server, 1);
|
1290
1396
|
rb_define_module_function (EmModule, "start_unix_server", (VALUE(*)(...))t_start_unix_server, 1);
|
1291
1397
|
rb_define_module_function (EmModule, "attach_sd", (VALUE(*)(...))t_attach_sd, 1);
|
1292
|
-
rb_define_module_function (EmModule, "set_tls_parms", (VALUE(*)(...))t_set_tls_parms,
|
1398
|
+
rb_define_module_function (EmModule, "set_tls_parms", (VALUE(*)(...))t_set_tls_parms, 10);
|
1293
1399
|
rb_define_module_function (EmModule, "start_tls", (VALUE(*)(...))t_start_tls, 1);
|
1294
1400
|
rb_define_module_function (EmModule, "get_peer_cert", (VALUE(*)(...))t_get_peer_cert, 1);
|
1401
|
+
rb_define_module_function (EmModule, "get_cipher_bits", (VALUE(*)(...))t_get_cipher_bits, 1);
|
1402
|
+
rb_define_module_function (EmModule, "get_cipher_name", (VALUE(*)(...))t_get_cipher_name, 1);
|
1403
|
+
rb_define_module_function (EmModule, "get_cipher_protocol", (VALUE(*)(...))t_get_cipher_protocol, 1);
|
1404
|
+
rb_define_module_function (EmModule, "get_sni_hostname", (VALUE(*)(...))t_get_sni_hostname, 1);
|
1295
1405
|
rb_define_module_function (EmModule, "send_data", (VALUE(*)(...))t_send_data, 3);
|
1296
1406
|
rb_define_module_function (EmModule, "send_datagram", (VALUE(*)(...))t_send_datagram, 5);
|
1297
1407
|
rb_define_module_function (EmModule, "close_connection", (VALUE(*)(...))t_close_connection, 2);
|
@@ -1365,21 +1475,30 @@ extern "C" void Init_rubyeventmachine()
|
|
1365
1475
|
rb_define_module_function (EmModule, "kqueue?", (VALUE(*)(...))t__kqueue_p, 0);
|
1366
1476
|
|
1367
1477
|
rb_define_module_function (EmModule, "ssl?", (VALUE(*)(...))t__ssl_p, 0);
|
1478
|
+
rb_define_module_function(EmModule, "stopping?",(VALUE(*)(...))t_stopping, 0);
|
1368
1479
|
|
1369
1480
|
rb_define_method (EmConnection, "get_outbound_data_size", (VALUE(*)(...))conn_get_outbound_data_size, 0);
|
1370
1481
|
rb_define_method (EmConnection, "associate_callback_target", (VALUE(*)(...))conn_associate_callback_target, 1);
|
1371
1482
|
|
1372
|
-
|
1373
|
-
rb_define_const (EmModule, "
|
1374
|
-
rb_define_const (EmModule, "
|
1375
|
-
rb_define_const (EmModule, "
|
1376
|
-
rb_define_const (EmModule, "
|
1377
|
-
rb_define_const (EmModule, "
|
1378
|
-
|
1379
|
-
rb_define_const (EmModule, "ConnectionNotifyReadable", INT2NUM(
|
1380
|
-
rb_define_const (EmModule, "ConnectionNotifyWritable", INT2NUM(
|
1381
|
-
|
1382
|
-
|
1383
|
-
|
1483
|
+
// Connection states
|
1484
|
+
rb_define_const (EmModule, "TimerFired", INT2NUM(EM_TIMER_FIRED ));
|
1485
|
+
rb_define_const (EmModule, "ConnectionData", INT2NUM(EM_CONNECTION_READ ));
|
1486
|
+
rb_define_const (EmModule, "ConnectionUnbound", INT2NUM(EM_CONNECTION_UNBOUND ));
|
1487
|
+
rb_define_const (EmModule, "ConnectionAccepted", INT2NUM(EM_CONNECTION_ACCEPTED ));
|
1488
|
+
rb_define_const (EmModule, "ConnectionCompleted", INT2NUM(EM_CONNECTION_COMPLETED ));
|
1489
|
+
rb_define_const (EmModule, "LoopbreakSignalled", INT2NUM(EM_LOOPBREAK_SIGNAL ));
|
1490
|
+
rb_define_const (EmModule, "ConnectionNotifyReadable", INT2NUM(EM_CONNECTION_NOTIFY_READABLE));
|
1491
|
+
rb_define_const (EmModule, "ConnectionNotifyWritable", INT2NUM(EM_CONNECTION_NOTIFY_WRITABLE));
|
1492
|
+
rb_define_const (EmModule, "SslHandshakeCompleted", INT2NUM(EM_SSL_HANDSHAKE_COMPLETED ));
|
1493
|
+
// EM_SSL_VERIFY = 109,
|
1494
|
+
// EM_PROXY_TARGET_UNBOUND = 110,
|
1495
|
+
// EM_PROXY_COMPLETED = 111
|
1496
|
+
|
1497
|
+
// SSL Protocols
|
1498
|
+
rb_define_const (EmModule, "EM_PROTO_SSLv2", INT2NUM(EM_PROTO_SSLv2 ));
|
1499
|
+
rb_define_const (EmModule, "EM_PROTO_SSLv3", INT2NUM(EM_PROTO_SSLv3 ));
|
1500
|
+
rb_define_const (EmModule, "EM_PROTO_TLSv1", INT2NUM(EM_PROTO_TLSv1 ));
|
1501
|
+
rb_define_const (EmModule, "EM_PROTO_TLSv1_1", INT2NUM(EM_PROTO_TLSv1_1));
|
1502
|
+
rb_define_const (EmModule, "EM_PROTO_TLSv1_2", INT2NUM(EM_PROTO_TLSv1_2));
|
1384
1503
|
}
|
1385
1504
|
|