diff options
Diffstat (limited to 'src/common/socket.c')
-rw-r--r-- | src/common/socket.c | 140 |
1 files changed, 70 insertions, 70 deletions
diff --git a/src/common/socket.c b/src/common/socket.c index b6e73bce5..af5e8aa73 100644 --- a/src/common/socket.c +++ b/src/common/socket.c @@ -40,37 +40,37 @@ #ifdef SOCKET_EPOLL #include <sys/epoll.h> -#endif +#endif // SOCKET_EPOLL #ifdef WIN32 # include "common/winapi.h" -#else +#else // WIN32 # include <arpa/inet.h> # include <errno.h> # include <net/if.h> # include <netdb.h> #if defined __linux__ || defined __linux # include <linux/tcp.h> -#else +#else // defined __linux__ || defined __linux # include <netinet/in.h> # include <netinet/tcp.h> -#endif +#endif // defined __linux__ || defined __linux # include <sys/ioctl.h> # include <sys/socket.h> # include <sys/time.h> # include <unistd.h> -# ifndef SIOCGIFCONF -# include <sys/sockio.h> // SIOCGIFCONF on Solaris, maybe others? [Shinomori] -# endif -# ifndef FIONBIO -# include <sys/filio.h> // FIONBIO on Solaris [FlavioJS] -# endif +#ifndef SIOCGIFCONF +# include <sys/sockio.h> // SIOCGIFCONF on Solaris, maybe others? [Shinomori] +#endif // SIOCGIFCONF +#ifndef FIONBIO +# include <sys/filio.h> // FIONBIO on Solaris [FlavioJS] +#endif // FIONBIO -# ifdef HAVE_SETRLIMIT -# include <sys/resource.h> -# endif -#endif +#ifdef HAVE_SETRLIMIT +# include <sys/resource.h> +#endif // HAVE_SETRLIMIT +#endif // WIN32 /** * Socket Interface Source @@ -86,7 +86,7 @@ struct socket_data **session; void send_shortlist_add_fd(int fd); // Do pending network sends (and eof handling) from the shortlist. void send_shortlist_do_sends(void); -#endif +#endif // SEND_SHORTLIST ///////////////////////////////////////////////////////////////////// #if defined(WIN32) @@ -216,7 +216,7 @@ char* sErr(int code) #define sFD_ZERO FD_ZERO ///////////////////////////////////////////////////////////////////// -#else +#else // defined(WIN32) ///////////////////////////////////////////////////////////////////// // nix portability layer @@ -248,40 +248,40 @@ char* sErr(int code) #define sFD_ZERO FD_ZERO ///////////////////////////////////////////////////////////////////// -#endif +#endif // defined(WIN32) ///////////////////////////////////////////////////////////////////// #ifndef MSG_NOSIGNAL #define MSG_NOSIGNAL 0 -#endif +#endif // MSG_NOSIGNAL #ifndef SOCKET_EPOLL // Select based Event Dispatcher: fd_set readfds; -#else +#else // SOCKET_EPOLL // Epoll based Event Dispatcher: static int epoll_maxevents = (FD_SETSIZE / 2); static int epfd = SOCKET_ERROR; static struct epoll_event epevent; static struct epoll_event *epevents = NULL; -#endif +#endif // SOCKET_EPOLL // Maximum packet size in bytes, which the client is able to handle. // Larger packets cause a buffer overflow and stack corruption. #if PACKETVER >= 20131223 static size_t socket_max_client_packet = 0xFFFF; -#else +#else // PACKETVER >= 20131223 static size_t socket_max_client_packet = 0x6000; -#endif +#endif // PACKETVER >= 20131223 #ifdef SHOW_SERVER_STATS // Data I/O statistics static size_t socket_data_i = 0, socket_data_ci = 0, socket_data_qi = 0; static size_t socket_data_o = 0, socket_data_co = 0, socket_data_qo = 0; static time_t socket_data_last_tick = 0; -#endif +#endif // SHOW_SERVER_STATS // initial recv buffer size (this will also be the max. size) // biggest known packet: S 0153 <len>.w <emblem data>.?B -> 24x24 256 color .bmp (0153 + len.w + 1618/1654/1756 bytes) @@ -297,14 +297,14 @@ static time_t socket_data_last_tick = 0; int send_shortlist_array[FD_SETSIZE];// we only support FD_SETSIZE sockets, limit the array to that int send_shortlist_count = 0;// how many fd's are in the shortlist uint32 send_shortlist_set[(FD_SETSIZE+31)/32];// to know if specific fd's are already in the shortlist -#endif +#endif // SEND_SHORTLIST static int create_session(int fd, RecvFunc func_recv, SendFunc func_send, ParseFunc func_parse); #ifndef MINICORE int ip_rules = 1; static int connect_check(uint32 ip); -#endif +#endif // MINICORE const char* error_msg(void) { @@ -397,11 +397,11 @@ void setsocketopts(int fd, struct hSockOpt *opt) #ifdef TCP_THIN_LINEAR_TIMEOUTS if (sSetsockopt(fd, IPPROTO_TCP, TCP_THIN_LINEAR_TIMEOUTS, (char *)&yes, sizeof(yes))) ShowWarning("setsocketopts: Unable to set TCP_THIN_LINEAR_TIMEOUTS mode for connection #%d!\n", fd); -#endif +#endif // TCP_THIN_LINEAR_TIMEOUTS #ifdef TCP_THIN_DUPACK if (sSetsockopt(fd, IPPROTO_TCP, TCP_THIN_DUPACK, (char *)&yes, sizeof(yes))) ShowWarning("setsocketopts: Unable to set TCP_THIN_DUPACK mode for connection #%d!\n", fd); -#endif +#endif // TCP_THIN_DUPACK } /*====================================== @@ -413,7 +413,7 @@ void set_eof(int fd) #ifdef SEND_SHORTLIST // Add this socket to the shortlist for eof handling. send_shortlist_add_fd(fd); -#endif +#endif // SEND_SHORTLIST sockt->session[fd]->flag.eof = 1; } } @@ -451,7 +451,7 @@ int recv_to_fifo(int fd) { socket_data_ci += len; } -#endif +#endif // SHOW_SERVER_STATS return 0; } @@ -468,12 +468,12 @@ int send_from_fifo(int fd) len = sSend(fd, (const char *) sockt->session[fd]->wdata, (int)sockt->session[fd]->wdata_size, MSG_NOSIGNAL); if( len == SOCKET_ERROR ) - {//An exception has occurred + { //An exception has occurred if( sErrno != S_EWOULDBLOCK ) { //ShowDebug("send_from_fifo: %s, ending connection #%d\n", error_msg(), fd); #ifdef SHOW_SERVER_STATS socket_data_qo -= sockt->session[fd]->wdata_size; -#endif +#endif // SHOW_SERVER_STATS sockt->session[fd]->wdata_size = 0; //Clear the send queue as we can't send anymore. [Skotlex] sockt->eof(fd); } @@ -495,7 +495,7 @@ int send_from_fifo(int fd) { socket_data_co += len; } -#endif +#endif // SHOW_SERVER_STATS } return 0; @@ -549,13 +549,13 @@ int connect_client(int listen_fd) { sockt->close(fd); return -1; } -#endif +#endif // MINICORE #ifndef SOCKET_EPOLL // Select Based Event Dispatcher sFD_SET(fd,&readfds); -#else +#else // SOCKET_EPOLL // Epoll based Event Dispatcher epevent.data.fd = fd; epevent.events = EPOLLIN; @@ -566,7 +566,7 @@ int connect_client(int listen_fd) { return -1; } -#endif +#endif // SOCKET_EPOLL if( sockt->fd_max <= fd ) sockt->fd_max = fd + 1; @@ -622,7 +622,7 @@ int make_listen_bind(uint32 ip, uint16 port) // Select Based Event Dispatcher sFD_SET(fd,&readfds); -#else +#else // SOCKET_EPOLL // Epoll based Event Dispatcher epevent.data.fd = fd; epevent.events = EPOLLIN; @@ -633,7 +633,7 @@ int make_listen_bind(uint32 ip, uint16 port) exit(EXIT_FAILURE); } -#endif +#endif // SOCKET_EPOLL if(sockt->fd_max <= fd) sockt->fd_max = fd + 1; @@ -691,7 +691,7 @@ int make_connection(uint32 ip, uint16 port, struct hSockOpt *opt) { // Select Based Event Dispatcher sFD_SET(fd,&readfds); -#else +#else // SOCKET_EPOLL // Epoll based Event Dispatcher epevent.data.fd = fd; epevent.events = EPOLLIN; @@ -702,7 +702,7 @@ int make_connection(uint32 ip, uint16 port, struct hSockOpt *opt) { return -1; } -#endif +#endif // SOCKET_EPOLL if(sockt->fd_max <= fd) sockt->fd_max = fd + 1; @@ -734,7 +734,7 @@ static void delete_session(int fd) #ifdef SHOW_SERVER_STATS socket_data_qi -= sockt->session[fd]->rdata_size - sockt->session[fd]->rdata_pos; socket_data_qo -= sockt->session[fd]->wdata_size; -#endif +#endif // SHOW_SERVER_STATS aFree(sockt->session[fd]->rdata); aFree(sockt->session[fd]->wdata); if( sockt->session[fd]->session_data ) @@ -807,7 +807,7 @@ int rfifoskip(int fd, size_t len) s->rdata_pos = s->rdata_pos + len; #ifdef SHOW_SERVER_STATS socket_data_qi -= len; -#endif +#endif // SHOW_SERVER_STATS return 0; } @@ -858,7 +858,7 @@ int wfifoset(int fd, size_t len) s->wdata_size += len; #ifdef SHOW_SERVER_STATS socket_data_qo += len; -#endif +#endif // SHOW_SERVER_STATS //If the interserver has 200% of its normal size full, flush the data. if( s->flag.server && s->wdata_size >= 2*FIFOSIZE_SERVERLINK ) sockt->flush(fd); @@ -872,7 +872,7 @@ int wfifoset(int fd, size_t len) #ifdef SEND_SHORTLIST send_shortlist_add_fd(fd); -#endif +#endif // SEND_SHORTLIST return 0; } @@ -882,14 +882,14 @@ int do_sockets(int next) #ifndef SOCKET_EPOLL fd_set rfd; struct timeval timeout; -#endif +#endif // SOCKET_EPOLL int ret,i; // PRESEND Timers are executed before do_sendrecv and can send packets and/or set sessions to eof. // Send remaining data and process client-side disconnects here. #ifdef SEND_SHORTLIST send_shortlist_do_sends(); -#else +#else // SEND_SHORTLIST for (i = 1; i < sockt->fd_max; i++) { if(!sockt->session[fd] @@ -898,7 +898,7 @@ int do_sockets(int next) if(sockt->session[fd]>wdata_size) sockt->session[fd]>func_send(i); } -#endif +#endif // SEND_SHORTLIST #ifndef SOCKET_EPOLL // Select based Event Dispatcher: @@ -919,7 +919,7 @@ int do_sockets(int next) } return 0; // interrupted by a signal, just loop and try again } -#else +#else // SOCKET_EPOLL // Epoll based Event Dispatcher ret = epoll_wait(epfd, epevents, epoll_maxevents, next); @@ -932,7 +932,7 @@ int do_sockets(int next) } return 0; // interrupted by a signal, just loop and try again } -#endif +#endif // SOCKET_EPOLL sockt->last_tick = time(NULL); @@ -970,7 +970,7 @@ int do_sockets(int next) } -#else +#else // defined(SOCKET_EPOLL) // otherwise assume that the fd_set is a bit-array and enumerate it in a standard way for( i = 1; ret && i < sockt->fd_max; ++i ) { @@ -980,12 +980,12 @@ int do_sockets(int next) --ret; } } -#endif +#endif // defined(SOCKET_EPOLL) // POSTSEND Send remaining data and handle eof sessions. #ifdef SEND_SHORTLIST send_shortlist_do_sends(); -#else +#else // SEND_SHORTLIST for (i = 1; i < sockt->fd_max; i++) { if(!sockt->session[i]) @@ -999,7 +999,7 @@ int do_sockets(int next) sockt->session[i]->func_parse(i); //This should close the session immediately. } } -#endif +#endif // SEND_SHORTLIST // parse input data on each socket for(i = 1; i < sockt->fd_max; i++) @@ -1042,14 +1042,14 @@ int do_sockets(int next) sprintf(buf, "In: %.03f kB/s (%.03f kB/s, Q: %.03f kB) | Out: %.03f kB/s (%.03f kB/s, Q: %.03f kB) | RAM: %.03f MB", socket_data_i/1024., socket_data_ci/1024., socket_data_qi/1024., socket_data_o/1024., socket_data_co/1024., socket_data_qo/1024., iMalloc->usage()/1024.); #ifdef _WIN32 SetConsoleTitle(buf); -#else +#else // _WIN32 ShowMessage("\033[s\033[1;1H\033[2K%s\033[u", buf); -#endif +#endif // _WIN32 socket_data_last_tick = sockt->last_tick; socket_data_i = socket_data_ci = 0; socket_data_o = socket_data_co = 0; } -#endif +#endif // SHOW_SERVER_STATS return 0; } @@ -1271,7 +1271,7 @@ int access_ipmask(const char* str, AccessControl* acc) return 1; } ////////////////////////////// -#endif +#endif // MINICORE ////////////////////////////// int socket_config_read(const char* cfgName) @@ -1296,14 +1296,14 @@ int socket_config_read(const char* cfgName) if( sockt->stall_time < 3 ) sockt->stall_time = 3;/* a minimum is required to refrain it from killing itself */ } -#ifdef SOCKET_EPOLL +#ifdef SOCKET_EPOLL else if(!strcmpi(w1, "epoll_maxevents")) { epoll_maxevents = atoi(w2); if(epoll_maxevents < 16){ epoll_maxevents = 16; // minimum that seems to be useful } } -#endif +#endif // SOCKET_EPOLL #ifndef MINICORE else if (!strcmpi(w1, "enable_ip_rules")) { ip_rules = config_switch(w2); @@ -1337,7 +1337,7 @@ int socket_config_read(const char* cfgName) access_debug = config_switch(w2); else if (!strcmpi(w1,"socket_max_client_packet")) socket_max_client_packet = strtoul(w2, NULL, 0); -#endif +#endif // MINICORE else if (!strcmpi(w1, "import")) socket_config_read(w2); else @@ -1358,7 +1358,7 @@ void socket_final(void) aFree(access_allow); if( access_deny ) aFree(access_deny); -#endif +#endif // MINICORE for( i = 1; i < sockt->fd_max; i++ ) if(sockt->session[i]) @@ -1384,7 +1384,7 @@ void socket_final(void) aFree(epevents); epevents = NULL; } -#endif +#endif // SOCKET_EPOLL } @@ -1399,12 +1399,12 @@ void socket_close(int fd) #ifndef SOCKET_EPOLL // Select based Event Dispatcher sFD_CLR(fd, &readfds);// this needs to be done before closing the socket -#else +#else // SOCKET_EPOLL // Epoll based Event Dispatcher epevent.data.fd = fd; epevent.events = EPOLLIN; epoll_ctl(epfd, EPOLL_CTL_DEL, fd, &epevent); // removing the socket from epoll when it's being closed is not required but recommended -#endif +#endif // SOCKET_EPOLL sShutdown(fd, SHUT_RDWR); // Disallow further reads/writes sClose(fd); // We don't really care if these closing functions return an error, we are just shutting down and not reusing this socket. @@ -1542,7 +1542,7 @@ void socket_init(void) } } } -#endif +#endif // defined(HAVE_SETRLIMIT) && !defined(CYGWIN) // Get initial local ips sockt->naddr_ = sockt->getips(sockt->addr_,16); @@ -1554,7 +1554,7 @@ void socket_init(void) sFD_ZERO(&readfds); ShowInfo("Server uses '" CL_WHITE "select" CL_RESET "' as event dispatcher\n"); -#else +#else // SOCKET_EPOLL // Epoll based Event Dispatcher: epfd = epoll_create(FD_SETSIZE); // 2.6.8 or newer ignores the expected socket amount argument if(epfd == SOCKET_ERROR){ @@ -1567,11 +1567,11 @@ void socket_init(void) ShowInfo("Server uses '" CL_WHITE "epoll" CL_RESET "' with up to " CL_WHITE "%d" CL_RESET " events per cycle as event dispatcher\n", epoll_maxevents); -#endif +#endif // SOCKET_EPOLL #if defined(SEND_SHORTLIST) memset(send_shortlist_set, 0, sizeof(send_shortlist_set)); -#endif +#endif // defined(SEND_SHORTLIST) CREATE(sockt->session, struct socket_data *, FD_SETSIZE); @@ -1587,7 +1587,7 @@ void socket_init(void) connect_history = uidb_alloc(DB_OPT_RELEASE_DATA); timer->add_func_list(connect_check_clear, "connect_check_clear"); timer->add_interval(timer->gettick()+1000, connect_check_clear, 0, 0, 5*60*1000); -#endif +#endif // MINICORE ShowInfo("Server supports up to '"CL_WHITE"%"PRIu64""CL_RESET"' concurrent connections.\n", rlim_cur); } @@ -1777,7 +1777,7 @@ void send_shortlist_do_sends(void) } } } -#endif +#endif // SEND_SHORTLIST /** * Checks whether the given IP comes from LAN or WAN. @@ -1917,7 +1917,7 @@ void socket_net_config_read(const char *filename) ShowWarning("Using a wildcard IP range in the allowed server IPs is NOT RECOMMENDED.\n"); ShowNotice("Please edit your '%s' allowed list to fit your network configuration.\n", filename); } -#endif +#endif // BUILDBOT libconfig->destroy(&network_config); return; } |