main.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #include "common.h"
  2. #include "network.h"
  3. #include "connection.h"
  4. #include "misc.h"
  5. #include "log.h"
  6. #include "lib/md5.h"
  7. #include "encrypt.h"
  8. #include "fd_manager.h"
  9. void sigpipe_cb(struct ev_loop *l, ev_signal *w, int revents)
  10. {
  11. mylog(log_info, "got sigpipe, ignored");
  12. }
  13. void sigterm_cb(struct ev_loop *l, ev_signal *w, int revents)
  14. {
  15. mylog(log_info, "got sigterm, exit");
  16. myexit(0);
  17. }
  18. void sigint_cb(struct ev_loop *l, ev_signal *w, int revents)
  19. {
  20. mylog(log_info, "got sigint, exit");
  21. myexit(0);
  22. }
  23. int client_event_loop();
  24. int server_event_loop();
  25. int main(int argc, char *argv[])
  26. {
  27. assert(sizeof(unsigned short)==2);
  28. assert(sizeof(unsigned int)==4);
  29. assert(sizeof(unsigned long long)==8);
  30. #ifdef UDP2RAW_MP
  31. init_ws();
  32. #endif
  33. dup2(1, 2);//redirect stderr to stdout
  34. #if defined(__MINGW32__)
  35. enable_log_color=0;
  36. #endif
  37. pre_process_arg(argc,argv);
  38. if(program_mode==client_mode)
  39. {
  40. struct ev_loop* loop=ev_default_loop(0);
  41. #if !defined(__MINGW32__)
  42. ev_signal signal_watcher_sigpipe;
  43. ev_signal_init(&signal_watcher_sigpipe, sigpipe_cb, SIGPIPE);
  44. ev_signal_start(loop, &signal_watcher_sigpipe);
  45. #endif
  46. ev_signal signal_watcher_sigterm;
  47. ev_signal_init(&signal_watcher_sigterm, sigterm_cb, SIGTERM);
  48. ev_signal_start(loop, &signal_watcher_sigterm);
  49. ev_signal signal_watcher_sigint;
  50. ev_signal_init(&signal_watcher_sigint, sigint_cb, SIGINT);
  51. ev_signal_start(loop, &signal_watcher_sigint);
  52. }
  53. else
  54. {
  55. #ifdef UDP2RAW_LINUX
  56. signal(SIGINT, signal_handler);
  57. signal(SIGHUP, signal_handler);
  58. signal(SIGKILL, signal_handler);
  59. signal(SIGTERM, signal_handler);
  60. signal(SIGQUIT, signal_handler);
  61. #else
  62. mylog(log_fatal,"server mode not supported in multi-platform version\n");
  63. myexit(-1);
  64. #endif
  65. }
  66. #if !defined(__MINGW32__)
  67. if(geteuid() != 0)
  68. {
  69. mylog(log_warn,"root check failed, it seems like you are using a non-root account. we can try to continue, but it may fail. If you want to run udp2raw as non-root, you have to add iptables rule manually, and grant udp2raw CAP_NET_RAW capability, check README.md in repo for more info.\n");
  70. }
  71. else
  72. {
  73. mylog(log_warn,"you can run udp2raw with non-root account for better security. check README.md in repo for more info.\n");
  74. }
  75. #endif
  76. mylog(log_info,"remote_ip=[%s], make sure this is a vaild IP address\n",remote_addr.get_ip());
  77. //init_random_number_fd();
  78. srand(get_true_random_number_nz());
  79. const_id=get_true_random_number_nz();
  80. mylog(log_info,"const_id:%x\n",const_id);
  81. my_init_keys(key_string,program_mode==client_mode?1:0);
  82. iptables_rule();
  83. #ifdef UDP2RAW_LINUX
  84. init_raw_socket();
  85. #endif
  86. if(program_mode==client_mode)
  87. {
  88. client_event_loop();
  89. }
  90. else
  91. {
  92. #ifdef UDP2RAW_LINUX
  93. server_event_loop();
  94. #else
  95. mylog(log_fatal,"server mode not supported in multi-platform version\n");
  96. myexit(-1);
  97. #endif
  98. }
  99. return 0;
  100. }