eventmachine 0.12.6-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (136) hide show
  1. data/.gitignore +13 -0
  2. data/Rakefile +262 -0
  3. data/docs/COPYING +60 -0
  4. data/docs/ChangeLog +211 -0
  5. data/docs/DEFERRABLES +138 -0
  6. data/docs/EPOLL +141 -0
  7. data/docs/GNU +281 -0
  8. data/docs/INSTALL +15 -0
  9. data/docs/KEYBOARD +38 -0
  10. data/docs/LEGAL +25 -0
  11. data/docs/LIGHTWEIGHT_CONCURRENCY +72 -0
  12. data/docs/PURE_RUBY +77 -0
  13. data/docs/README +74 -0
  14. data/docs/RELEASE_NOTES +96 -0
  15. data/docs/SMTP +9 -0
  16. data/docs/SPAWNED_PROCESSES +93 -0
  17. data/docs/TODO +10 -0
  18. data/eventmachine.gemspec +32 -0
  19. data/ext/binder.cpp +126 -0
  20. data/ext/binder.h +48 -0
  21. data/ext/cmain.cpp +586 -0
  22. data/ext/cplusplus.cpp +193 -0
  23. data/ext/ed.cpp +1522 -0
  24. data/ext/ed.h +380 -0
  25. data/ext/em.cpp +1937 -0
  26. data/ext/em.h +186 -0
  27. data/ext/emwin.cpp +300 -0
  28. data/ext/emwin.h +94 -0
  29. data/ext/epoll.cpp +26 -0
  30. data/ext/epoll.h +25 -0
  31. data/ext/eventmachine.h +98 -0
  32. data/ext/eventmachine_cpp.h +95 -0
  33. data/ext/extconf.rb +129 -0
  34. data/ext/fastfilereader/extconf.rb +77 -0
  35. data/ext/fastfilereader/mapper.cpp +214 -0
  36. data/ext/fastfilereader/mapper.h +59 -0
  37. data/ext/fastfilereader/rubymain.cpp +127 -0
  38. data/ext/files.cpp +94 -0
  39. data/ext/files.h +65 -0
  40. data/ext/kb.cpp +82 -0
  41. data/ext/page.cpp +107 -0
  42. data/ext/page.h +51 -0
  43. data/ext/pipe.cpp +351 -0
  44. data/ext/project.h +119 -0
  45. data/ext/rubymain.cpp +847 -0
  46. data/ext/sigs.cpp +89 -0
  47. data/ext/sigs.h +32 -0
  48. data/ext/ssl.cpp +423 -0
  49. data/ext/ssl.h +90 -0
  50. data/java/.classpath +8 -0
  51. data/java/.project +17 -0
  52. data/java/src/com/rubyeventmachine/Application.java +196 -0
  53. data/java/src/com/rubyeventmachine/Connection.java +74 -0
  54. data/java/src/com/rubyeventmachine/ConnectionFactory.java +37 -0
  55. data/java/src/com/rubyeventmachine/DefaultConnectionFactory.java +46 -0
  56. data/java/src/com/rubyeventmachine/EmReactor.java +408 -0
  57. data/java/src/com/rubyeventmachine/EmReactorException.java +40 -0
  58. data/java/src/com/rubyeventmachine/EventableChannel.java +57 -0
  59. data/java/src/com/rubyeventmachine/EventableDatagramChannel.java +171 -0
  60. data/java/src/com/rubyeventmachine/EventableSocketChannel.java +244 -0
  61. data/java/src/com/rubyeventmachine/PeriodicTimer.java +38 -0
  62. data/java/src/com/rubyeventmachine/Timer.java +54 -0
  63. data/java/src/com/rubyeventmachine/tests/ApplicationTest.java +108 -0
  64. data/java/src/com/rubyeventmachine/tests/ConnectTest.java +124 -0
  65. data/java/src/com/rubyeventmachine/tests/EMTest.java +80 -0
  66. data/java/src/com/rubyeventmachine/tests/TestDatagrams.java +53 -0
  67. data/java/src/com/rubyeventmachine/tests/TestServers.java +74 -0
  68. data/java/src/com/rubyeventmachine/tests/TestTimers.java +89 -0
  69. data/lib/em/deferrable.rb +208 -0
  70. data/lib/em/eventable.rb +39 -0
  71. data/lib/em/future.rb +62 -0
  72. data/lib/em/messages.rb +66 -0
  73. data/lib/em/processes.rb +113 -0
  74. data/lib/em/spawnable.rb +88 -0
  75. data/lib/em/streamer.rb +112 -0
  76. data/lib/eventmachine.rb +1926 -0
  77. data/lib/eventmachine_version.rb +31 -0
  78. data/lib/evma.rb +32 -0
  79. data/lib/evma/callback.rb +32 -0
  80. data/lib/evma/container.rb +75 -0
  81. data/lib/evma/factory.rb +77 -0
  82. data/lib/evma/protocol.rb +87 -0
  83. data/lib/evma/reactor.rb +48 -0
  84. data/lib/jeventmachine.rb +137 -0
  85. data/lib/pr_eventmachine.rb +1011 -0
  86. data/lib/protocols/buftok.rb +127 -0
  87. data/lib/protocols/header_and_content.rb +129 -0
  88. data/lib/protocols/httpcli2.rb +803 -0
  89. data/lib/protocols/httpclient.rb +270 -0
  90. data/lib/protocols/line_and_text.rb +126 -0
  91. data/lib/protocols/linetext2.rb +161 -0
  92. data/lib/protocols/memcache.rb +293 -0
  93. data/lib/protocols/postgres.rb +261 -0
  94. data/lib/protocols/saslauth.rb +179 -0
  95. data/lib/protocols/smtpclient.rb +308 -0
  96. data/lib/protocols/smtpserver.rb +556 -0
  97. data/lib/protocols/stomp.rb +153 -0
  98. data/lib/protocols/tcptest.rb +57 -0
  99. data/setup.rb +1585 -0
  100. data/tasks/cpp.rake +77 -0
  101. data/tasks/project.rake +78 -0
  102. data/tasks/tests.rake +193 -0
  103. data/tests/test_attach.rb +83 -0
  104. data/tests/test_basic.rb +231 -0
  105. data/tests/test_connection_count.rb +45 -0
  106. data/tests/test_defer.rb +47 -0
  107. data/tests/test_epoll.rb +163 -0
  108. data/tests/test_error_handler.rb +35 -0
  109. data/tests/test_errors.rb +82 -0
  110. data/tests/test_eventables.rb +77 -0
  111. data/tests/test_exc.rb +58 -0
  112. data/tests/test_futures.rb +214 -0
  113. data/tests/test_handler_check.rb +37 -0
  114. data/tests/test_hc.rb +218 -0
  115. data/tests/test_httpclient.rb +215 -0
  116. data/tests/test_httpclient2.rb +155 -0
  117. data/tests/test_kb.rb +61 -0
  118. data/tests/test_ltp.rb +188 -0
  119. data/tests/test_ltp2.rb +320 -0
  120. data/tests/test_next_tick.rb +109 -0
  121. data/tests/test_processes.rb +95 -0
  122. data/tests/test_pure.rb +129 -0
  123. data/tests/test_running.rb +47 -0
  124. data/tests/test_sasl.rb +74 -0
  125. data/tests/test_send_file.rb +243 -0
  126. data/tests/test_servers.rb +80 -0
  127. data/tests/test_smtpclient.rb +83 -0
  128. data/tests/test_smtpserver.rb +93 -0
  129. data/tests/test_spawn.rb +329 -0
  130. data/tests/test_ssl_args.rb +68 -0
  131. data/tests/test_ssl_methods.rb +50 -0
  132. data/tests/test_timers.rb +148 -0
  133. data/tests/test_ud.rb +43 -0
  134. data/tests/testem.rb +31 -0
  135. data/web/whatis +7 -0
  136. metadata +214 -0
@@ -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
@@ -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
+
@@ -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
+
@@ -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
+