eventmachine 0.12.6-java
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +13 -0
- data/Rakefile +262 -0
- data/docs/COPYING +60 -0
- data/docs/ChangeLog +211 -0
- data/docs/DEFERRABLES +138 -0
- data/docs/EPOLL +141 -0
- data/docs/GNU +281 -0
- data/docs/INSTALL +15 -0
- data/docs/KEYBOARD +38 -0
- data/docs/LEGAL +25 -0
- data/docs/LIGHTWEIGHT_CONCURRENCY +72 -0
- data/docs/PURE_RUBY +77 -0
- data/docs/README +74 -0
- data/docs/RELEASE_NOTES +96 -0
- data/docs/SMTP +9 -0
- data/docs/SPAWNED_PROCESSES +93 -0
- data/docs/TODO +10 -0
- data/eventmachine.gemspec +32 -0
- data/ext/binder.cpp +126 -0
- data/ext/binder.h +48 -0
- data/ext/cmain.cpp +586 -0
- data/ext/cplusplus.cpp +193 -0
- data/ext/ed.cpp +1522 -0
- data/ext/ed.h +380 -0
- data/ext/em.cpp +1937 -0
- data/ext/em.h +186 -0
- data/ext/emwin.cpp +300 -0
- data/ext/emwin.h +94 -0
- data/ext/epoll.cpp +26 -0
- data/ext/epoll.h +25 -0
- data/ext/eventmachine.h +98 -0
- data/ext/eventmachine_cpp.h +95 -0
- data/ext/extconf.rb +129 -0
- data/ext/fastfilereader/extconf.rb +77 -0
- data/ext/fastfilereader/mapper.cpp +214 -0
- data/ext/fastfilereader/mapper.h +59 -0
- data/ext/fastfilereader/rubymain.cpp +127 -0
- data/ext/files.cpp +94 -0
- data/ext/files.h +65 -0
- data/ext/kb.cpp +82 -0
- data/ext/page.cpp +107 -0
- data/ext/page.h +51 -0
- data/ext/pipe.cpp +351 -0
- data/ext/project.h +119 -0
- data/ext/rubymain.cpp +847 -0
- data/ext/sigs.cpp +89 -0
- data/ext/sigs.h +32 -0
- data/ext/ssl.cpp +423 -0
- data/ext/ssl.h +90 -0
- data/java/.classpath +8 -0
- data/java/.project +17 -0
- data/java/src/com/rubyeventmachine/Application.java +196 -0
- data/java/src/com/rubyeventmachine/Connection.java +74 -0
- data/java/src/com/rubyeventmachine/ConnectionFactory.java +37 -0
- data/java/src/com/rubyeventmachine/DefaultConnectionFactory.java +46 -0
- data/java/src/com/rubyeventmachine/EmReactor.java +408 -0
- data/java/src/com/rubyeventmachine/EmReactorException.java +40 -0
- data/java/src/com/rubyeventmachine/EventableChannel.java +57 -0
- data/java/src/com/rubyeventmachine/EventableDatagramChannel.java +171 -0
- data/java/src/com/rubyeventmachine/EventableSocketChannel.java +244 -0
- data/java/src/com/rubyeventmachine/PeriodicTimer.java +38 -0
- data/java/src/com/rubyeventmachine/Timer.java +54 -0
- data/java/src/com/rubyeventmachine/tests/ApplicationTest.java +108 -0
- data/java/src/com/rubyeventmachine/tests/ConnectTest.java +124 -0
- data/java/src/com/rubyeventmachine/tests/EMTest.java +80 -0
- data/java/src/com/rubyeventmachine/tests/TestDatagrams.java +53 -0
- data/java/src/com/rubyeventmachine/tests/TestServers.java +74 -0
- data/java/src/com/rubyeventmachine/tests/TestTimers.java +89 -0
- data/lib/em/deferrable.rb +208 -0
- data/lib/em/eventable.rb +39 -0
- data/lib/em/future.rb +62 -0
- data/lib/em/messages.rb +66 -0
- data/lib/em/processes.rb +113 -0
- data/lib/em/spawnable.rb +88 -0
- data/lib/em/streamer.rb +112 -0
- data/lib/eventmachine.rb +1926 -0
- data/lib/eventmachine_version.rb +31 -0
- data/lib/evma.rb +32 -0
- data/lib/evma/callback.rb +32 -0
- data/lib/evma/container.rb +75 -0
- data/lib/evma/factory.rb +77 -0
- data/lib/evma/protocol.rb +87 -0
- data/lib/evma/reactor.rb +48 -0
- data/lib/jeventmachine.rb +137 -0
- data/lib/pr_eventmachine.rb +1011 -0
- data/lib/protocols/buftok.rb +127 -0
- data/lib/protocols/header_and_content.rb +129 -0
- data/lib/protocols/httpcli2.rb +803 -0
- data/lib/protocols/httpclient.rb +270 -0
- data/lib/protocols/line_and_text.rb +126 -0
- data/lib/protocols/linetext2.rb +161 -0
- data/lib/protocols/memcache.rb +293 -0
- data/lib/protocols/postgres.rb +261 -0
- data/lib/protocols/saslauth.rb +179 -0
- data/lib/protocols/smtpclient.rb +308 -0
- data/lib/protocols/smtpserver.rb +556 -0
- data/lib/protocols/stomp.rb +153 -0
- data/lib/protocols/tcptest.rb +57 -0
- data/setup.rb +1585 -0
- data/tasks/cpp.rake +77 -0
- data/tasks/project.rake +78 -0
- data/tasks/tests.rake +193 -0
- data/tests/test_attach.rb +83 -0
- data/tests/test_basic.rb +231 -0
- data/tests/test_connection_count.rb +45 -0
- data/tests/test_defer.rb +47 -0
- data/tests/test_epoll.rb +163 -0
- data/tests/test_error_handler.rb +35 -0
- data/tests/test_errors.rb +82 -0
- data/tests/test_eventables.rb +77 -0
- data/tests/test_exc.rb +58 -0
- data/tests/test_futures.rb +214 -0
- data/tests/test_handler_check.rb +37 -0
- data/tests/test_hc.rb +218 -0
- data/tests/test_httpclient.rb +215 -0
- data/tests/test_httpclient2.rb +155 -0
- data/tests/test_kb.rb +61 -0
- data/tests/test_ltp.rb +188 -0
- data/tests/test_ltp2.rb +320 -0
- data/tests/test_next_tick.rb +109 -0
- data/tests/test_processes.rb +95 -0
- data/tests/test_pure.rb +129 -0
- data/tests/test_running.rb +47 -0
- data/tests/test_sasl.rb +74 -0
- data/tests/test_send_file.rb +243 -0
- data/tests/test_servers.rb +80 -0
- data/tests/test_smtpclient.rb +83 -0
- data/tests/test_smtpserver.rb +93 -0
- data/tests/test_spawn.rb +329 -0
- data/tests/test_ssl_args.rb +68 -0
- data/tests/test_ssl_methods.rb +50 -0
- data/tests/test_timers.rb +148 -0
- data/tests/test_ud.rb +43 -0
- data/tests/testem.rb +31 -0
- data/web/whatis +7 -0
- metadata +214 -0
data/docs/TODO
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
$Id$
|
2
|
+
|
3
|
+
TODO List:
|
4
|
+
|
5
|
+
12Aug06: Noticed by Don Stocks. A TCP connect-request that results
|
6
|
+
in a failed DNS resolution fires a fatal error back to user code.
|
7
|
+
Uuuuuugly. We should probably cause an unbind event to get fired
|
8
|
+
instead, and add some parameterization so the caller can detect
|
9
|
+
the nature of the failure.
|
10
|
+
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{eventmachine}
|
5
|
+
s.version = "0.12.6"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Francis Cianfrocca"]
|
9
|
+
s.date = %q{2009-03-07}
|
10
|
+
s.description = %q{EventMachine implements a fast, single-threaded engine for arbitrary network communications. It's extremely easy to use in Ruby. EventMachine wraps all interactions with IP sockets, allowing programs to concentrate on the implementation of network protocols. It can be used to create both network servers and clients. To create a server or client, a Ruby program only needs to specify the IP address and port, and provide a Module that implements the communications protocol. Implementations of several standard network protocols are provided with the package, primarily to serve as examples. The real goal of EventMachine is to enable programs to easily interface with other programs using TCP/IP, especially if custom protocols are required.}
|
11
|
+
s.email = %q{garbagecat10@gmail.com}
|
12
|
+
s.extensions = ["ext/extconf.rb", "ext/fastfilereader/extconf.rb"]
|
13
|
+
s.extra_rdoc_files = ["docs/ChangeLog", "docs/COPYING", "docs/DEFERRABLES", "docs/EPOLL", "docs/GNU", "docs/INSTALL", "docs/KEYBOARD", "docs/LEGAL", "docs/LIGHTWEIGHT_CONCURRENCY", "docs/PURE_RUBY", "docs/README", "docs/RELEASE_NOTES", "docs/SMTP", "docs/SPAWNED_PROCESSES", "docs/TODO"]
|
14
|
+
s.files = [".gitignore", "Rakefile", "docs/COPYING", "docs/ChangeLog", "docs/DEFERRABLES", "docs/EPOLL", "docs/GNU", "docs/INSTALL", "docs/KEYBOARD", "docs/LEGAL", "docs/LIGHTWEIGHT_CONCURRENCY", "docs/PURE_RUBY", "docs/README", "docs/RELEASE_NOTES", "docs/SMTP", "docs/SPAWNED_PROCESSES", "docs/TODO", "eventmachine.gemspec", "ext/binder.cpp", "ext/binder.h", "ext/cmain.cpp", "ext/cplusplus.cpp", "ext/ed.cpp", "ext/ed.h", "ext/em.cpp", "ext/em.h", "ext/emwin.cpp", "ext/emwin.h", "ext/epoll.cpp", "ext/epoll.h", "ext/eventmachine.h", "ext/eventmachine_cpp.h", "ext/extconf.rb", "ext/fastfilereader/extconf.rb", "ext/fastfilereader/mapper.cpp", "ext/fastfilereader/mapper.h", "ext/fastfilereader/rubymain.cpp", "ext/files.cpp", "ext/files.h", "ext/kb.cpp", "ext/page.cpp", "ext/page.h", "ext/pipe.cpp", "ext/project.h", "ext/rubymain.cpp", "ext/sigs.cpp", "ext/sigs.h", "ext/ssl.cpp", "ext/ssl.h", "java/.classpath", "java/.project", "java/src/com/rubyeventmachine/Application.java", "java/src/com/rubyeventmachine/Connection.java", "java/src/com/rubyeventmachine/ConnectionFactory.java", "java/src/com/rubyeventmachine/DefaultConnectionFactory.java", "java/src/com/rubyeventmachine/EmReactor.java", "java/src/com/rubyeventmachine/EmReactorException.java", "java/src/com/rubyeventmachine/EventableChannel.java", "java/src/com/rubyeventmachine/EventableDatagramChannel.java", "java/src/com/rubyeventmachine/EventableSocketChannel.java", "java/src/com/rubyeventmachine/PeriodicTimer.java", "java/src/com/rubyeventmachine/Timer.java", "java/src/com/rubyeventmachine/tests/ApplicationTest.java", "java/src/com/rubyeventmachine/tests/ConnectTest.java", "java/src/com/rubyeventmachine/tests/EMTest.java", "java/src/com/rubyeventmachine/tests/TestDatagrams.java", "java/src/com/rubyeventmachine/tests/TestServers.java", "java/src/com/rubyeventmachine/tests/TestTimers.java", "lib/em/deferrable.rb", "lib/em/eventable.rb", "lib/em/future.rb", "lib/em/messages.rb", "lib/em/processes.rb", "lib/em/spawnable.rb", "lib/em/streamer.rb", "lib/eventmachine.rb", "lib/eventmachine_version.rb", "lib/evma.rb", "lib/evma/callback.rb", "lib/evma/container.rb", "lib/evma/factory.rb", "lib/evma/protocol.rb", "lib/evma/reactor.rb", "lib/jeventmachine.rb", "lib/pr_eventmachine.rb", "lib/protocols/buftok.rb", "lib/protocols/header_and_content.rb", "lib/protocols/httpcli2.rb", "lib/protocols/httpclient.rb", "lib/protocols/line_and_text.rb", "lib/protocols/linetext2.rb", "lib/protocols/memcache.rb", "lib/protocols/postgres.rb", "lib/protocols/saslauth.rb", "lib/protocols/smtpclient.rb", "lib/protocols/smtpserver.rb", "lib/protocols/stomp.rb", "lib/protocols/tcptest.rb", "setup.rb", "tasks/cpp.rake", "tasks/project.rake", "tasks/tests.rake", "tests/test_attach.rb", "tests/test_basic.rb", "tests/test_connection_count.rb", "tests/test_defer.rb", "tests/test_epoll.rb", "tests/test_error_handler.rb", "tests/test_errors.rb", "tests/test_eventables.rb", "tests/test_exc.rb", "tests/test_futures.rb", "tests/test_handler_check.rb", "tests/test_hc.rb", "tests/test_httpclient.rb", "tests/test_httpclient2.rb", "tests/test_kb.rb", "tests/test_ltp.rb", "tests/test_ltp2.rb", "tests/test_next_tick.rb", "tests/test_processes.rb", "tests/test_pure.rb", "tests/test_running.rb", "tests/test_sasl.rb", "tests/test_send_file.rb", "tests/test_servers.rb", "tests/test_smtpclient.rb", "tests/test_smtpserver.rb", "tests/test_spawn.rb", "tests/test_ssl_args.rb", "tests/test_ssl_methods.rb", "tests/test_timers.rb", "tests/test_ud.rb", "tests/testem.rb", "web/whatis"]
|
15
|
+
s.has_rdoc = true
|
16
|
+
s.homepage = %q{http://rubyeventmachine.com}
|
17
|
+
s.rdoc_options = ["--title", "EventMachine", "--main", "docs/README", "--line-numbers"]
|
18
|
+
s.require_paths = ["lib"]
|
19
|
+
s.rubyforge_project = %q{eventmachine}
|
20
|
+
s.rubygems_version = %q{1.3.1}
|
21
|
+
s.summary = %q{Ruby/EventMachine library}
|
22
|
+
|
23
|
+
if s.respond_to? :specification_version then
|
24
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
25
|
+
s.specification_version = 2
|
26
|
+
|
27
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
28
|
+
else
|
29
|
+
end
|
30
|
+
else
|
31
|
+
end
|
32
|
+
end
|
data/ext/binder.cpp
ADDED
@@ -0,0 +1,126 @@
|
|
1
|
+
/*****************************************************************************
|
2
|
+
|
3
|
+
$Id$
|
4
|
+
|
5
|
+
File: binder.cpp
|
6
|
+
Date: 07Apr06
|
7
|
+
|
8
|
+
Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
|
9
|
+
Gmail: blackhedd
|
10
|
+
|
11
|
+
This program is free software; you can redistribute it and/or modify
|
12
|
+
it under the terms of either: 1) the GNU General Public License
|
13
|
+
as published by the Free Software Foundation; either version 2 of the
|
14
|
+
License, or (at your option) any later version; or 2) Ruby's License.
|
15
|
+
|
16
|
+
See the file COPYING for complete licensing information.
|
17
|
+
|
18
|
+
*****************************************************************************/
|
19
|
+
|
20
|
+
#include "project.h"
|
21
|
+
|
22
|
+
#define DEV_URANDOM "/dev/urandom"
|
23
|
+
|
24
|
+
|
25
|
+
map<string, Bindable_t*> Bindable_t::BindingBag;
|
26
|
+
|
27
|
+
|
28
|
+
/********************************
|
29
|
+
STATIC Bindable_t::CreateBinding
|
30
|
+
********************************/
|
31
|
+
|
32
|
+
string Bindable_t::CreateBinding()
|
33
|
+
{
|
34
|
+
static int index = 0;
|
35
|
+
static string seed;
|
36
|
+
|
37
|
+
if ((index >= 1000000) || (seed.length() == 0)) {
|
38
|
+
#ifdef OS_UNIX
|
39
|
+
int fd = open (DEV_URANDOM, O_RDONLY);
|
40
|
+
if (fd < 0)
|
41
|
+
throw std::runtime_error ("No entropy device");
|
42
|
+
|
43
|
+
unsigned char u[16];
|
44
|
+
size_t r = read (fd, u, sizeof(u));
|
45
|
+
if (r < sizeof(u))
|
46
|
+
throw std::runtime_error ("Unable to read entropy device");
|
47
|
+
|
48
|
+
unsigned char *u1 = (unsigned char*)u;
|
49
|
+
char u2 [sizeof(u) * 2 + 1];
|
50
|
+
|
51
|
+
for (size_t i=0; i < sizeof(u); i++)
|
52
|
+
sprintf (u2 + (i * 2), "%02x", u1[i]);
|
53
|
+
|
54
|
+
seed = string (u2);
|
55
|
+
#endif
|
56
|
+
|
57
|
+
|
58
|
+
#ifdef OS_WIN32
|
59
|
+
UUID uuid;
|
60
|
+
UuidCreate (&uuid);
|
61
|
+
unsigned char *uuidstring = NULL;
|
62
|
+
UuidToString (&uuid, &uuidstring);
|
63
|
+
if (!uuidstring)
|
64
|
+
throw std::runtime_error ("Unable to read uuid");
|
65
|
+
seed = string ((const char*)uuidstring);
|
66
|
+
|
67
|
+
RpcStringFree (&uuidstring);
|
68
|
+
#endif
|
69
|
+
|
70
|
+
index = 0;
|
71
|
+
|
72
|
+
|
73
|
+
}
|
74
|
+
|
75
|
+
stringstream ss;
|
76
|
+
ss << seed << (++index);
|
77
|
+
return ss.str();
|
78
|
+
}
|
79
|
+
|
80
|
+
|
81
|
+
/*****************************
|
82
|
+
STATIC: Bindable_t::GetObject
|
83
|
+
*****************************/
|
84
|
+
|
85
|
+
Bindable_t *Bindable_t::GetObject (const char *binding)
|
86
|
+
{
|
87
|
+
string s (binding ? binding : "");
|
88
|
+
return GetObject (s);
|
89
|
+
}
|
90
|
+
|
91
|
+
/*****************************
|
92
|
+
STATIC: Bindable_t::GetObject
|
93
|
+
*****************************/
|
94
|
+
|
95
|
+
Bindable_t *Bindable_t::GetObject (const string &binding)
|
96
|
+
{
|
97
|
+
map<string, Bindable_t*>::const_iterator i = BindingBag.find (binding);
|
98
|
+
if (i != BindingBag.end())
|
99
|
+
return i->second;
|
100
|
+
else
|
101
|
+
return NULL;
|
102
|
+
}
|
103
|
+
|
104
|
+
|
105
|
+
/**********************
|
106
|
+
Bindable_t::Bindable_t
|
107
|
+
**********************/
|
108
|
+
|
109
|
+
Bindable_t::Bindable_t()
|
110
|
+
{
|
111
|
+
Binding = Bindable_t::CreateBinding();
|
112
|
+
BindingBag [Binding] = this;
|
113
|
+
}
|
114
|
+
|
115
|
+
|
116
|
+
|
117
|
+
/***********************
|
118
|
+
Bindable_t::~Bindable_t
|
119
|
+
***********************/
|
120
|
+
|
121
|
+
Bindable_t::~Bindable_t()
|
122
|
+
{
|
123
|
+
BindingBag.erase (Binding);
|
124
|
+
}
|
125
|
+
|
126
|
+
|
data/ext/binder.h
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
/*****************************************************************************
|
2
|
+
|
3
|
+
$Id$
|
4
|
+
|
5
|
+
File: binder.h
|
6
|
+
Date: 07Apr06
|
7
|
+
|
8
|
+
Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
|
9
|
+
Gmail: blackhedd
|
10
|
+
|
11
|
+
This program is free software; you can redistribute it and/or modify
|
12
|
+
it under the terms of either: 1) the GNU General Public License
|
13
|
+
as published by the Free Software Foundation; either version 2 of the
|
14
|
+
License, or (at your option) any later version; or 2) Ruby's License.
|
15
|
+
|
16
|
+
See the file COPYING for complete licensing information.
|
17
|
+
|
18
|
+
*****************************************************************************/
|
19
|
+
|
20
|
+
#ifndef __ObjectBindings__H_
|
21
|
+
#define __ObjectBindings__H_
|
22
|
+
|
23
|
+
|
24
|
+
class Bindable_t
|
25
|
+
{
|
26
|
+
public:
|
27
|
+
static string CreateBinding();
|
28
|
+
static Bindable_t *GetObject (const string&);
|
29
|
+
static Bindable_t *GetObject (const char*);
|
30
|
+
static map<string, Bindable_t*> BindingBag;
|
31
|
+
|
32
|
+
public:
|
33
|
+
Bindable_t();
|
34
|
+
virtual ~Bindable_t();
|
35
|
+
|
36
|
+
const string &GetBinding() {return Binding;}
|
37
|
+
const char *GetBindingChars() {return Binding.c_str();}
|
38
|
+
|
39
|
+
private:
|
40
|
+
string Binding;
|
41
|
+
};
|
42
|
+
|
43
|
+
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
#endif // __ObjectBindings__H_
|
48
|
+
|
data/ext/cmain.cpp
ADDED
@@ -0,0 +1,586 @@
|
|
1
|
+
/*****************************************************************************
|
2
|
+
|
3
|
+
$Id$
|
4
|
+
|
5
|
+
File: cmain.cpp
|
6
|
+
Date: 06Apr06
|
7
|
+
|
8
|
+
Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
|
9
|
+
Gmail: blackhedd
|
10
|
+
|
11
|
+
This program is free software; you can redistribute it and/or modify
|
12
|
+
it under the terms of either: 1) the GNU General Public License
|
13
|
+
as published by the Free Software Foundation; either version 2 of the
|
14
|
+
License, or (at your option) any later version; or 2) Ruby's License.
|
15
|
+
|
16
|
+
See the file COPYING for complete licensing information.
|
17
|
+
|
18
|
+
*****************************************************************************/
|
19
|
+
|
20
|
+
#include "project.h"
|
21
|
+
|
22
|
+
|
23
|
+
static EventMachine_t *EventMachine;
|
24
|
+
static int bUseEpoll = 0;
|
25
|
+
static int bUseKqueue = 0;
|
26
|
+
|
27
|
+
extern "C" void ensure_eventmachine (const char *caller = "unknown caller")
|
28
|
+
{
|
29
|
+
if (!EventMachine) {
|
30
|
+
const int err_size = 128;
|
31
|
+
char err_string[err_size];
|
32
|
+
snprintf (err_string, err_size, "eventmachine not initialized: %s", caller);
|
33
|
+
#ifdef BUILD_FOR_RUBY
|
34
|
+
rb_raise(rb_eRuntimeError, err_string);
|
35
|
+
#else
|
36
|
+
throw std::runtime_error (err_string);
|
37
|
+
#endif
|
38
|
+
}
|
39
|
+
}
|
40
|
+
|
41
|
+
/***********************
|
42
|
+
evma_initialize_library
|
43
|
+
***********************/
|
44
|
+
|
45
|
+
extern "C" void evma_initialize_library (void(*cb)(const char*, int, const char*, int))
|
46
|
+
{
|
47
|
+
// Probably a bad idea to mess with the signal mask of a process
|
48
|
+
// we're just being linked into.
|
49
|
+
//InstallSignalHandlers();
|
50
|
+
if (EventMachine)
|
51
|
+
#ifdef BUILD_FOR_RUBY
|
52
|
+
rb_raise(rb_eRuntimeError, "eventmachine already initialized: evma_initialize_library");
|
53
|
+
#else
|
54
|
+
throw std::runtime_error ("eventmachine already initialized: evma_initialize_library");
|
55
|
+
#endif
|
56
|
+
EventMachine = new EventMachine_t (cb);
|
57
|
+
if (bUseEpoll)
|
58
|
+
EventMachine->_UseEpoll();
|
59
|
+
if (bUseKqueue)
|
60
|
+
EventMachine->_UseKqueue();
|
61
|
+
}
|
62
|
+
|
63
|
+
|
64
|
+
/********************
|
65
|
+
evma_release_library
|
66
|
+
********************/
|
67
|
+
|
68
|
+
extern "C" void evma_release_library()
|
69
|
+
{
|
70
|
+
ensure_eventmachine("evma_release_library");
|
71
|
+
delete EventMachine;
|
72
|
+
EventMachine = NULL;
|
73
|
+
}
|
74
|
+
|
75
|
+
|
76
|
+
/****************
|
77
|
+
evma_run_machine
|
78
|
+
****************/
|
79
|
+
|
80
|
+
extern "C" void evma_run_machine()
|
81
|
+
{
|
82
|
+
ensure_eventmachine("evma_run_machine");
|
83
|
+
EventMachine->Run();
|
84
|
+
}
|
85
|
+
|
86
|
+
|
87
|
+
/**************************
|
88
|
+
evma_install_oneshot_timer
|
89
|
+
**************************/
|
90
|
+
|
91
|
+
extern "C" const char *evma_install_oneshot_timer (int seconds)
|
92
|
+
{
|
93
|
+
ensure_eventmachine("evma_install_oneshot_timer");
|
94
|
+
return EventMachine->InstallOneshotTimer (seconds);
|
95
|
+
}
|
96
|
+
|
97
|
+
|
98
|
+
/**********************
|
99
|
+
evma_connect_to_server
|
100
|
+
**********************/
|
101
|
+
|
102
|
+
extern "C" const char *evma_connect_to_server (const char *server, int port)
|
103
|
+
{
|
104
|
+
ensure_eventmachine("evma_connect_to_server");
|
105
|
+
return EventMachine->ConnectToServer (server, port);
|
106
|
+
}
|
107
|
+
|
108
|
+
/***************************
|
109
|
+
evma_connect_to_unix_server
|
110
|
+
***************************/
|
111
|
+
|
112
|
+
extern "C" const char *evma_connect_to_unix_server (const char *server)
|
113
|
+
{
|
114
|
+
ensure_eventmachine("evma_connect_to_unix_server");
|
115
|
+
return EventMachine->ConnectToUnixServer (server);
|
116
|
+
}
|
117
|
+
|
118
|
+
/**************
|
119
|
+
evma_attach_fd
|
120
|
+
**************/
|
121
|
+
|
122
|
+
extern "C" const char *evma_attach_fd (int file_descriptor, int notify_readable, int notify_writable)
|
123
|
+
{
|
124
|
+
ensure_eventmachine("evma_attach_fd");
|
125
|
+
return EventMachine->AttachFD (file_descriptor, (notify_readable ? true : false), (notify_writable ? true : false));
|
126
|
+
}
|
127
|
+
|
128
|
+
/**************
|
129
|
+
evma_detach_fd
|
130
|
+
**************/
|
131
|
+
|
132
|
+
extern "C" int evma_detach_fd (const char *binding)
|
133
|
+
{
|
134
|
+
ensure_eventmachine("evma_dettach_fd");
|
135
|
+
EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding));
|
136
|
+
if (ed)
|
137
|
+
return EventMachine->DetachFD (ed);
|
138
|
+
else
|
139
|
+
#ifdef BUILD_FOR_RUBY
|
140
|
+
rb_raise(rb_eRuntimeError, "invalid binding to detach");
|
141
|
+
#else
|
142
|
+
throw std::runtime_error ("invalid binding to detach");
|
143
|
+
#endif
|
144
|
+
}
|
145
|
+
|
146
|
+
/**********************
|
147
|
+
evma_create_tcp_server
|
148
|
+
**********************/
|
149
|
+
|
150
|
+
extern "C" const char *evma_create_tcp_server (const char *address, int port)
|
151
|
+
{
|
152
|
+
ensure_eventmachine("evma_create_tcp_server");
|
153
|
+
return EventMachine->CreateTcpServer (address, port);
|
154
|
+
}
|
155
|
+
|
156
|
+
/******************************
|
157
|
+
evma_create_unix_domain_server
|
158
|
+
******************************/
|
159
|
+
|
160
|
+
extern "C" const char *evma_create_unix_domain_server (const char *filename)
|
161
|
+
{
|
162
|
+
ensure_eventmachine("evma_create_unix_domain_server");
|
163
|
+
return EventMachine->CreateUnixDomainServer (filename);
|
164
|
+
}
|
165
|
+
|
166
|
+
/*************************
|
167
|
+
evma_open_datagram_socket
|
168
|
+
*************************/
|
169
|
+
|
170
|
+
extern "C" const char *evma_open_datagram_socket (const char *address, int port)
|
171
|
+
{
|
172
|
+
ensure_eventmachine("evma_open_datagram_socket");
|
173
|
+
return EventMachine->OpenDatagramSocket (address, port);
|
174
|
+
}
|
175
|
+
|
176
|
+
/******************
|
177
|
+
evma_open_keyboard
|
178
|
+
******************/
|
179
|
+
|
180
|
+
extern "C" const char *evma_open_keyboard()
|
181
|
+
{
|
182
|
+
ensure_eventmachine("evma_open_keyboard");
|
183
|
+
return EventMachine->OpenKeyboard();
|
184
|
+
}
|
185
|
+
|
186
|
+
|
187
|
+
|
188
|
+
/****************************
|
189
|
+
evma_send_data_to_connection
|
190
|
+
****************************/
|
191
|
+
|
192
|
+
extern "C" int evma_send_data_to_connection (const char *binding, const char *data, int data_length)
|
193
|
+
{
|
194
|
+
ensure_eventmachine("evma_send_data_to_connection");
|
195
|
+
return ConnectionDescriptor::SendDataToConnection (binding, data, data_length);
|
196
|
+
}
|
197
|
+
|
198
|
+
/******************
|
199
|
+
evma_send_datagram
|
200
|
+
******************/
|
201
|
+
|
202
|
+
extern "C" int evma_send_datagram (const char *binding, const char *data, int data_length, const char *address, int port)
|
203
|
+
{
|
204
|
+
ensure_eventmachine("evma_send_datagram");
|
205
|
+
return DatagramDescriptor::SendDatagram (binding, data, data_length, address, port);
|
206
|
+
}
|
207
|
+
|
208
|
+
|
209
|
+
/*********************
|
210
|
+
evma_close_connection
|
211
|
+
*********************/
|
212
|
+
|
213
|
+
extern "C" void evma_close_connection (const char *binding, int after_writing)
|
214
|
+
{
|
215
|
+
ensure_eventmachine("evma_close_connection");
|
216
|
+
ConnectionDescriptor::CloseConnection (binding, (after_writing ? true : false));
|
217
|
+
}
|
218
|
+
|
219
|
+
/***********************************
|
220
|
+
evma_report_connection_error_status
|
221
|
+
***********************************/
|
222
|
+
|
223
|
+
extern "C" int evma_report_connection_error_status (const char *binding)
|
224
|
+
{
|
225
|
+
ensure_eventmachine("evma_report_connection_error_status");
|
226
|
+
return ConnectionDescriptor::ReportErrorStatus (binding);
|
227
|
+
}
|
228
|
+
|
229
|
+
/********************
|
230
|
+
evma_stop_tcp_server
|
231
|
+
********************/
|
232
|
+
|
233
|
+
extern "C" void evma_stop_tcp_server (const char *binding)
|
234
|
+
{
|
235
|
+
ensure_eventmachine("evma_stop_tcp_server");
|
236
|
+
AcceptorDescriptor::StopAcceptor (binding);
|
237
|
+
}
|
238
|
+
|
239
|
+
|
240
|
+
/*****************
|
241
|
+
evma_stop_machine
|
242
|
+
*****************/
|
243
|
+
|
244
|
+
extern "C" void evma_stop_machine()
|
245
|
+
{
|
246
|
+
ensure_eventmachine("evma_stop_machine");
|
247
|
+
EventMachine->ScheduleHalt();
|
248
|
+
}
|
249
|
+
|
250
|
+
|
251
|
+
/**************
|
252
|
+
evma_start_tls
|
253
|
+
**************/
|
254
|
+
|
255
|
+
extern "C" void evma_start_tls (const char *binding)
|
256
|
+
{
|
257
|
+
ensure_eventmachine("evma_start_tls");
|
258
|
+
EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding));
|
259
|
+
if (ed)
|
260
|
+
ed->StartTls();
|
261
|
+
}
|
262
|
+
|
263
|
+
/******************
|
264
|
+
evma_set_tls_parms
|
265
|
+
******************/
|
266
|
+
|
267
|
+
extern "C" void evma_set_tls_parms (const char *binding, const char *privatekey_filename, const char *certchain_filename)
|
268
|
+
{
|
269
|
+
ensure_eventmachine("evma_set_tls_parms");
|
270
|
+
EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding));
|
271
|
+
if (ed)
|
272
|
+
ed->SetTlsParms (privatekey_filename, certchain_filename);
|
273
|
+
}
|
274
|
+
|
275
|
+
/**************
|
276
|
+
evma_get_peer_cert
|
277
|
+
**************/
|
278
|
+
|
279
|
+
#ifdef WITH_SSL
|
280
|
+
extern "C" X509 *evma_get_peer_cert (const char *binding)
|
281
|
+
{
|
282
|
+
ensure_eventmachine("evma_get_peer_cert");
|
283
|
+
EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding));
|
284
|
+
if (ed)
|
285
|
+
return ed->GetPeerCert();
|
286
|
+
return NULL;
|
287
|
+
}
|
288
|
+
#endif
|
289
|
+
|
290
|
+
/*****************
|
291
|
+
evma_get_peername
|
292
|
+
*****************/
|
293
|
+
|
294
|
+
extern "C" int evma_get_peername (const char *binding, struct sockaddr *sa)
|
295
|
+
{
|
296
|
+
ensure_eventmachine("evma_get_peername");
|
297
|
+
EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding));
|
298
|
+
if (ed) {
|
299
|
+
return ed->GetPeername (sa) ? 1 : 0;
|
300
|
+
}
|
301
|
+
else
|
302
|
+
return 0;
|
303
|
+
}
|
304
|
+
|
305
|
+
/*****************
|
306
|
+
evma_get_sockname
|
307
|
+
*****************/
|
308
|
+
|
309
|
+
extern "C" int evma_get_sockname (const char *binding, struct sockaddr *sa)
|
310
|
+
{
|
311
|
+
ensure_eventmachine("evma_get_sockname");
|
312
|
+
EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding));
|
313
|
+
if (ed) {
|
314
|
+
return ed->GetSockname (sa) ? 1 : 0;
|
315
|
+
}
|
316
|
+
else
|
317
|
+
return 0;
|
318
|
+
}
|
319
|
+
|
320
|
+
/***********************
|
321
|
+
evma_get_subprocess_pid
|
322
|
+
***********************/
|
323
|
+
|
324
|
+
extern "C" int evma_get_subprocess_pid (const char *binding, pid_t *pid)
|
325
|
+
{
|
326
|
+
ensure_eventmachine("evma_get_subprocess_pid");
|
327
|
+
#ifdef OS_UNIX
|
328
|
+
PipeDescriptor *pd = dynamic_cast <PipeDescriptor*> (Bindable_t::GetObject (binding));
|
329
|
+
if (pd) {
|
330
|
+
return pd->GetSubprocessPid (pid) ? 1 : 0;
|
331
|
+
}
|
332
|
+
else if (pid && EventMachine->SubprocessPid) {
|
333
|
+
*pid = EventMachine->SubprocessPid;
|
334
|
+
return 1;
|
335
|
+
}
|
336
|
+
else
|
337
|
+
return 0;
|
338
|
+
#else
|
339
|
+
return 0;
|
340
|
+
#endif
|
341
|
+
}
|
342
|
+
|
343
|
+
/**************************
|
344
|
+
evma_get_subprocess_status
|
345
|
+
**************************/
|
346
|
+
|
347
|
+
extern "C" int evma_get_subprocess_status (const char *binding, int *status)
|
348
|
+
{
|
349
|
+
ensure_eventmachine("evma_get_subprocess_status");
|
350
|
+
if (status) {
|
351
|
+
*status = EventMachine->SubprocessExitStatus;
|
352
|
+
return 1;
|
353
|
+
}
|
354
|
+
else
|
355
|
+
return 0;
|
356
|
+
}
|
357
|
+
|
358
|
+
/*************************
|
359
|
+
evma_get_connection_count
|
360
|
+
*************************/
|
361
|
+
|
362
|
+
extern "C" int evma_get_connection_count()
|
363
|
+
{
|
364
|
+
ensure_eventmachine("evma_get_connection_count");
|
365
|
+
return EventMachine->GetConnectionCount();
|
366
|
+
}
|
367
|
+
|
368
|
+
/*********************
|
369
|
+
evma_signal_loopbreak
|
370
|
+
*********************/
|
371
|
+
|
372
|
+
extern "C" void evma_signal_loopbreak()
|
373
|
+
{
|
374
|
+
ensure_eventmachine("evma_signal_loopbreak");
|
375
|
+
EventMachine->SignalLoopBreaker();
|
376
|
+
}
|
377
|
+
|
378
|
+
|
379
|
+
|
380
|
+
/****************
|
381
|
+
evma__write_file
|
382
|
+
****************/
|
383
|
+
|
384
|
+
extern "C" const char *evma__write_file (const char *filename)
|
385
|
+
{
|
386
|
+
ensure_eventmachine("evma__write_file");
|
387
|
+
return EventMachine->_OpenFileForWriting (filename);
|
388
|
+
}
|
389
|
+
|
390
|
+
|
391
|
+
/********************************
|
392
|
+
evma_get_comm_inactivity_timeout
|
393
|
+
********************************/
|
394
|
+
|
395
|
+
extern "C" int evma_get_comm_inactivity_timeout (const char *binding, int *value)
|
396
|
+
{
|
397
|
+
ensure_eventmachine("evma_get_comm_inactivity_timeout");
|
398
|
+
EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding));
|
399
|
+
if (ed) {
|
400
|
+
return ed->GetCommInactivityTimeout (value);
|
401
|
+
}
|
402
|
+
else
|
403
|
+
return 0; //Perhaps this should be an exception. Access to an unknown binding.
|
404
|
+
}
|
405
|
+
|
406
|
+
/********************************
|
407
|
+
evma_set_comm_inactivity_timeout
|
408
|
+
********************************/
|
409
|
+
|
410
|
+
extern "C" int evma_set_comm_inactivity_timeout (const char *binding, int *value)
|
411
|
+
{
|
412
|
+
ensure_eventmachine("evma_set_comm_inactivity_timeout");
|
413
|
+
EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding));
|
414
|
+
if (ed) {
|
415
|
+
return ed->SetCommInactivityTimeout (value);
|
416
|
+
}
|
417
|
+
else
|
418
|
+
return 0; //Perhaps this should be an exception. Access to an unknown binding.
|
419
|
+
}
|
420
|
+
|
421
|
+
|
422
|
+
/**********************
|
423
|
+
evma_set_timer_quantum
|
424
|
+
**********************/
|
425
|
+
|
426
|
+
extern "C" void evma_set_timer_quantum (int interval)
|
427
|
+
{
|
428
|
+
ensure_eventmachine("evma_set_timer_quantum");
|
429
|
+
EventMachine->SetTimerQuantum (interval);
|
430
|
+
}
|
431
|
+
|
432
|
+
|
433
|
+
/************************
|
434
|
+
evma_get_max_timer_count
|
435
|
+
************************/
|
436
|
+
|
437
|
+
extern "C" int evma_get_max_timer_count()
|
438
|
+
{
|
439
|
+
return EventMachine_t::GetMaxTimerCount();
|
440
|
+
}
|
441
|
+
|
442
|
+
|
443
|
+
/************************
|
444
|
+
evma_set_max_timer_count
|
445
|
+
************************/
|
446
|
+
|
447
|
+
extern "C" void evma_set_max_timer_count (int ct)
|
448
|
+
{
|
449
|
+
// This may only be called if the reactor is not running.
|
450
|
+
|
451
|
+
if (EventMachine)
|
452
|
+
#ifdef BUILD_FOR_RUBY
|
453
|
+
rb_raise(rb_eRuntimeError, "eventmachine already initialized: evma_set_max_timer_count");
|
454
|
+
#else
|
455
|
+
throw std::runtime_error ("eventmachine already initialized: evma_set_max_timer_count");
|
456
|
+
#endif
|
457
|
+
EventMachine_t::SetMaxTimerCount (ct);
|
458
|
+
}
|
459
|
+
|
460
|
+
/******************
|
461
|
+
evma_setuid_string
|
462
|
+
******************/
|
463
|
+
|
464
|
+
extern "C" void evma_setuid_string (const char *username)
|
465
|
+
{
|
466
|
+
// We do NOT need to be running an EM instance because this method is static.
|
467
|
+
EventMachine_t::SetuidString (username);
|
468
|
+
}
|
469
|
+
|
470
|
+
|
471
|
+
/**********
|
472
|
+
evma_popen
|
473
|
+
**********/
|
474
|
+
|
475
|
+
extern "C" const char *evma_popen (char * const*cmd_strings)
|
476
|
+
{
|
477
|
+
ensure_eventmachine("evma_popen");
|
478
|
+
return EventMachine->Socketpair (cmd_strings);
|
479
|
+
}
|
480
|
+
|
481
|
+
|
482
|
+
/***************************
|
483
|
+
evma_get_outbound_data_size
|
484
|
+
***************************/
|
485
|
+
|
486
|
+
extern "C" int evma_get_outbound_data_size (const char *binding)
|
487
|
+
{
|
488
|
+
ensure_eventmachine("evma_get_outbound_data_size");
|
489
|
+
EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding));
|
490
|
+
return ed ? ed->GetOutboundDataSize() : 0;
|
491
|
+
}
|
492
|
+
|
493
|
+
|
494
|
+
/***********
|
495
|
+
evma__epoll
|
496
|
+
***********/
|
497
|
+
|
498
|
+
extern "C" void evma__epoll()
|
499
|
+
{
|
500
|
+
bUseEpoll = 1;
|
501
|
+
}
|
502
|
+
|
503
|
+
/************
|
504
|
+
evma__kqueue
|
505
|
+
************/
|
506
|
+
|
507
|
+
extern "C" void evma__kqueue()
|
508
|
+
{
|
509
|
+
bUseKqueue = 1;
|
510
|
+
}
|
511
|
+
|
512
|
+
|
513
|
+
/**********************
|
514
|
+
evma_set_rlimit_nofile
|
515
|
+
**********************/
|
516
|
+
|
517
|
+
extern "C" int evma_set_rlimit_nofile (int nofiles)
|
518
|
+
{
|
519
|
+
return EventMachine_t::SetRlimitNofile (nofiles);
|
520
|
+
}
|
521
|
+
|
522
|
+
|
523
|
+
/*********************************
|
524
|
+
evma_send_file_data_to_connection
|
525
|
+
*********************************/
|
526
|
+
|
527
|
+
extern "C" int evma_send_file_data_to_connection (const char *binding, const char *filename)
|
528
|
+
{
|
529
|
+
/* This is a sugaring over send_data_to_connection that reads a file into a
|
530
|
+
* locally-allocated buffer, and sends the file data to the remote peer.
|
531
|
+
* Return the number of bytes written to the caller.
|
532
|
+
* TODO, needs to impose a limit on the file size. This is intended only for
|
533
|
+
* small files. (I don't know, maybe 8K or less.) For larger files, use interleaved
|
534
|
+
* I/O to avoid slowing the rest of the system down.
|
535
|
+
* TODO: we should return a code rather than barf, in case of file-not-found.
|
536
|
+
* TODO, does this compile on Windows?
|
537
|
+
* TODO, given that we want this to work only with small files, how about allocating
|
538
|
+
* the buffer on the stack rather than the heap?
|
539
|
+
*
|
540
|
+
* Modified 25Jul07. This now returns -1 on file-too-large; 0 for success, and a positive
|
541
|
+
* errno in case of other errors.
|
542
|
+
*
|
543
|
+
/* Contributed by Kirk Haines.
|
544
|
+
*/
|
545
|
+
|
546
|
+
char data[32*1024];
|
547
|
+
int r;
|
548
|
+
|
549
|
+
ensure_eventmachine("evma_send_file_data_to_connection");
|
550
|
+
|
551
|
+
int Fd = open (filename, O_RDONLY);
|
552
|
+
|
553
|
+
if (Fd < 0)
|
554
|
+
return errno;
|
555
|
+
// From here on, all early returns MUST close Fd.
|
556
|
+
|
557
|
+
struct stat st;
|
558
|
+
if (fstat (Fd, &st)) {
|
559
|
+
int e = errno;
|
560
|
+
close (Fd);
|
561
|
+
return e;
|
562
|
+
}
|
563
|
+
|
564
|
+
int filesize = st.st_size;
|
565
|
+
if (filesize <= 0) {
|
566
|
+
close (Fd);
|
567
|
+
return 0;
|
568
|
+
}
|
569
|
+
else if (filesize > sizeof(data)) {
|
570
|
+
close (Fd);
|
571
|
+
return -1;
|
572
|
+
}
|
573
|
+
|
574
|
+
|
575
|
+
r = read (Fd, data, filesize);
|
576
|
+
if (r != filesize) {
|
577
|
+
int e = errno;
|
578
|
+
close (Fd);
|
579
|
+
return e;
|
580
|
+
}
|
581
|
+
evma_send_data_to_connection (binding, data, r);
|
582
|
+
close (Fd);
|
583
|
+
|
584
|
+
return 0;
|
585
|
+
}
|
586
|
+
|