2017-07-29 12:32:26 +00:00
# include "common.h"
# include "network.h"
2017-09-23 07:40:23 +00:00
# include "connection.h"
2017-09-23 08:35:28 +00:00
# include "misc.h"
2017-07-24 13:18:58 +00:00
# include "log.h"
2017-08-11 04:25:04 +00:00
# include "lib/md5.h"
2017-08-22 16:00:44 +00:00
# include "encrypt.h"
2017-10-30 12:21:27 +00:00
# include "fd_manager.h"
2017-07-26 10:00:45 +00:00
2018-08-29 09:01:37 +00:00
void sigpipe_cb ( struct ev_loop * l , ev_signal * w , int revents )
{
mylog ( log_info , " got sigpipe, ignored " ) ;
}
void sigterm_cb ( struct ev_loop * l , ev_signal * w , int revents )
{
mylog ( log_info , " got sigterm, exit " ) ;
myexit ( 0 ) ;
}
void sigint_cb ( struct ev_loop * l , ev_signal * w , int revents )
{
mylog ( log_info , " got sigint, exit " ) ;
myexit ( 0 ) ;
}
2018-08-29 06:45:57 +00:00
int client_event_loop ( ) ;
int server_event_loop ( ) ;
2017-08-21 12:26:55 +00:00
2017-07-26 11:47:52 +00:00
int main ( int argc , char * argv [ ] )
{
2018-08-29 09:01:37 +00:00
assert ( sizeof ( unsigned short ) = = 2 ) ;
assert ( sizeof ( unsigned int ) = = 4 ) ;
assert ( sizeof ( unsigned long long ) = = 8 ) ;
2020-07-15 19:29:32 +00:00
# ifdef UDP2RAW_MP
init_ws ( ) ;
# endif
2017-07-29 12:32:26 +00:00
dup2 ( 1 , 2 ) ; //redirect stderr to stdout
2018-08-29 10:01:30 +00:00
# if defined(__MINGW32__)
enable_log_color = 0 ;
# endif
2017-08-04 10:35:51 +00:00
2018-08-29 10:01:30 +00:00
pre_process_arg ( argc , argv ) ;
2018-08-29 19:26:34 +00:00
2018-08-29 10:01:30 +00:00
if ( program_mode = = client_mode )
{
struct ev_loop * loop = ev_default_loop ( 0 ) ;
2018-08-29 09:01:37 +00:00
# if !defined(__MINGW32__)
2018-08-29 10:01:30 +00:00
ev_signal signal_watcher_sigpipe ;
ev_signal_init ( & signal_watcher_sigpipe , sigpipe_cb , SIGPIPE ) ;
ev_signal_start ( loop , & signal_watcher_sigpipe ) ;
2018-08-29 09:01:37 +00:00
# endif
2018-08-29 10:01:30 +00:00
ev_signal signal_watcher_sigterm ;
ev_signal_init ( & signal_watcher_sigterm , sigterm_cb , SIGTERM ) ;
ev_signal_start ( loop , & signal_watcher_sigterm ) ;
2017-07-26 11:20:15 +00:00
2018-08-29 10:01:30 +00:00
ev_signal signal_watcher_sigint ;
ev_signal_init ( & signal_watcher_sigint , sigint_cb , SIGINT ) ;
ev_signal_start ( loop , & signal_watcher_sigint ) ;
}
else
{
2020-07-15 19:29:32 +00:00
# ifdef UDP2RAW_LINUX
2018-08-29 10:01:30 +00:00
signal ( SIGINT , signal_handler ) ;
signal ( SIGHUP , signal_handler ) ;
signal ( SIGKILL , signal_handler ) ;
signal ( SIGTERM , signal_handler ) ;
signal ( SIGQUIT , signal_handler ) ;
2020-07-15 19:29:32 +00:00
# else
mylog ( log_fatal , " server mode not supported in multi-platform version \n " ) ;
myexit ( - 1 ) ;
# endif
2018-08-29 10:01:30 +00:00
}
2018-08-29 09:01:37 +00:00
# if !defined(__MINGW32__)
2017-08-17 15:40:17 +00:00
if ( geteuid ( ) ! = 0 )
{
2018-02-24 23:26:29 +00:00
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 " ) ;
2017-12-14 17:25:48 +00:00
}
else
{
mylog ( log_warn , " you can run udp2raw with non-root account for better security. check README.md in repo for more info. \n " ) ;
2017-08-17 15:40:17 +00:00
}
2018-06-05 16:26:55 +00:00
# endif
2017-07-26 11:20:15 +00:00
2018-08-29 09:01:37 +00:00
mylog ( log_info , " remote_ip=[%s], make sure this is a vaild IP address \n " , remote_addr . get_ip ( ) ) ;
2017-07-28 16:22:26 +00:00
2018-08-29 19:26:34 +00:00
//init_random_number_fd();
2017-07-29 12:32:26 +00:00
srand ( get_true_random_number_nz ( ) ) ;
2017-07-21 12:30:27 +00:00
const_id = get_true_random_number_nz ( ) ;
2017-07-18 22:05:08 +00:00
2017-07-29 12:32:26 +00:00
mylog ( log_info , " const_id:%x \n " , const_id ) ;
2017-07-11 10:01:11 +00:00
2018-06-23 21:19:15 +00:00
my_init_keys ( key_string , program_mode = = client_mode ? 1 : 0 ) ;
2017-07-24 03:31:21 +00:00
2017-08-05 09:31:07 +00:00
iptables_rule ( ) ;
2020-07-15 19:29:32 +00:00
# ifdef UDP2RAW_LINUX
2017-08-21 12:26:55 +00:00
init_raw_socket ( ) ;
2020-07-15 19:29:32 +00:00
# endif
2017-08-21 12:26:55 +00:00
2017-07-25 22:29:40 +00:00
if ( program_mode = = client_mode )
2017-07-11 10:01:11 +00:00
{
2017-07-21 12:30:27 +00:00
client_event_loop ( ) ;
2017-07-11 10:01:11 +00:00
}
else
{
2020-07-15 19:29:32 +00:00
# ifdef UDP2RAW_LINUX
2017-07-21 12:30:27 +00:00
server_event_loop ( ) ;
2020-07-15 19:29:32 +00:00
# else
mylog ( log_fatal , " server mode not supported in multi-platform version \n " ) ;
myexit ( - 1 ) ;
# endif
2017-07-11 10:01:11 +00:00
}
return 0 ;
}