toruby.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470
  1. /*
  2. * toruby.c helps expose functionality from C to Mruby for Eruta.
  3. * All functions are prefixed with tr_.
  4. * Look at the tr_*.c files.
  5. * */
  6. #include "toruby.h"
  7. #include "tr_macro.h"
  8. #include "monolog.h"
  9. #include "rh.h"
  10. #include "state.h"
  11. #include "server.h"
  12. #include "libtelnet.h"
  13. #include <signal.h>
  14. #include <mruby/hash.h>
  15. #include <mruby/class.h>
  16. #include <mruby/data.h>
  17. #include <mruby/array.h>
  18. /*
  19. #include "tr_macro.h"
  20. #include "tr_audio.h"
  21. #include "tr_graph.h"
  22. #include "tr_store.h"
  23. #include "tr_sprite.h"
  24. */
  25. /* Documentation of mrb_get_args:
  26. retrieve arguments from mrb_state.
  27. mrb_get_args(mrb, format, ...)
  28. returns number of arguments parsed.
  29. format specifiers:
  30. o: Object [mrb_value]
  31. S: String [mrb_value]
  32. A: Array [mrb_value]
  33. H: Hash [mrb_value]
  34. s: String [char*,int]
  35. z: String [char*] nul terminated
  36. a: Array [mrb_value*,mrb_int]
  37. f: Float [mrb_float]
  38. i: Integer [mrb_int]
  39. b: Binary [int]
  40. n: Symbol [mrb_sym]
  41. &: Block [mrb_value]
  42. *: rest argument [mrb_value*,int]
  43. |: optional
  44. */
  45. /** Writes a NOTE message to the log. */
  46. static mrb_value tr_log(mrb_state * mrb, mrb_value self) {
  47. (void) self; (void) mrb;
  48. mrb_value text = mrb_nil_value();
  49. mrb_get_args(mrb, "S", &text);
  50. LOG_NOTE("%s\n", RSTRING_PTR(text));
  51. return self;
  52. }
  53. /** Writes a messageto a certain log level log. */
  54. static mrb_value tr_log_to(mrb_state * mrb, mrb_value self) {
  55. (void) self; (void) mrb;
  56. mrb_value level = mrb_nil_value();
  57. mrb_value text = mrb_nil_value();
  58. mrb_get_args(mrb, "SS", &level, &text);
  59. LOG_LEVEL(RSTRING_PTR(level), "%s\n", RSTRING_PTR(text));
  60. return self;
  61. }
  62. /** Cause a warning to be logged */
  63. static mrb_value tr_warn(mrb_state * mrb, mrb_value self) {
  64. (void) self; (void) mrb;
  65. mrb_value text = mrb_nil_value();
  66. mrb_get_args(mrb, "S", &text);
  67. LOG_WARNING("%s\n", RSTRING_PTR(text));
  68. return self;
  69. }
  70. /** Enables a certain log level */
  71. static mrb_value tr_log_enable(mrb_state * mrb, mrb_value self) {
  72. (void) self; (void) mrb;
  73. mrb_value text = mrb_nil_value();
  74. mrb_get_args(mrb, "S", &text);
  75. monolog_enable_level(RSTRING_PTR(text));
  76. return self;
  77. }
  78. /** Disables a certain log level */
  79. static mrb_value tr_log_disable(mrb_state * mrb, mrb_value self) {
  80. (void) self; (void) mrb;
  81. mrb_value text = mrb_nil_value();
  82. mrb_get_args(mrb, "S", &text);
  83. monolog_disable_level(RSTRING_PTR(text));
  84. return self;
  85. }
  86. /* Loads another script from the script directory. */
  87. static mrb_value tr_script(mrb_state * mrb, mrb_value self) {
  88. int res;
  89. char * command;
  90. (void) self;
  91. mrb_value text = mrb_nil_value();
  92. mrb_get_args(mrb, "S", &text);
  93. command = mrb_str_to_cstr(mrb, text);
  94. res = rh_run_script(mrb, command);
  95. return mrb_fixnum_value(res);
  96. }
  97. /* Sends data to a given client */
  98. static mrb_value tr_send_to_client(mrb_state * mrb, mrb_value self) {
  99. int res;
  100. mrb_int client = -1;
  101. char * data = NULL;
  102. int size = 0;
  103. struct woe_server * srv = MRB_WOE_SERVER(mrb);
  104. (void) self;
  105. mrb_get_args(mrb, "is", &client, &data, &size);
  106. res = woe_server_send_to_client(srv, client, data, size);
  107. return mrb_fixnum_value(res);
  108. }
  109. /* Shuts down a given client */
  110. static mrb_value tr_server_done(mrb_state * mrb, mrb_value self) {
  111. struct woe_server * srv = MRB_WOE_SERVER(mrb);
  112. (void) self;
  113. woe_server_request_shutdown(srv);
  114. return mrb_nil_value();
  115. }
  116. /* Disconnects a given client by id */
  117. static mrb_value tr_disconnect_client(mrb_state * mrb, mrb_value self) {
  118. int res;
  119. mrb_int client;
  120. struct woe_server * srv = MRB_WOE_SERVER(mrb);
  121. (void) self;
  122. mrb_get_args(mrb, "i", &client);
  123. res = woe_server_disconnect_id(srv, client);
  124. return mrb_fixnum_value(res);
  125. }
  126. /* Yeah, I know, but this reduces boilerplate. */
  127. #define WRAP_SERVER_BEGIN(NAME) \
  128. static mrb_value NAME(mrb_state * mrb, mrb_value self) { \
  129. int res; \
  130. mrb_int client = -1; \
  131. struct woe_server * srv = MRB_WOE_SERVER(mrb); \
  132. (void) self; \
  133. #define WRAP_SERVER_END() \
  134. return mrb_fixnum_value(res); \
  135. }
  136. WRAP_SERVER_BEGIN(tr_server_iac) {
  137. mrb_int command = 0;
  138. mrb_get_args(mrb, "ii", &client, &command);
  139. res = woe_server_iac(srv, client, command);
  140. } WRAP_SERVER_END()
  141. WRAP_SERVER_BEGIN(tr_server_negotiate) {
  142. mrb_int how = 0, option = 0;
  143. mrb_get_args(mrb, "iii", &client, &how, &option);
  144. res = woe_server_negotiate(srv, client, how, option);
  145. } WRAP_SERVER_END()
  146. WRAP_SERVER_BEGIN(tr_server_begin_sb) {
  147. mrb_int telopt = 0;
  148. mrb_get_args(mrb, "ii", &client, &telopt);
  149. res = woe_server_begin_sb(srv, client, telopt);
  150. } WRAP_SERVER_END()
  151. WRAP_SERVER_BEGIN(tr_server_finish_sb) {
  152. mrb_get_args(mrb, "i", &client);
  153. res = woe_server_finish_sb(srv, client);
  154. } WRAP_SERVER_END()
  155. WRAP_SERVER_BEGIN(tr_server_subnegotiation) {
  156. mrb_int telopt = 0, size = 0;
  157. char * data = NULL;
  158. mrb_get_args(mrb, "iis", &client, &telopt, &data, &size);
  159. res = woe_server_subnegotiation(srv, client, telopt, data, size);
  160. } WRAP_SERVER_END()
  161. WRAP_SERVER_BEGIN(tr_server_begin_compress2) {
  162. mrb_get_args(mrb, "i", &client);
  163. res = woe_server_begin_compress2(srv, client);
  164. } WRAP_SERVER_END()
  165. WRAP_SERVER_BEGIN(tr_server_puts) {
  166. char * fmt = NULL;
  167. mrb_get_args(mrb, "iz", &client, &fmt);
  168. res = woe_server_printf(srv, client, fmt);
  169. } WRAP_SERVER_END()
  170. WRAP_SERVER_BEGIN(tr_server_raw_puts) {
  171. char * fmt = NULL;
  172. mrb_get_args(mrb, "iz", &client, &fmt);
  173. res = woe_server_raw_printf(srv, client, fmt);
  174. } WRAP_SERVER_END()
  175. WRAP_SERVER_BEGIN(tr_server_begin_newenviron) {
  176. mrb_int type;
  177. mrb_get_args(mrb, "ii", &client, &type);
  178. res = woe_server_begin_newenviron(srv, client, type);
  179. } WRAP_SERVER_END()
  180. WRAP_SERVER_BEGIN(tr_server_newenviron_value) {
  181. mrb_int type;
  182. char * value = NULL;
  183. mrb_get_args(mrb, "iiz", &client, &type, &value);
  184. res = woe_server_newenviron_value(srv, client, type, value);
  185. } WRAP_SERVER_END()
  186. WRAP_SERVER_BEGIN(tr_server_finish_newenviron) {
  187. mrb_get_args(mrb, "i", &client);
  188. res = woe_server_finish_newenviron(srv, client);
  189. } WRAP_SERVER_END()
  190. WRAP_SERVER_BEGIN(tr_server_ttype_send) {
  191. mrb_get_args(mrb, "i", &client);
  192. res = woe_server_ttype_send(srv, client);
  193. } WRAP_SERVER_END()
  194. WRAP_SERVER_BEGIN(tr_server_ttype_is) {
  195. mrb_int type;
  196. char * ttype = NULL;
  197. mrb_get_args(mrb, "iz", &client, &ttype);
  198. res = woe_server_ttype_is(srv, client, ttype);
  199. } WRAP_SERVER_END()
  200. /*
  201. int woe_server_send_zmp(struct woe_server * srv, int client, int argc, const char ** argv);
  202. int woe_server_send_vzmpv(struct woe_server * srv, int client, va_list va);
  203. int woe_server_send_zmpv(struct woe_server * srv, int client, ...);
  204. */
  205. WRAP_SERVER_BEGIN(tr_server_begin_zmp) {
  206. char * command = NULL;
  207. mrb_get_args(mrb, "iz", &client, &command);
  208. res = woe_server_begin_zmp(srv, client, command);
  209. } WRAP_SERVER_END()
  210. WRAP_SERVER_BEGIN(tr_server_zmp_arg) {
  211. char * arg = NULL;
  212. mrb_get_args(mrb, "iz", &client, &arg);
  213. res = woe_server_zmp_arg(srv, client, arg);
  214. } WRAP_SERVER_END()
  215. WRAP_SERVER_BEGIN(tr_server_finish_zmp) {
  216. char * command;
  217. mrb_get_args(mrb, "iz", &client, &command);
  218. res = woe_server_finish_zmp(srv, client, command);
  219. } WRAP_SERVER_END()
  220. /* Initializes the functionality that Eruta exposes to Ruby. */
  221. int tr_init(mrb_state * mrb) {
  222. // luaL_dostring(lua, "print 'Hello!' ");
  223. struct RClass *woe;
  224. struct RClass *srv;
  225. struct RClass *krn;
  226. struct RClass *tel;
  227. struct RClass *sig;
  228. woe = mrb_define_module(mrb, "Woe");
  229. srv = mrb_define_module_under(mrb, woe, "Server");
  230. tel = mrb_define_module(mrb, "Telnet");
  231. sig = mrb_define_module(mrb, "Signal");
  232. krn = mrb_module_get(mrb, "Kernel");
  233. if(!krn) return -1;
  234. TR_CLASS_METHOD_NOARG(mrb, woe, "quit" , tr_server_done);
  235. TR_CLASS_METHOD_NOARG(mrb, srv, "quit" , tr_server_done);
  236. TR_CLASS_METHOD_ARGC(mrb, srv, "send_to_client" , tr_send_to_client, 2);
  237. TR_CLASS_METHOD_NOARG(mrb, srv, "disconnect" , tr_disconnect_client);
  238. TR_CLASS_METHOD_ARGC(mrb, srv, "iac" , tr_server_iac, 2);
  239. TR_CLASS_METHOD_ARGC(mrb, srv, "negotiate" , tr_server_negotiate , 3);
  240. TR_CLASS_METHOD_ARGC(mrb, srv, "begin_sb" , tr_server_begin_sb , 2);
  241. TR_CLASS_METHOD_ARGC(mrb, srv, "finish_sb" , tr_server_finish_sb , 1);
  242. TR_CLASS_METHOD_ARGC(mrb, srv, "subnegotiation" , tr_server_subnegotiation, 3);
  243. TR_CLASS_METHOD_ARGC(mrb, srv, "begin_compress2", tr_server_begin_compress2, 2);
  244. TR_CLASS_METHOD_ARGC(mrb, srv, "puts" , tr_server_puts, 2);
  245. TR_CLASS_METHOD_ARGC(mrb, srv, "raw_puts" , tr_server_raw_puts, 2);
  246. TR_CLASS_METHOD_ARGC(mrb, srv, "begin_newenviron" , tr_server_begin_newenviron, 2);
  247. TR_CLASS_METHOD_ARGC(mrb, srv, "newenviron_value" , tr_server_newenviron_value, 3);
  248. TR_CLASS_METHOD_ARGC(mrb, srv, "finish_newenviron", tr_server_finish_newenviron, 1);
  249. TR_CLASS_METHOD_ARGC(mrb, srv, "ttype_send" , tr_server_ttype_send, 1);
  250. TR_CLASS_METHOD_ARGC(mrb, srv, "ttype_is" , tr_server_ttype_is, 2);
  251. TR_CLASS_METHOD_ARGC(mrb, srv, "begin_zmp" , tr_server_finish_zmp, 2);
  252. TR_CLASS_METHOD_ARGC(mrb, srv, "zmp_arg" , tr_server_finish_zmp, 2);
  253. TR_CLASS_METHOD_ARGC(mrb, srv, "finish_zmp" , tr_server_finish_zmp, 2);
  254. /* Telnet constants, commands, etc. */
  255. TR_CONST_INT_VALUE(mrb, tel, TELNET_IAC);
  256. TR_CONST_INT_VALUE(mrb, tel, TELNET_DONT);
  257. TR_CONST_INT_VALUE(mrb, tel, TELNET_DO);
  258. TR_CONST_INT_VALUE(mrb, tel, TELNET_WILL);
  259. TR_CONST_INT_VALUE(mrb, tel, TELNET_WONT);
  260. TR_CONST_INT_VALUE(mrb, tel, TELNET_SB);
  261. TR_CONST_INT_VALUE(mrb, tel, TELNET_GA);
  262. TR_CONST_INT_VALUE(mrb, tel, TELNET_EL);
  263. TR_CONST_INT_VALUE(mrb, tel, TELNET_EC);
  264. TR_CONST_INT_VALUE(mrb, tel, TELNET_AYT);
  265. TR_CONST_INT_VALUE(mrb, tel, TELNET_AO);
  266. TR_CONST_INT_VALUE(mrb, tel, TELNET_IP);
  267. TR_CONST_INT_VALUE(mrb, tel, TELNET_BREAK);
  268. TR_CONST_INT_VALUE(mrb, tel, TELNET_DM);
  269. TR_CONST_INT_VALUE(mrb, tel, TELNET_NOP);
  270. TR_CONST_INT_VALUE(mrb, tel, TELNET_SE);
  271. TR_CONST_INT_VALUE(mrb, tel, TELNET_EOR);
  272. TR_CONST_INT_VALUE(mrb, tel, TELNET_ABORT);
  273. TR_CONST_INT_VALUE(mrb, tel, TELNET_SUSP);
  274. TR_CONST_INT_VALUE(mrb, tel, TELNET_EOF);
  275. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_BINARY);
  276. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_ECHO);
  277. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_RCP);
  278. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_SGA);
  279. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_NAMS);
  280. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_STATUS);
  281. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_TM);
  282. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_RCTE);
  283. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_NAOL);
  284. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_NAOP);
  285. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_NAOCRD);
  286. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_NAOHTS);
  287. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_NAOHTD);
  288. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_NAOFFD);
  289. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_NAOVTS);
  290. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_NAOVTD);
  291. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_NAOLFD);
  292. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_XASCII);
  293. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_LOGOUT);
  294. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_BM);
  295. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_DET);
  296. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_SUPDUP);
  297. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_SUPDUPOUTPUT);
  298. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_SNDLOC);
  299. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_TTYPE);
  300. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_EOR);
  301. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_3270REGIME);
  302. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_X3PAD);
  303. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_NAWS);
  304. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_TSPEED);
  305. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_LFLOW);
  306. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_LINEMODE);
  307. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_XDISPLOC);
  308. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_ENVIRON);
  309. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_AUTHENTICATION);
  310. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_ENCRYPT);
  311. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_NEW_ENVIRON);
  312. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_MSSP);
  313. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_COMPRESS);
  314. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_COMPRESS2);
  315. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_ZMP);
  316. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_EXOPL);
  317. TR_CONST_INT_VALUE(mrb, tel, TELNET_TELOPT_MCCP2);
  318. TR_CONST_INT_VALUE(mrb, tel, TELNET_TTYPE_IS);
  319. TR_CONST_INT_VALUE(mrb, tel, TELNET_TTYPE_SEND);
  320. TR_CONST_INT_VALUE(mrb, tel, TELNET_ENVIRON_IS);
  321. TR_CONST_INT_VALUE(mrb, tel, TELNET_ENVIRON_SEND);
  322. TR_CONST_INT_VALUE(mrb, tel, TELNET_ENVIRON_INFO);
  323. TR_CONST_INT_VALUE(mrb, tel, TELNET_ENVIRON_VAR);
  324. TR_CONST_INT_VALUE(mrb, tel, TELNET_ENVIRON_VALUE);
  325. TR_CONST_INT_VALUE(mrb, tel, TELNET_ENVIRON_ESC);
  326. TR_CONST_INT_VALUE(mrb, tel, TELNET_ENVIRON_USERVAR);
  327. TR_CONST_INT_VALUE(mrb, tel, TELNET_MSSP_VAL);
  328. TR_CONST_INT_VALUE(mrb, tel, TELNET_MSSP_VAR);
  329. TR_CONST_INT_VALUE(mrb, tel, TELNET_EOK);
  330. TR_CONST_INT_VALUE(mrb, tel, TELNET_EBADVAL);
  331. TR_CONST_INT_VALUE(mrb, tel, TELNET_ENOMEM);
  332. TR_CONST_INT_VALUE(mrb, tel, TELNET_EOVERFLOW);
  333. TR_CONST_INT_VALUE(mrb, tel, TELNET_EPROTOCOL);
  334. TR_CONST_INT_VALUE(mrb, tel, TELNET_ECOMPRESS);
  335. TR_CONST_INT_VALUE(mrb, sig, SIGHUP);
  336. TR_CONST_INT_VALUE(mrb, sig, SIGINT);
  337. TR_CONST_INT_VALUE(mrb, sig, SIGQUIT);
  338. TR_CONST_INT_VALUE(mrb, sig, SIGILL);
  339. TR_CONST_INT_VALUE(mrb, sig, SIGABRT);
  340. TR_CONST_INT_VALUE(mrb, sig, SIGFPE);
  341. TR_CONST_INT_VALUE(mrb, sig, SIGKILL);
  342. TR_CONST_INT_VALUE(mrb, sig, SIGSEGV);
  343. TR_CONST_INT_VALUE(mrb, sig, SIGPIPE);
  344. TR_CONST_INT_VALUE(mrb, sig, SIGALRM);
  345. TR_CONST_INT_VALUE(mrb, sig, SIGTERM);
  346. TR_CONST_INT_VALUE(mrb, sig, SIGUSR1);
  347. TR_CONST_INT_VALUE(mrb, sig, SIGUSR2);
  348. TR_CONST_INT_VALUE(mrb, sig, SIGCHLD);
  349. TR_CONST_INT_VALUE(mrb, sig, SIGCONT);
  350. TR_CONST_INT_VALUE(mrb, sig, SIGSTOP);
  351. TR_CONST_INT_VALUE(mrb, sig, SIGTSTP);
  352. TR_CONST_INT_VALUE(mrb, sig, SIGTTIN);
  353. TR_CONST_INT_VALUE(mrb, sig, SIGTTOU);
  354. TR_CONST_INT_VALUE(mrb, sig, SIGBUS);
  355. TR_CONST_INT_VALUE(mrb, sig, SIGPOLL);
  356. TR_CONST_INT_VALUE(mrb, sig, SIGPROF);
  357. TR_CONST_INT_VALUE(mrb, sig, SIGSYS);
  358. TR_CONST_INT_VALUE(mrb, sig, SIGTRAP);
  359. TR_CONST_INT_VALUE(mrb, sig, SIGURG);
  360. TR_CONST_INT_VALUE(mrb, sig, SIGVTALRM);
  361. TR_CONST_INT_VALUE(mrb, sig, SIGXCPU);
  362. TR_CONST_INT_VALUE(mrb, sig, SIGXFSZ);
  363. TR_CONST_INT_VALUE(mrb, sig, SIGIOT);
  364. TR_CONST_INT_VALUE(mrb, sig, SIGSTKFLT);
  365. TR_CONST_INT_VALUE(mrb, sig, SIGIO);
  366. TR_CONST_INT_VALUE(mrb, sig, SIGCLD);
  367. TR_CONST_INT_VALUE(mrb, sig, SIGPWR);
  368. TR_CONST_INT_VALUE(mrb, sig, SIGWINCH);
  369. TR_CONST_INT_VALUE(mrb, sig, SIGUNUSED);
  370. TR_METHOD_ARGC(mrb, krn, "woe_warn" , tr_warn , 1);
  371. TR_METHOD_ARGC(mrb, krn, "woe_warning" , tr_warn , 1);
  372. TR_METHOD_ARGC(mrb, krn, "woe_log" , tr_log , 1);
  373. TR_METHOD_ARGC(mrb, krn, "woe_log_to" , tr_log_to , 2);
  374. TR_METHOD_ARGC(mrb, krn, "log_enable" , tr_log_disable , 1);
  375. TR_METHOD_ARGC(mrb, krn, "log_disable" , tr_log_enable , 1);
  376. TR_METHOD_ARGC(mrb, krn, "script" , tr_script , 1);
  377. // must restore gc area here ????
  378. mrb_gc_arena_restore(mrb, 0);
  379. return 0;
  380. }