eventmachine 0.12.0-i386-mswin32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (104) 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/ext/Makefile +180 -0
  15. data/ext/binder.cpp +126 -0
  16. data/ext/binder.h +48 -0
  17. data/ext/cmain.cpp +527 -0
  18. data/ext/cplusplus.cpp +172 -0
  19. data/ext/ed.cpp +1442 -0
  20. data/ext/ed.h +351 -0
  21. data/ext/em.cpp +1781 -0
  22. data/ext/em.h +167 -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 +83 -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/mkmf.log +129 -0
  34. data/ext/page.cpp +107 -0
  35. data/ext/page.h +51 -0
  36. data/ext/pipe.cpp +327 -0
  37. data/ext/project.h +119 -0
  38. data/ext/rubyeventmachine-i386-mswin32.def +2 -0
  39. data/ext/rubyeventmachine-i386-mswin32.exp +0 -0
  40. data/ext/rubyeventmachine-i386-mswin32.lib +0 -0
  41. data/ext/rubyeventmachine-i386-mswin32.pdb +0 -0
  42. data/ext/rubyeventmachine.so +0 -0
  43. data/ext/rubymain.cpp +630 -0
  44. data/ext/sigs.cpp +89 -0
  45. data/ext/sigs.h +32 -0
  46. data/ext/ssl.cpp +408 -0
  47. data/ext/ssl.h +86 -0
  48. data/ext/vc60.pdb +0 -0
  49. data/lib/em/deferrable.rb +208 -0
  50. data/lib/em/eventable.rb +39 -0
  51. data/lib/em/future.rb +62 -0
  52. data/lib/em/messages.rb +66 -0
  53. data/lib/em/processes.rb +68 -0
  54. data/lib/em/spawnable.rb +88 -0
  55. data/lib/em/streamer.rb +112 -0
  56. data/lib/eventmachine.rb +1621 -0
  57. data/lib/eventmachine_version.rb +31 -0
  58. data/lib/evma.rb +32 -0
  59. data/lib/evma/callback.rb +32 -0
  60. data/lib/evma/container.rb +75 -0
  61. data/lib/evma/factory.rb +77 -0
  62. data/lib/evma/protocol.rb +87 -0
  63. data/lib/evma/reactor.rb +48 -0
  64. data/lib/jeventmachine.rb +106 -0
  65. data/lib/pr_eventmachine.rb +1011 -0
  66. data/lib/protocols/buftok.rb +127 -0
  67. data/lib/protocols/header_and_content.rb +123 -0
  68. data/lib/protocols/httpcli2.rb +784 -0
  69. data/lib/protocols/httpclient.rb +253 -0
  70. data/lib/protocols/line_and_text.rb +122 -0
  71. data/lib/protocols/linetext2.rb +145 -0
  72. data/lib/protocols/saslauth.rb +179 -0
  73. data/lib/protocols/smtpclient.rb +308 -0
  74. data/lib/protocols/smtpserver.rb +543 -0
  75. data/lib/protocols/stomp.rb +127 -0
  76. data/lib/protocols/tcptest.rb +57 -0
  77. data/lib/rubyeventmachine.so +0 -0
  78. data/tests/test_basic.rb +142 -0
  79. data/tests/test_defer.rb +63 -0
  80. data/tests/test_epoll.rb +168 -0
  81. data/tests/test_errors.rb +82 -0
  82. data/tests/test_eventables.rb +78 -0
  83. data/tests/test_exc.rb +58 -0
  84. data/tests/test_futures.rb +214 -0
  85. data/tests/test_hc.rb +221 -0
  86. data/tests/test_httpclient.rb +194 -0
  87. data/tests/test_httpclient2.rb +133 -0
  88. data/tests/test_kb.rb +61 -0
  89. data/tests/test_ltp.rb +190 -0
  90. data/tests/test_ltp2.rb +261 -0
  91. data/tests/test_next_tick.rb +58 -0
  92. data/tests/test_processes.rb +56 -0
  93. data/tests/test_pure.rb +128 -0
  94. data/tests/test_running.rb +47 -0
  95. data/tests/test_sasl.rb +73 -0
  96. data/tests/test_send_file.rb +238 -0
  97. data/tests/test_servers.rb +90 -0
  98. data/tests/test_smtpclient.rb +81 -0
  99. data/tests/test_smtpserver.rb +93 -0
  100. data/tests/test_spawn.rb +329 -0
  101. data/tests/test_timers.rb +138 -0
  102. data/tests/test_ud.rb +43 -0
  103. data/tests/testem.rb +5 -0
  104. metadata +170 -0
data/TODO ADDED
@@ -0,0 +1,10 @@
1
+ $Id: TODO 668 2008-01-04 23:00:34Z blackhedd $
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,180 @@
1
+
2
+ SHELL = /bin/sh
3
+
4
+ #### Start of system configuration section. ####
5
+
6
+ srcdir = .
7
+ topdir = c:/ruby/lib/ruby/1.8/i386-mswin32
8
+ hdrdir = $(topdir)
9
+ VPATH = $(srcdir);$(topdir);$(hdrdir)
10
+
11
+ DESTDIR = c:
12
+ prefix = $(DESTDIR)/ruby
13
+ exec_prefix = $(DESTDIR)/ruby
14
+ sitedir = $(prefix)/lib/ruby/site_ruby
15
+ rubylibdir = $(libdir)/ruby/$(ruby_version)
16
+ archdir = $(rubylibdir)/$(arch)
17
+ sbindir = $(exec_prefix)/sbin
18
+ datadir = $(prefix)/share
19
+ includedir = $(prefix)/include
20
+ infodir = $(prefix)/info
21
+ sysconfdir = $(prefix)/etc
22
+ mandir = $(prefix)/man
23
+ libdir = $(DESTDIR)/ruby/lib
24
+ sharedstatedir = $(DESTDIR)/etc
25
+ oldincludedir = $(DESTDIR)/usr/include
26
+ sitearchdir = $(sitelibdir)/$(sitearch)
27
+ localstatedir = $(DESTDIR)/var
28
+ bindir = $(exec_prefix)/bin
29
+ sitelibdir = $(sitedir)/$(ruby_version)
30
+ libexecdir = $(exec_prefix)/libexec
31
+
32
+ CC = cl -nologo
33
+ LIBRUBY = $(RUBY_SO_NAME).lib
34
+ LIBRUBY_A = msvcrt-ruby18-static.lib
35
+ LIBRUBYARG_SHARED = $(LIBRUBY)
36
+ LIBRUBYARG_STATIC = $(LIBRUBY_A)
37
+
38
+ RUBY_EXTCONF_H =
39
+ CFLAGS = -MD -Zi -O2b2xg- -G6
40
+ INCFLAGS = -I. -I. -Ic:/ruby/lib/ruby/1.8/i386-mswin32 -I.
41
+ CPPFLAGS = -DHAVE_WINDOWS_H -DHAVE_WINSOCK_H -DHAVE_OPENSSL_SSL_H -DHAVE_OPENSSL_ERR_H -D OS_WIN32 -D BUILD_FOR_RUBY -EHs -GR -D WITH_SSL
42
+ CXXFLAGS = $(CFLAGS)
43
+ DLDFLAGS = -link -incremental:no -debug -opt:ref -opt:icf -dll $(LIBPATH) -def:$(DEFFILE) -implib:$(*F:.so=)-$(arch).lib -pdb:$(*F:.so=)-$(arch).pdb
44
+ LDSHARED = cl -nologo -LD
45
+ AR = lib -nologo
46
+ EXEEXT = .exe
47
+
48
+ RUBY_INSTALL_NAME = ruby
49
+ RUBY_SO_NAME = msvcrt-ruby18
50
+ arch = i386-mswin32
51
+ sitearch = i386-msvcrt
52
+ ruby_version = 1.8
53
+ ruby = c:/ruby/bin/ruby
54
+ RUBY = $(ruby:/=\)
55
+ RM = $(RUBY) -run -e rm -- -f
56
+ MAKEDIRS = @$(RUBY) -run -e mkdir -- -p
57
+ INSTALL = @$(RUBY) -run -e install -- -vp
58
+ INSTALL_PROG = $(INSTALL) -m 0755
59
+ INSTALL_DATA = $(INSTALL) -m 0644
60
+ COPY = copy > nul
61
+
62
+ #### End of system configuration section. ####
63
+
64
+ preload =
65
+
66
+ libpath = $(libdir)
67
+ LIBPATH = -libpath:"$(libdir)"
68
+ DEFFILE = $(TARGET)-$(arch).def
69
+
70
+ CLEANFILES =
71
+ DISTCLEANFILES = vc*.pdb $(DEFFILE)
72
+
73
+ extout =
74
+ extout_prefix =
75
+ target_prefix =
76
+ LOCAL_LIBS =
77
+ LIBS = $(LIBRUBYARG_SHARED) libeay32.lib ssleay32.lib gdi32.lib rpcrt4.lib kernel32.lib oldnames.lib user32.lib advapi32.lib ws2_32.lib
78
+ SRCS = binder.cpp cmain.cpp cplusplus.cpp ed.cpp em.cpp emwin.cpp epoll.cpp files.cpp kb.cpp page.cpp pipe.cpp rubymain.cpp sigs.cpp ssl.cpp
79
+ OBJS = binder.obj cmain.obj cplusplus.obj ed.obj em.obj emwin.obj epoll.obj files.obj kb.obj page.obj pipe.obj rubymain.obj sigs.obj ssl.obj
80
+ TARGET = rubyeventmachine
81
+ DLLIB = $(TARGET).so
82
+ EXTSTATIC =
83
+ STATIC_LIB =
84
+
85
+ RUBYCOMMONDIR = $(sitedir)$(target_prefix)
86
+ RUBYLIBDIR = C:/DOCUME~1/PAULAH~1/LOCALS~1/Temp/gembuilder/lib$(target_prefix)
87
+ RUBYARCHDIR = C:/DOCUME~1/PAULAH~1/LOCALS~1/Temp/gembuilder/lib$(target_prefix)
88
+
89
+ TARGET_SO = $(DLLIB)
90
+ CLEANLIBS = $(TARGET).so $(TARGET).il? $(TARGET).tds $(TARGET).map
91
+ CLEANOBJS = *.obj *.lib *.s[ol] *.pdb *.exp *.bak
92
+
93
+ all: $(DLLIB)
94
+ static: $(STATIC_LIB)
95
+
96
+ clean:
97
+ @-$(RM) $(CLEANLIBS:/=\) $(CLEANOBJS:/=\) $(CLEANFILES:/=\)
98
+
99
+ distclean: clean
100
+ @-$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log
101
+ @-$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES:/=\)
102
+
103
+ realclean: distclean
104
+ install: install-so install-rb
105
+
106
+ install-so: $(RUBYARCHDIR)
107
+ install-so: $(RUBYARCHDIR)/$(DLLIB)
108
+ $(RUBYARCHDIR)/$(DLLIB): $(DLLIB)
109
+ $(INSTALL_PROG) $(DLLIB:/=\) $(RUBYARCHDIR:/=\)
110
+ install-rb: pre-install-rb install-rb-default
111
+ install-rb-default: pre-install-rb-default
112
+ pre-install-rb: Makefile
113
+ pre-install-rb-default: Makefile
114
+ $(RUBYARCHDIR):
115
+ $(MAKEDIRS) $@
116
+
117
+ site-install: site-install-so site-install-rb
118
+ site-install-so: install-so
119
+ site-install-rb: install-rb
120
+
121
+ .SUFFIXES: .c .m .cc .cxx .cpp .obj
122
+
123
+ {$(srcdir)}.cc{}.obj:
124
+ $(CXX) $(INCFLAGS) $(CXXFLAGS) $(CPPFLAGS) -c -Tp$(<:\=/)
125
+
126
+ {$(topdir)}.cc{}.obj:
127
+ $(CXX) $(INCFLAGS) $(CXXFLAGS) $(CPPFLAGS) -c -Tp$(<:\=/)
128
+
129
+ {$(hdrdir)}.cc{}.obj:
130
+ $(CXX) $(INCFLAGS) $(CXXFLAGS) $(CPPFLAGS) -c -Tp$(<:\=/)
131
+
132
+ .cc.obj:
133
+ $(CXX) $(INCFLAGS) $(CXXFLAGS) $(CPPFLAGS) -c -Tp$(<:\=/)
134
+
135
+ {$(srcdir)}.cxx{}.obj:
136
+ $(CXX) $(INCFLAGS) $(CXXFLAGS) $(CPPFLAGS) -c -Tp$(<:\=/)
137
+
138
+ {$(topdir)}.cxx{}.obj:
139
+ $(CXX) $(INCFLAGS) $(CXXFLAGS) $(CPPFLAGS) -c -Tp$(<:\=/)
140
+
141
+ {$(hdrdir)}.cxx{}.obj:
142
+ $(CXX) $(INCFLAGS) $(CXXFLAGS) $(CPPFLAGS) -c -Tp$(<:\=/)
143
+
144
+ .cxx.obj:
145
+ $(CXX) $(INCFLAGS) $(CXXFLAGS) $(CPPFLAGS) -c -Tp$(<:\=/)
146
+
147
+ {$(srcdir)}.cpp{}.obj:
148
+ $(CXX) $(INCFLAGS) $(CXXFLAGS) $(CPPFLAGS) -c -Tp$(<:\=/)
149
+
150
+ {$(topdir)}.cpp{}.obj:
151
+ $(CXX) $(INCFLAGS) $(CXXFLAGS) $(CPPFLAGS) -c -Tp$(<:\=/)
152
+
153
+ {$(hdrdir)}.cpp{}.obj:
154
+ $(CXX) $(INCFLAGS) $(CXXFLAGS) $(CPPFLAGS) -c -Tp$(<:\=/)
155
+
156
+ .cpp.obj:
157
+ $(CXX) $(INCFLAGS) $(CXXFLAGS) $(CPPFLAGS) -c -Tp$(<:\=/)
158
+
159
+ {$(srcdir)}.c{}.obj:
160
+ $(CC) $(INCFLAGS) $(CFLAGS) $(CPPFLAGS) -c -Tc$(<:\=/)
161
+
162
+ {$(topdir)}.c{}.obj:
163
+ $(CC) $(INCFLAGS) $(CFLAGS) $(CPPFLAGS) -c -Tc$(<:\=/)
164
+
165
+ {$(hdrdir)}.c{}.obj:
166
+ $(CC) $(INCFLAGS) $(CFLAGS) $(CPPFLAGS) -c -Tc$(<:\=/)
167
+
168
+ .c.obj:
169
+ $(CC) $(INCFLAGS) $(CFLAGS) $(CPPFLAGS) -c -Tc$(<:\=/)
170
+
171
+ $(DLLIB): $(DEFFILE) $(OBJS)
172
+ @-$(RM) $@
173
+ $(LDSHARED) -Fe$(@) $(OBJS) $(LIBS) $(LOCAL_LIBS) $(DLDFLAGS)
174
+
175
+
176
+
177
+ $(DEFFILE):
178
+ $(RUBY) -e "puts 'EXPORTS', 'Init_$(TARGET)'" > $@
179
+
180
+ $(OBJS): {.;$(srcdir);$(topdir);$(hdrdir)}ruby.h {.;$(srcdir);$(topdir);$(hdrdir)}defines.h
@@ -0,0 +1,126 @@
1
+ /*****************************************************************************
2
+
3
+ $Id: binder.cpp 668 2008-01-04 23:00:34Z blackhedd $
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: binder.h 668 2008-01-04 23:00:34Z blackhedd $
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,527 @@
1
+ /*****************************************************************************
2
+
3
+ $Id: cmain.cpp 679 2008-01-19 01:40:06Z blackhedd $
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
+ /**********************
108
+ evma_create_tcp_server
109
+ **********************/
110
+
111
+ extern "C" const char *evma_create_tcp_server (const char *address, int port)
112
+ {
113
+ if (!EventMachine)
114
+ throw std::runtime_error ("not initialized");
115
+ return EventMachine->CreateTcpServer (address, port);
116
+ }
117
+
118
+ /******************************
119
+ evma_create_unix_domain_server
120
+ ******************************/
121
+
122
+ extern "C" const char *evma_create_unix_domain_server (const char *filename)
123
+ {
124
+ if (!EventMachine)
125
+ throw std::runtime_error ("not initialized");
126
+ return EventMachine->CreateUnixDomainServer (filename);
127
+ }
128
+
129
+ /*************************
130
+ evma_open_datagram_socket
131
+ *************************/
132
+
133
+ extern "C" const char *evma_open_datagram_socket (const char *address, int port)
134
+ {
135
+ if (!EventMachine)
136
+ throw std::runtime_error ("not initialized");
137
+ return EventMachine->OpenDatagramSocket (address, port);
138
+ }
139
+
140
+ /******************
141
+ evma_open_keyboard
142
+ ******************/
143
+
144
+ extern "C" const char *evma_open_keyboard()
145
+ {
146
+ if (!EventMachine)
147
+ throw std::runtime_error ("not initialized");
148
+ return EventMachine->OpenKeyboard();
149
+ }
150
+
151
+
152
+
153
+ /****************************
154
+ evma_send_data_to_connection
155
+ ****************************/
156
+
157
+ extern "C" int evma_send_data_to_connection (const char *binding, const char *data, int data_length)
158
+ {
159
+ if (!EventMachine)
160
+ throw std::runtime_error ("not initialized");
161
+ return ConnectionDescriptor::SendDataToConnection (binding, data, data_length);
162
+ }
163
+
164
+ /******************
165
+ evma_send_datagram
166
+ ******************/
167
+
168
+ extern "C" int evma_send_datagram (const char *binding, const char *data, int data_length, const char *address, int port)
169
+ {
170
+ if (!EventMachine)
171
+ throw std::runtime_error ("not initialized");
172
+ return DatagramDescriptor::SendDatagram (binding, data, data_length, address, port);
173
+ }
174
+
175
+
176
+ /*********************
177
+ evma_close_connection
178
+ *********************/
179
+
180
+ extern "C" void evma_close_connection (const char *binding, int after_writing)
181
+ {
182
+ if (!EventMachine)
183
+ throw std::runtime_error ("not initialized");
184
+ ConnectionDescriptor::CloseConnection (binding, (after_writing ? true : false));
185
+ }
186
+
187
+ /***********************************
188
+ evma_report_connection_error_status
189
+ ***********************************/
190
+
191
+ extern "C" int evma_report_connection_error_status (const char *binding)
192
+ {
193
+ if (!EventMachine)
194
+ throw std::runtime_error ("not initialized");
195
+ return ConnectionDescriptor::ReportErrorStatus (binding);
196
+ }
197
+
198
+ /********************
199
+ evma_stop_tcp_server
200
+ ********************/
201
+
202
+ extern "C" void evma_stop_tcp_server (const char *binding)
203
+ {
204
+ if (!EventMachine)
205
+ throw std::runtime_error ("not initialized");
206
+ AcceptorDescriptor::StopAcceptor (binding);
207
+ }
208
+
209
+
210
+ /*****************
211
+ evma_stop_machine
212
+ *****************/
213
+
214
+ extern "C" void evma_stop_machine()
215
+ {
216
+ if (!EventMachine)
217
+ throw std::runtime_error ("not initialized");
218
+ EventMachine->ScheduleHalt();
219
+ }
220
+
221
+
222
+ /**************
223
+ evma_start_tls
224
+ **************/
225
+
226
+ extern "C" void evma_start_tls (const char *binding)
227
+ {
228
+ if (!EventMachine)
229
+ throw std::runtime_error ("not initialized");
230
+ EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding));
231
+ if (ed)
232
+ ed->StartTls();
233
+ }
234
+
235
+ /******************
236
+ evma_set_tls_parms
237
+ ******************/
238
+
239
+ extern "C" void evma_set_tls_parms (const char *binding, const char *privatekey_filename, const char *certchain_filename)
240
+ {
241
+ if (!EventMachine)
242
+ throw std::runtime_error ("not initialized");
243
+ EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding));
244
+ if (ed)
245
+ ed->SetTlsParms (privatekey_filename, certchain_filename);
246
+ }
247
+
248
+
249
+ /*****************
250
+ evma_get_peername
251
+ *****************/
252
+
253
+ extern "C" int evma_get_peername (const char *binding, struct sockaddr *sa)
254
+ {
255
+ if (!EventMachine)
256
+ throw std::runtime_error ("not initialized");
257
+ EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding));
258
+ if (ed) {
259
+ return ed->GetPeername (sa) ? 1 : 0;
260
+ }
261
+ else
262
+ return 0;
263
+ }
264
+
265
+ /*****************
266
+ evma_get_sockname
267
+ *****************/
268
+
269
+ extern "C" int evma_get_sockname (const char *binding, struct sockaddr *sa)
270
+ {
271
+ if (!EventMachine)
272
+ throw std::runtime_error ("not initialized");
273
+ EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding));
274
+ if (ed) {
275
+ return ed->GetSockname (sa) ? 1 : 0;
276
+ }
277
+ else
278
+ return 0;
279
+ }
280
+
281
+ /***********************
282
+ evma_get_subprocess_pid
283
+ ***********************/
284
+
285
+ extern "C" int evma_get_subprocess_pid (const char *binding, pid_t *pid)
286
+ {
287
+ if (!EventMachine)
288
+ throw std::runtime_error ("not initialized");
289
+ EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding));
290
+ if (ed) {
291
+ return ed->GetSubprocessPid (pid) ? 1 : 0;
292
+ }
293
+ else
294
+ return 0;
295
+ }
296
+
297
+ /**************************
298
+ evma_get_subprocess_status
299
+ **************************/
300
+
301
+ extern "C" int evma_get_subprocess_status (const char *binding, int *status)
302
+ {
303
+ if (!EventMachine)
304
+ throw std::runtime_error ("not initialized");
305
+ if (status) {
306
+ *status = EventMachine->SubprocessExitStatus;
307
+ return 1;
308
+ }
309
+ else
310
+ return 0;
311
+ }
312
+
313
+
314
+ /*********************
315
+ evma_signal_loopbreak
316
+ *********************/
317
+
318
+ extern "C" void evma_signal_loopbreak()
319
+ {
320
+ if (!EventMachine)
321
+ throw std::runtime_error ("not initialized");
322
+ EventMachine->SignalLoopBreaker();
323
+ }
324
+
325
+
326
+
327
+ /****************
328
+ evma__write_file
329
+ ****************/
330
+
331
+ extern "C" const char *evma__write_file (const char *filename)
332
+ {
333
+ if (!EventMachine)
334
+ throw std::runtime_error ("not initialized");
335
+ return EventMachine->_OpenFileForWriting (filename);
336
+ }
337
+
338
+
339
+ /********************************
340
+ evma_get_comm_inactivity_timeout
341
+ ********************************/
342
+
343
+ extern "C" int evma_get_comm_inactivity_timeout (const char *binding, int *value)
344
+ {
345
+ if (!EventMachine)
346
+ throw std::runtime_error ("not initialized");
347
+ EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding));
348
+ if (ed) {
349
+ return ed->GetCommInactivityTimeout (value);
350
+ }
351
+ else
352
+ return 0; //Perhaps this should be an exception. Access to an unknown binding.
353
+ }
354
+
355
+ /********************************
356
+ evma_set_comm_inactivity_timeout
357
+ ********************************/
358
+
359
+ extern "C" int evma_set_comm_inactivity_timeout (const char *binding, int *value)
360
+ {
361
+ if (!EventMachine)
362
+ throw std::runtime_error ("not initialized");
363
+ EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding));
364
+ if (ed) {
365
+ return ed->SetCommInactivityTimeout (value);
366
+ }
367
+ else
368
+ return 0; //Perhaps this should be an exception. Access to an unknown binding.
369
+ }
370
+
371
+
372
+ /**********************
373
+ evma_set_timer_quantum
374
+ **********************/
375
+
376
+ extern "C" void evma_set_timer_quantum (int interval)
377
+ {
378
+ if (!EventMachine)
379
+ throw std::runtime_error ("not initialized");
380
+ EventMachine->SetTimerQuantum (interval);
381
+ }
382
+
383
+ /************************
384
+ evma_set_max_timer_count
385
+ ************************/
386
+
387
+ extern "C" void evma_set_max_timer_count (int ct)
388
+ {
389
+ // This may only be called if the reactor is not running.
390
+ if (EventMachine)
391
+ throw std::runtime_error ("already initialized");
392
+ EventMachine_t::SetMaxTimerCount (ct);
393
+ }
394
+
395
+ /******************
396
+ evma_setuid_string
397
+ ******************/
398
+
399
+ extern "C" void evma_setuid_string (const char *username)
400
+ {
401
+ // We do NOT need to be running an EM instance because this method is static.
402
+ EventMachine_t::SetuidString (username);
403
+ }
404
+
405
+
406
+ /**********
407
+ evma_popen
408
+ **********/
409
+
410
+ extern "C" const char *evma_popen (char * const*cmd_strings)
411
+ {
412
+ if (!EventMachine)
413
+ throw std::runtime_error ("not initialized");
414
+ return EventMachine->Socketpair (cmd_strings);
415
+ }
416
+
417
+
418
+ /***************************
419
+ evma_get_outbound_data_size
420
+ ***************************/
421
+
422
+ extern "C" int evma_get_outbound_data_size (const char *binding)
423
+ {
424
+ if (!EventMachine)
425
+ throw std::runtime_error ("not initialized");
426
+ EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding));
427
+ return ed ? ed->GetOutboundDataSize() : 0;
428
+ }
429
+
430
+
431
+ /***********
432
+ evma__epoll
433
+ ***********/
434
+
435
+ extern "C" void evma__epoll()
436
+ {
437
+ bUseEpoll = 1;
438
+ }
439
+
440
+ /************
441
+ evma__kqueue
442
+ ************/
443
+
444
+ extern "C" void evma__kqueue()
445
+ {
446
+ bUseKqueue = 1;
447
+ }
448
+
449
+
450
+ /**********************
451
+ evma_set_rlimit_nofile
452
+ **********************/
453
+
454
+ extern "C" int evma_set_rlimit_nofile (int nofiles)
455
+ {
456
+ return EventMachine_t::SetRlimitNofile (nofiles);
457
+ }
458
+
459
+
460
+ /*********************************
461
+ evma_send_file_data_to_connection
462
+ *********************************/
463
+
464
+ extern "C" int evma_send_file_data_to_connection (const char *binding, const char *filename)
465
+ {
466
+ /* This is a sugaring over send_data_to_connection that reads a file into a
467
+ * locally-allocated buffer, and sends the file data to the remote peer.
468
+ * Return the number of bytes written to the caller.
469
+ * TODO, needs to impose a limit on the file size. This is intended only for
470
+ * small files. (I don't know, maybe 8K or less.) For larger files, use interleaved
471
+ * I/O to avoid slowing the rest of the system down.
472
+ * TODO: we should return a code rather than barf, in case of file-not-found.
473
+ * TODO, does this compile on Windows?
474
+ * TODO, given that we want this to work only with small files, how about allocating
475
+ * the buffer on the stack rather than the heap?
476
+ *
477
+ * Modified 25Jul07. This now returns -1 on file-too-large; 0 for success, and a positive
478
+ * errno in case of other errors.
479
+ *
480
+ /* Contributed by Kirk Haines.
481
+ */
482
+
483
+ char data[32*1024];
484
+ int r;
485
+
486
+ if (!EventMachine)
487
+ throw std::runtime_error("not initialized");
488
+
489
+ int Fd = open (filename, O_RDONLY);
490
+
491
+ if (Fd < 0)
492
+ return errno;
493
+ // From here on, all early returns MUST close Fd.
494
+
495
+ struct stat st;
496
+ if (fstat (Fd, &st)) {
497
+ int e = errno;
498
+ close (Fd);
499
+ return e;
500
+ }
501
+
502
+ int filesize = st.st_size;
503
+ if (filesize <= 0) {
504
+ close (Fd);
505
+ return 0;
506
+ }
507
+ else if (filesize > sizeof(data)) {
508
+ close (Fd);
509
+ return -1;
510
+ }
511
+
512
+
513
+ r = read (Fd, data, filesize);
514
+ if (r != filesize) {
515
+ int e = errno;
516
+ close (Fd);
517
+ return e;
518
+ }
519
+ evma_send_data_to_connection (binding, data, r);
520
+ close (Fd);
521
+
522
+ return 0;
523
+ }
524
+
525
+
526
+
527
+