static int server_listen(void) { t_addr * curr_laddr; t_addr_data laddr_data; int sock; if (!(server_listen_addrs=addrlist_create(prefs_get_servaddrs(),INADDR_ANY,D2CS_SERVER_PORT))) { eventlog(eventlog_level_error,__FUNCTION__,"error create listening address list"); return -1; } BEGIN_LIST_TRAVERSE_DATA(server_listen_addrs,curr_laddr) { sock=net_listen(addr_get_ip(curr_laddr),addr_get_port(curr_laddr),PSOCK_SOCK_STREAM); if (sock<0) { eventlog(eventlog_level_error,__FUNCTION__,"error listen socket"); return -1; } if (psock_ctl(sock,PSOCK_NONBLOCK)<0) { eventlog(eventlog_level_error,__FUNCTION__,"error set listen socket in non-blocking mode"); } laddr_data.i = sock; addr_set_data(curr_laddr,laddr_data); if (fdwatch_add_fd(sock, fdwatch_type_read, d2cs_server_handle_accept, curr_laddr)<0) { eventlog(eventlog_level_error,__FUNCTION__,"error adding socket %d to fdwatch pool (max sockets?)",sock); psock_close(sock); return -1; } eventlog(eventlog_level_info,__FUNCTION__,"listen on %s", addr_num_to_addr_str(addr_get_ip(curr_laddr),addr_get_port(curr_laddr))); }
extern int tracker_set_servers(char const * servers) { t_addr const * addr; t_elem const * curr; char temp[32]; if (track_servers && addrlist_destroy(track_servers)<0) eventlog(eventlog_level_error,__FUNCTION__,"unable to destroy tracker list"); if (!servers) { track_servers = NULL; return 0; } if (!(track_servers = addrlist_create(servers,INADDR_LOOPBACK,BNETD_TRACK_PORT))) { eventlog(eventlog_level_error,__FUNCTION__,"could not create tracking server list"); return -1; } LIST_TRAVERSE_CONST(track_servers,curr) { addr = elem_get_data(curr); if (!addr_get_addr_str(addr,temp,sizeof(temp))) strcpy(temp,"x.x.x.x:x"); eventlog(eventlog_level_info,__FUNCTION__,"tracking packets will be sent to %s",temp); }
static int server_listen(void) { t_addr * curr_laddr; t_addr_data laddr_data; int sock; if (!(server_listen_addrs=addrlist_create(prefs_get_servaddrs(),INADDR_ANY,D2CS_SERVER_PORT))) { log_error("error create listening address list"); return -1; } BEGIN_LIST_TRAVERSE_DATA(server_listen_addrs,curr_laddr) { sock=net_listen(addr_get_ip(curr_laddr),addr_get_port(curr_laddr),PSOCK_SOCK_STREAM); if (sock<0) { log_error("error listen socket"); return -1; } log_info("listen on %s", addr_num_to_addr_str(addr_get_ip(curr_laddr),addr_get_port(curr_laddr))); if (psock_ctl(sock,PSOCK_NONBLOCK)<0) { log_error("error set listen socket in non-blocking mode"); } laddr_data.p=(void *)sock; addr_set_data(curr_laddr,laddr_data); }
} extern int d2gslist_reload(char const * gslist) { t_addrlist * gsaddrs; t_d2gs * gs; if (!d2gslist_head) return -1; BEGIN_LIST_TRAVERSE_DATA(d2gslist_head,gs,t_d2gs) { BIT_CLR_FLAG(gs->flag, D2GS_FLAG_VALID); } END_LIST_TRAVERSE_DATA() gsaddrs = addrlist_create(gslist, INADDR_ANY, 0); if (gsaddrs) { t_elem const *acurr; t_addr * curr_laddr; LIST_TRAVERSE_CONST(gsaddrs, acurr) { curr_laddr = (t_addr*)elem_get_data(acurr); if (!curr_laddr) { eventlog(eventlog_level_error, __FUNCTION__, "found NULL value in gslist"); continue; } if (!(gs=d2gslist_find_gs_by_ip(addr_get_ip(curr_laddr)))) gs = d2gs_create(addr_num_to_ip_str(addr_get_ip(curr_laddr))); if (gs) BIT_SET_FLAG(gs->flag, D2GS_FLAG_VALID); }
extern int server_process(void) { t_addrlist * laddrs; t_addr * curr_laddr; t_addr_data laddr_data; t_laddr_info * laddr_info; #ifdef HAVE_POLL struct pollfd * fds = NULL; int num_fd; #else struct timeval tv; t_psock_fd_set rfds, wfds; int highest_fd; #endif time_t curr_exittime, prev_exittime, prev_savetime, track_time, now; unsigned int syncdelta; t_connection * c; t_elem const * acurr; t_elem const * ccurr; int csocket; #ifdef DO_POSIXSIG sigset_t block_set; sigset_t save_set; #endif unsigned int count; if (psock_init()<0) { eventlog(eventlog_level_error,"server_process","could not initialize socket functions"); return -1; } server_set_name(); /* Start with the Battle.net address list */ if (!(laddrs = addrlist_create(prefs_get_bnetdserv_addrs(),INADDR_ANY,BNETD_SERV_PORT))) { eventlog(eventlog_level_error,"server_process","could not create %s server address list from \"%s\"",laddr_type_get_str(laddr_type_bnet),prefs_get_bnetdserv_addrs()); if (psock_deinit()<0) eventlog(eventlog_level_error,"server_process","could not deinitialize socket functions"); return -1; } /* Mark all these laddrs for being classic Battle.net service */ LIST_TRAVERSE_CONST(laddrs,acurr) { curr_laddr = elem_get_data(acurr); if (addr_get_data(curr_laddr).p) continue; if (!(laddr_info = malloc(sizeof(t_laddr_info)))) { eventlog(eventlog_level_error,"server_process","could not create %s address info (malloc: %s)",laddr_type_get_str(laddr_type_bnet),strerror(psock_errno())); goto error_addr_list; } laddr_info->usocket = -1; laddr_info->ssocket = -1; laddr_info->type = laddr_type_bnet; laddr_data.p = laddr_info; if (addr_set_data(curr_laddr,laddr_data)<0) { eventlog(eventlog_level_error,"server_process","could not set address data"); if (laddr_info->usocket!=-1) { psock_close(laddr_info->usocket); laddr_info->usocket = -1; } if (laddr_info->ssocket!=-1) { psock_close(laddr_info->ssocket); laddr_info->ssocket = -1; } goto error_poll; } }