brianmario-eventmachine 0.12.2

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.
Files changed (72) hide show
  1. data/COPYING +60 -0
  2. data/DEFERRABLES +138 -0
  3. data/EPOLL +141 -0
  4. data/GNU +281 -0
  5. data/KEYBOARD +38 -0
  6. data/LEGAL +25 -0
  7. data/LIGHTWEIGHT_CONCURRENCY +72 -0
  8. data/PURE_RUBY +77 -0
  9. data/README +74 -0
  10. data/RELEASE_NOTES +96 -0
  11. data/SMTP +9 -0
  12. data/SPAWNED_PROCESSES +93 -0
  13. data/TODO +10 -0
  14. data/eventmachine.gemspec +15 -0
  15. data/ext/binder.cpp +126 -0
  16. data/ext/binder.h +48 -0
  17. data/ext/cmain.cpp +553 -0
  18. data/ext/cplusplus.cpp +172 -0
  19. data/ext/ed.cpp +1473 -0
  20. data/ext/ed.h +361 -0
  21. data/ext/em.cpp +1890 -0
  22. data/ext/em.h +170 -0
  23. data/ext/emwin.cpp +300 -0
  24. data/ext/emwin.h +94 -0
  25. data/ext/epoll.cpp +26 -0
  26. data/ext/epoll.h +25 -0
  27. data/ext/eventmachine.h +90 -0
  28. data/ext/eventmachine_cpp.h +94 -0
  29. data/ext/extconf.rb +203 -0
  30. data/ext/files.cpp +94 -0
  31. data/ext/files.h +65 -0
  32. data/ext/kb.cpp +368 -0
  33. data/ext/page.cpp +107 -0
  34. data/ext/page.h +51 -0
  35. data/ext/pipe.cpp +327 -0
  36. data/ext/project.h +119 -0
  37. data/ext/rubymain.cpp +678 -0
  38. data/ext/sigs.cpp +89 -0
  39. data/ext/sigs.h +32 -0
  40. data/ext/ssl.cpp +408 -0
  41. data/ext/ssl.h +86 -0
  42. data/lib/em/deferrable.rb +208 -0
  43. data/lib/em/eventable.rb +39 -0
  44. data/lib/em/future.rb +62 -0
  45. data/lib/em/messages.rb +66 -0
  46. data/lib/em/processes.rb +68 -0
  47. data/lib/em/spawnable.rb +88 -0
  48. data/lib/em/streamer.rb +112 -0
  49. data/lib/eventmachine.rb +1756 -0
  50. data/lib/eventmachine_version.rb +31 -0
  51. data/lib/evma.rb +32 -0
  52. data/lib/evma/callback.rb +32 -0
  53. data/lib/evma/container.rb +75 -0
  54. data/lib/evma/factory.rb +77 -0
  55. data/lib/evma/protocol.rb +87 -0
  56. data/lib/evma/reactor.rb +48 -0
  57. data/lib/jeventmachine.rb +132 -0
  58. data/lib/pr_eventmachine.rb +1011 -0
  59. data/lib/protocols/buftok.rb +127 -0
  60. data/lib/protocols/header_and_content.rb +129 -0
  61. data/lib/protocols/httpcli2.rb +784 -0
  62. data/lib/protocols/httpclient.rb +264 -0
  63. data/lib/protocols/line_and_text.rb +122 -0
  64. data/lib/protocols/linetext2.rb +163 -0
  65. data/lib/protocols/postgres.rb +261 -0
  66. data/lib/protocols/saslauth.rb +179 -0
  67. data/lib/protocols/smtpclient.rb +308 -0
  68. data/lib/protocols/smtpserver.rb +543 -0
  69. data/lib/protocols/stomp.rb +130 -0
  70. data/lib/protocols/tcptest.rb +57 -0
  71. data/setup.rb +1585 -0
  72. metadata +126 -0
data/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,15 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = "eventmachine"
3
+ s.version = "0.12.2"
4
+ s.date = "2008-9-18"
5
+ s.summary = "bugfix for start_tls args, using File.exist checks"
6
+ s.email = "brianmario@me.com"
7
+ s.homepage = "http://github.com/brianmario/eventmachine"
8
+ s.description = "bugfix for start_tls args, using File.exist checks"
9
+ s.has_rdoc = true
10
+ s.authors = ["Brian Lopez"]
11
+ s.files = ["RELEASE_NOTES", "README", "LEGAL", "COPYING", "GNU", "TODO", "DEFERRABLES", "EPOLL", "SPAWNED_PROCESSES", "LIGHTWEIGHT_CONCURRENCY", "SMTP", "PURE_RUBY", "KEYBOARD", "setup.rb", "eventmachine.gemspec", "lib/em", "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", "lib/evma/callback.rb", "lib/evma/container.rb", "lib/evma/factory.rb", "lib/evma/protocol.rb", "lib/evma/reactor.rb", "lib/evma.rb", "lib/jeventmachine.rb", "lib/pr_eventmachine.rb", "lib/protocols", "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/postgres.rb", "lib/protocols/saslauth.rb", "lib/protocols/smtpclient.rb", "lib/protocols/smtpserver.rb", "lib/protocols/stomp.rb", "lib/protocols/tcptest.rb", "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/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"]
12
+ s.test_files = []
13
+ s.extensions = 'ext/extconf.rb'
14
+ s.extra_rdoc_files = ["README"]
15
+ 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,553 @@
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
+
28
+ /***********************
29
+ evma_initialize_library
30
+ ***********************/
31
+
32
+ extern "C" void evma_initialize_library (void(*cb)(const char*, int, const char*, int))
33
+ {
34
+ // Probably a bad idea to mess with the signal mask of a process
35
+ // we're just being linked into.
36
+ //InstallSignalHandlers();
37
+ if (EventMachine)
38
+ throw std::runtime_error ("already initialized");
39
+ EventMachine = new EventMachine_t (cb);
40
+ if (bUseEpoll)
41
+ EventMachine->_UseEpoll();
42
+ if (bUseKqueue)
43
+ EventMachine->_UseKqueue();
44
+ }
45
+
46
+
47
+ /********************
48
+ evma_release_library
49
+ ********************/
50
+
51
+ extern "C" void evma_release_library()
52
+ {
53
+ if (!EventMachine)
54
+ throw std::runtime_error ("not initialized");
55
+ delete EventMachine;
56
+ EventMachine = NULL;
57
+ }
58
+
59
+
60
+ /****************
61
+ evma_run_machine
62
+ ****************/
63
+
64
+ extern "C" void evma_run_machine()
65
+ {
66
+ if (!EventMachine)
67
+ throw std::runtime_error ("not initialized");
68
+ EventMachine->Run();
69
+ }
70
+
71
+
72
+ /**************************
73
+ evma_install_oneshot_timer
74
+ **************************/
75
+
76
+ extern "C" const char *evma_install_oneshot_timer (int seconds)
77
+ {
78
+ if (!EventMachine)
79
+ throw std::runtime_error ("not initialized");
80
+ return EventMachine->InstallOneshotTimer (seconds);
81
+ }
82
+
83
+
84
+ /**********************
85
+ evma_connect_to_server
86
+ **********************/
87
+
88
+ extern "C" const char *evma_connect_to_server (const char *server, int port)
89
+ {
90
+ if (!EventMachine)
91
+ throw std::runtime_error ("not initialized");
92
+ return EventMachine->ConnectToServer (server, port);
93
+ }
94
+
95
+ /***************************
96
+ evma_connect_to_unix_server
97
+ ***************************/
98
+
99
+ extern "C" const char *evma_connect_to_unix_server (const char *server)
100
+ {
101
+ if (!EventMachine)
102
+ throw std::runtime_error ("not initialized");
103
+ return EventMachine->ConnectToUnixServer (server);
104
+ }
105
+
106
+ /**************
107
+ evma_attach_fd
108
+ **************/
109
+
110
+ extern "C" const char *evma_attach_fd (int file_descriptor, int notify_readable, int notify_writable)
111
+ {
112
+ if (!EventMachine)
113
+ throw std::runtime_error ("not initialized");
114
+ return EventMachine->AttachFD (file_descriptor, (notify_readable ? true : false), (notify_writable ? true : false));
115
+ }
116
+
117
+ /**************
118
+ evma_detach_fd
119
+ **************/
120
+
121
+ extern "C" int evma_detach_fd (const char *binding)
122
+ {
123
+ if (!EventMachine)
124
+ throw std::runtime_error ("not initialized");
125
+
126
+ EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding));
127
+ if (ed)
128
+ return EventMachine->DetachFD (ed);
129
+ else
130
+ throw std::runtime_error ("invalid binding to detach");
131
+ }
132
+
133
+ /**********************
134
+ evma_create_tcp_server
135
+ **********************/
136
+
137
+ extern "C" const char *evma_create_tcp_server (const char *address, int port)
138
+ {
139
+ if (!EventMachine)
140
+ throw std::runtime_error ("not initialized");
141
+ return EventMachine->CreateTcpServer (address, port);
142
+ }
143
+
144
+ /******************************
145
+ evma_create_unix_domain_server
146
+ ******************************/
147
+
148
+ extern "C" const char *evma_create_unix_domain_server (const char *filename)
149
+ {
150
+ if (!EventMachine)
151
+ throw std::runtime_error ("not initialized");
152
+ return EventMachine->CreateUnixDomainServer (filename);
153
+ }
154
+
155
+ /*************************
156
+ evma_open_datagram_socket
157
+ *************************/
158
+
159
+ extern "C" const char *evma_open_datagram_socket (const char *address, int port)
160
+ {
161
+ if (!EventMachine)
162
+ throw std::runtime_error ("not initialized");
163
+ return EventMachine->OpenDatagramSocket (address, port);
164
+ }
165
+
166
+ /******************
167
+ evma_open_keyboard
168
+ ******************/
169
+
170
+ extern "C" const char *evma_open_keyboard()
171
+ {
172
+ if (!EventMachine)
173
+ throw std::runtime_error ("not initialized");
174
+ return EventMachine->OpenKeyboard();
175
+ }
176
+
177
+
178
+
179
+ /****************************
180
+ evma_send_data_to_connection
181
+ ****************************/
182
+
183
+ extern "C" int evma_send_data_to_connection (const char *binding, const char *data, int data_length)
184
+ {
185
+ if (!EventMachine)
186
+ throw std::runtime_error ("not initialized");
187
+ return ConnectionDescriptor::SendDataToConnection (binding, data, data_length);
188
+ }
189
+
190
+ /******************
191
+ evma_send_datagram
192
+ ******************/
193
+
194
+ extern "C" int evma_send_datagram (const char *binding, const char *data, int data_length, const char *address, int port)
195
+ {
196
+ if (!EventMachine)
197
+ throw std::runtime_error ("not initialized");
198
+ return DatagramDescriptor::SendDatagram (binding, data, data_length, address, port);
199
+ }
200
+
201
+
202
+ /*********************
203
+ evma_close_connection
204
+ *********************/
205
+
206
+ extern "C" void evma_close_connection (const char *binding, int after_writing)
207
+ {
208
+ if (!EventMachine)
209
+ throw std::runtime_error ("not initialized");
210
+ ConnectionDescriptor::CloseConnection (binding, (after_writing ? true : false));
211
+ }
212
+
213
+ /***********************************
214
+ evma_report_connection_error_status
215
+ ***********************************/
216
+
217
+ extern "C" int evma_report_connection_error_status (const char *binding)
218
+ {
219
+ if (!EventMachine)
220
+ throw std::runtime_error ("not initialized");
221
+ return ConnectionDescriptor::ReportErrorStatus (binding);
222
+ }
223
+
224
+ /********************
225
+ evma_stop_tcp_server
226
+ ********************/
227
+
228
+ extern "C" void evma_stop_tcp_server (const char *binding)
229
+ {
230
+ if (!EventMachine)
231
+ throw std::runtime_error ("not initialized");
232
+ AcceptorDescriptor::StopAcceptor (binding);
233
+ }
234
+
235
+
236
+ /*****************
237
+ evma_stop_machine
238
+ *****************/
239
+
240
+ extern "C" void evma_stop_machine()
241
+ {
242
+ if (!EventMachine)
243
+ throw std::runtime_error ("not initialized");
244
+ EventMachine->ScheduleHalt();
245
+ }
246
+
247
+
248
+ /**************
249
+ evma_start_tls
250
+ **************/
251
+
252
+ extern "C" void evma_start_tls (const char *binding)
253
+ {
254
+ if (!EventMachine)
255
+ throw std::runtime_error ("not initialized");
256
+ EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding));
257
+ if (ed)
258
+ ed->StartTls();
259
+ }
260
+
261
+ /******************
262
+ evma_set_tls_parms
263
+ ******************/
264
+
265
+ extern "C" void evma_set_tls_parms (const char *binding, const char *privatekey_filename, const char *certchain_filename)
266
+ {
267
+ if (!EventMachine)
268
+ throw std::runtime_error ("not initialized");
269
+ EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding));
270
+ if (ed)
271
+ ed->SetTlsParms (privatekey_filename, certchain_filename);
272
+ }
273
+
274
+
275
+ /*****************
276
+ evma_get_peername
277
+ *****************/
278
+
279
+ extern "C" int evma_get_peername (const char *binding, struct sockaddr *sa)
280
+ {
281
+ if (!EventMachine)
282
+ throw std::runtime_error ("not initialized");
283
+ EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding));
284
+ if (ed) {
285
+ return ed->GetPeername (sa) ? 1 : 0;
286
+ }
287
+ else
288
+ return 0;
289
+ }
290
+
291
+ /*****************
292
+ evma_get_sockname
293
+ *****************/
294
+
295
+ extern "C" int evma_get_sockname (const char *binding, struct sockaddr *sa)
296
+ {
297
+ if (!EventMachine)
298
+ throw std::runtime_error ("not initialized");
299
+ EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding));
300
+ if (ed) {
301
+ return ed->GetSockname (sa) ? 1 : 0;
302
+ }
303
+ else
304
+ return 0;
305
+ }
306
+
307
+ /***********************
308
+ evma_get_subprocess_pid
309
+ ***********************/
310
+
311
+ extern "C" int evma_get_subprocess_pid (const char *binding, pid_t *pid)
312
+ {
313
+ if (!EventMachine)
314
+ throw std::runtime_error ("not initialized");
315
+ EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding));
316
+ if (ed) {
317
+ return ed->GetSubprocessPid (pid) ? 1 : 0;
318
+ }
319
+ else
320
+ return 0;
321
+ }
322
+
323
+ /**************************
324
+ evma_get_subprocess_status
325
+ **************************/
326
+
327
+ extern "C" int evma_get_subprocess_status (const char *binding, int *status)
328
+ {
329
+ if (!EventMachine)
330
+ throw std::runtime_error ("not initialized");
331
+ if (status) {
332
+ *status = EventMachine->SubprocessExitStatus;
333
+ return 1;
334
+ }
335
+ else
336
+ return 0;
337
+ }
338
+
339
+
340
+ /*********************
341
+ evma_signal_loopbreak
342
+ *********************/
343
+
344
+ extern "C" void evma_signal_loopbreak()
345
+ {
346
+ if (!EventMachine)
347
+ throw std::runtime_error ("not initialized");
348
+ EventMachine->SignalLoopBreaker();
349
+ }
350
+
351
+
352
+
353
+ /****************
354
+ evma__write_file
355
+ ****************/
356
+
357
+ extern "C" const char *evma__write_file (const char *filename)
358
+ {
359
+ if (!EventMachine)
360
+ throw std::runtime_error ("not initialized");
361
+ return EventMachine->_OpenFileForWriting (filename);
362
+ }
363
+
364
+
365
+ /********************************
366
+ evma_get_comm_inactivity_timeout
367
+ ********************************/
368
+
369
+ extern "C" int evma_get_comm_inactivity_timeout (const char *binding, int *value)
370
+ {
371
+ if (!EventMachine)
372
+ throw std::runtime_error ("not initialized");
373
+ EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding));
374
+ if (ed) {
375
+ return ed->GetCommInactivityTimeout (value);
376
+ }
377
+ else
378
+ return 0; //Perhaps this should be an exception. Access to an unknown binding.
379
+ }
380
+
381
+ /********************************
382
+ evma_set_comm_inactivity_timeout
383
+ ********************************/
384
+
385
+ extern "C" int evma_set_comm_inactivity_timeout (const char *binding, int *value)
386
+ {
387
+ if (!EventMachine)
388
+ throw std::runtime_error ("not initialized");
389
+ EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding));
390
+ if (ed) {
391
+ return ed->SetCommInactivityTimeout (value);
392
+ }
393
+ else
394
+ return 0; //Perhaps this should be an exception. Access to an unknown binding.
395
+ }
396
+
397
+
398
+ /**********************
399
+ evma_set_timer_quantum
400
+ **********************/
401
+
402
+ extern "C" void evma_set_timer_quantum (int interval)
403
+ {
404
+ if (!EventMachine)
405
+ throw std::runtime_error ("not initialized");
406
+ EventMachine->SetTimerQuantum (interval);
407
+ }
408
+
409
+ /************************
410
+ evma_set_max_timer_count
411
+ ************************/
412
+
413
+ extern "C" void evma_set_max_timer_count (int ct)
414
+ {
415
+ // This may only be called if the reactor is not running.
416
+ if (EventMachine)
417
+ throw std::runtime_error ("already initialized");
418
+ EventMachine_t::SetMaxTimerCount (ct);
419
+ }
420
+
421
+ /******************
422
+ evma_setuid_string
423
+ ******************/
424
+
425
+ extern "C" void evma_setuid_string (const char *username)
426
+ {
427
+ // We do NOT need to be running an EM instance because this method is static.
428
+ EventMachine_t::SetuidString (username);
429
+ }
430
+
431
+
432
+ /**********
433
+ evma_popen
434
+ **********/
435
+
436
+ extern "C" const char *evma_popen (char * const*cmd_strings)
437
+ {
438
+ if (!EventMachine)
439
+ throw std::runtime_error ("not initialized");
440
+ return EventMachine->Socketpair (cmd_strings);
441
+ }
442
+
443
+
444
+ /***************************
445
+ evma_get_outbound_data_size
446
+ ***************************/
447
+
448
+ extern "C" int evma_get_outbound_data_size (const char *binding)
449
+ {
450
+ if (!EventMachine)
451
+ throw std::runtime_error ("not initialized");
452
+ EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding));
453
+ return ed ? ed->GetOutboundDataSize() : 0;
454
+ }
455
+
456
+
457
+ /***********
458
+ evma__epoll
459
+ ***********/
460
+
461
+ extern "C" void evma__epoll()
462
+ {
463
+ bUseEpoll = 1;
464
+ }
465
+
466
+ /************
467
+ evma__kqueue
468
+ ************/
469
+
470
+ extern "C" void evma__kqueue()
471
+ {
472
+ bUseKqueue = 1;
473
+ }
474
+
475
+
476
+ /**********************
477
+ evma_set_rlimit_nofile
478
+ **********************/
479
+
480
+ extern "C" int evma_set_rlimit_nofile (int nofiles)
481
+ {
482
+ return EventMachine_t::SetRlimitNofile (nofiles);
483
+ }
484
+
485
+
486
+ /*********************************
487
+ evma_send_file_data_to_connection
488
+ *********************************/
489
+
490
+ extern "C" int evma_send_file_data_to_connection (const char *binding, const char *filename)
491
+ {
492
+ /* This is a sugaring over send_data_to_connection that reads a file into a
493
+ * locally-allocated buffer, and sends the file data to the remote peer.
494
+ * Return the number of bytes written to the caller.
495
+ * TODO, needs to impose a limit on the file size. This is intended only for
496
+ * small files. (I don't know, maybe 8K or less.) For larger files, use interleaved
497
+ * I/O to avoid slowing the rest of the system down.
498
+ * TODO: we should return a code rather than barf, in case of file-not-found.
499
+ * TODO, does this compile on Windows?
500
+ * TODO, given that we want this to work only with small files, how about allocating
501
+ * the buffer on the stack rather than the heap?
502
+ *
503
+ * Modified 25Jul07. This now returns -1 on file-too-large; 0 for success, and a positive
504
+ * errno in case of other errors.
505
+ *
506
+ /* Contributed by Kirk Haines.
507
+ */
508
+
509
+ char data[32*1024];
510
+ int r;
511
+
512
+ if (!EventMachine)
513
+ throw std::runtime_error("not initialized");
514
+
515
+ int Fd = open (filename, O_RDONLY);
516
+
517
+ if (Fd < 0)
518
+ return errno;
519
+ // From here on, all early returns MUST close Fd.
520
+
521
+ struct stat st;
522
+ if (fstat (Fd, &st)) {
523
+ int e = errno;
524
+ close (Fd);
525
+ return e;
526
+ }
527
+
528
+ int filesize = st.st_size;
529
+ if (filesize <= 0) {
530
+ close (Fd);
531
+ return 0;
532
+ }
533
+ else if (filesize > sizeof(data)) {
534
+ close (Fd);
535
+ return -1;
536
+ }
537
+
538
+
539
+ r = read (Fd, data, filesize);
540
+ if (r != filesize) {
541
+ int e = errno;
542
+ close (Fd);
543
+ return e;
544
+ }
545
+ evma_send_data_to_connection (binding, data, r);
546
+ close (Fd);
547
+
548
+ return 0;
549
+ }
550
+
551
+
552
+
553
+