main.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #define _POSIX_C_SOURCE 200801L
  2. #define _POSIX_SOURCE 200801L
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <signal.h>
  6. #include <errno.h>
  7. #include <time.h>
  8. #include "server.h"
  9. #include "monolog.h"
  10. #include "config.h"
  11. #include "state.h"
  12. #include "rh.h"
  13. #include "toruby.h"
  14. DEFINE_FILE_LOGGER(woe_file_logger);
  15. DEFINE_STDOUT_LOGGER(woe_stdout_logger);
  16. DEFINE_STDERR_LOGGER(woe_stderr_logger);
  17. FILE * woe_start_monolog(char * logname) {
  18. FILE * fout;
  19. monolog_init();
  20. LOG_ENABLE_ERROR();
  21. monolog_enable_level("WARNING");
  22. monolog_enable_level("NOTE");
  23. fout = fopen(logname, "w");
  24. monolog_add_logger(NULL, &woe_stdout_logger);
  25. if (fout) {
  26. monolog_add_logger(fout, &woe_file_logger);
  27. fprintf(stderr, "Opened log file %s %p\n", logname, fout);
  28. } else {
  29. fprintf(stderr, "Could not open log file %s\n", logname);
  30. }
  31. return fout;
  32. }
  33. void woe_stop_monolog() {
  34. monolog_done();
  35. }
  36. int main(int argc, char * argv[]) {
  37. sigset_t signal_set = { { 0 } };
  38. sigset_t signal_old = { { 0 } };
  39. siginfo_t signal_info = { 0 };
  40. struct timespec signal_time = { 0, 10 };
  41. struct woe_state state = { 0 };
  42. struct woe_config config = { 0 };
  43. state.config = &config;
  44. FILE * logfile = NULL;
  45. state.mrb = mrb_open();
  46. state.mrb->ud = &state;
  47. tr_init(state.mrb);
  48. woe_config_init_args(state.config, argc, argv);
  49. logfile = woe_start_monolog(state.config->log_file);
  50. state.server = woe_server_new(state.config->port);
  51. woe_server_set_mrb(state.server, state.mrb);
  52. /* Handle all signals, except a few. */
  53. sigfillset(&signal_set);
  54. sigdelset(&signal_set, SIGKILL);
  55. sigdelset(&signal_set, SIGTERM);
  56. sigdelset(&signal_set, SIGINT);
  57. sigdelset(&signal_set, SIGSEGV);
  58. sigdelset(&signal_set, SIGTSTP);
  59. /* Ignore them all, because we will wait for them in stead. */
  60. sigprocmask(SIG_SETMASK, &signal_set, &signal_old);
  61. rh_run_script(state.mrb, "main.rb");
  62. if (woe_server_listen(state.server) > 0) {
  63. LOG_ERROR("Cannot listen. Stop.");
  64. } else {
  65. rh_run_toplevel(state.mrb, "woe_on_start", "");
  66. while (woe_server_busy(state.server)) {
  67. int caught = 0;
  68. woe_server_update(state.server, 1);
  69. caught = sigtimedwait(&signal_set, NULL, &signal_time);
  70. if (caught > 0) {
  71. LOG_NOTE("Received signal %d\n", caught);
  72. rh_run_toplevel(state.mrb, "woe_on_signal", "i", caught);
  73. /* woe_server_request_shutdown(state.server); */
  74. }
  75. }
  76. }
  77. rh_run_toplevel(state.mrb, "woe_on_stop", "");
  78. woe_server_free(state.server);
  79. mrb_close(state.mrb);
  80. LOG_NOTE("Shutting down WOE\n");
  81. woe_stop_monolog();
  82. return 0;
  83. }