1cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 2cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCopyright (C) 1996-1997 Id Software, Inc. 3cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 4cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis program is free software; you can redistribute it and/or 5cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichmodify it under the terms of the GNU General Public License 6cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichas published by the Free Software Foundation; either version 2 7cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichof the License, or (at your option) any later version. 8cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 9cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis program is distributed in the hope that it will be useful, 10cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichbut WITHOUT ANY WARRANTY; without even the implied warranty of 11cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 12cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 13cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichSee the GNU General Public License for more details. 14cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 15cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichYou should have received a copy of the GNU General Public License 16cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichalong with this program; if not, write to the Free Software 17cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 18cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 19cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 20cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// net_main.c 21cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 22cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include "quakedef.h" 23cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include "net_vcr.h" 24cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 25cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichqsocket_t *net_activeSockets = NULL; 26cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichqsocket_t *net_freeSockets = NULL; 27cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint net_numsockets = 0; 28cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 29cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichqboolean serialAvailable = false; 30cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichqboolean ipxAvailable = false; 31cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichqboolean tcpipAvailable = false; 32cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 33cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint net_hostport; 34cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint DEFAULTnet_hostport = 26000; 35cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 36cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichchar my_ipx_address[NET_NAMELEN]; 37cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichchar my_tcpip_address[NET_NAMELEN]; 38cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 39cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid (*GetComPortConfig) (int portNumber, int *port, int *irq, int *baud, qboolean *useModem); 40cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid (*SetComPortConfig) (int portNumber, int port, int irq, int baud, qboolean useModem); 41cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid (*GetModemConfig) (int portNumber, char *dialType, char *clear, char *init, char *hangup); 42cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid (*SetModemConfig) (int portNumber, char *dialType, char *clear, char *init, char *hangup); 43cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 44cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichstatic qboolean listening = false; 45cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 46cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichqboolean slistInProgress = false; 47cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichqboolean slistSilent = false; 48cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichqboolean slistLocal = true; 49cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichstatic double slistStartTime; 50cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichstatic int slistLastShown; 51cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 52cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichstatic void Slist_Send(void*); 53cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichstatic void Slist_Poll(void*); 54cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPollProcedure slistSendProcedure = {NULL, 0.0, Slist_Send, NULL}; 55cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPollProcedure slistPollProcedure = {NULL, 0.0, Slist_Poll, NULL}; 56cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 57cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 58cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichsizebuf_t net_message; 59cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint net_activeconnections = 0; 60cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 61cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint messagesSent = 0; 62cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint messagesReceived = 0; 63cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint unreliableMessagesSent = 0; 64cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint unreliableMessagesReceived = 0; 65cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 66cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t net_messagetimeout = CVAR2("net_messagetimeout","300"); 67cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t hostname = CVAR2("hostname", "UNNAMED"); 68cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 69cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichqboolean configRestored = false; 70cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t config_com_port = CVAR3("_config_com_port", "0x3f8", true); 71cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t config_com_irq = CVAR3("_config_com_irq", "4", true); 72cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t config_com_baud = CVAR3("_config_com_baud", "57600", true); 73cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t config_com_modem = CVAR3("_config_com_modem", "1", true); 74cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t config_modem_dialtype = CVAR3("_config_modem_dialtype", "T", true); 75cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t config_modem_clear = CVAR3("_config_modem_clear", "ATZ", true); 76cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t config_modem_init = CVAR3("_config_modem_init", "", true); 77cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t config_modem_hangup = CVAR3("_config_modem_hangup", "AT H", true); 78cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 79cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#ifdef IDGODS 80cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t idgods = CVAR2("idgods", "0"); 81cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif 82cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 83cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint vcrFile = -1; 84cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichqboolean recording = false; 85cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 86cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// these two macros are to make the code more readable 87cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define sfunc net_drivers[sock->driver] 88cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define dfunc net_drivers[net_driverlevel] 89cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 90cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint net_driverlevel; 91cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 92cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 93cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichdouble net_time; 94cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 95cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichdouble SetNetTime(void) 96cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 97cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich net_time = Sys_FloatTime(); 98cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return net_time; 99cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 100cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 101cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 102cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 103cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=================== 104cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichNET_NewQSocket 105cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 106cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCalled by drivers when a new communications endpoint is required 107cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThe sequence and buffer fields will be filled in properly 108cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=================== 109cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 110cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichqsocket_t *NET_NewQSocket (void) 111cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 112cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich qsocket_t *sock; 113cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 114cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (net_freeSockets == NULL) 115cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return NULL; 116cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 117cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (net_activeconnections >= svs.maxclients) 118cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return NULL; 119cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 120cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // get one from free list 121cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sock = net_freeSockets; 122cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich net_freeSockets = sock->next; 123cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 124cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // add it to active list 125cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sock->next = net_activeSockets; 126cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich net_activeSockets = sock; 127cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 128cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sock->disconnected = false; 129cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sock->connecttime = net_time; 130cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Q_strcpy (sock->address,"UNSET ADDRESS"); 131cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sock->driver = net_driverlevel; 132cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sock->socket = 0; 133cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sock->driverdata = NULL; 134cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sock->canSend = true; 135cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sock->sendNext = false; 136cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sock->lastMessageTime = net_time; 137cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sock->ackSequence = 0; 138cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sock->sendSequence = 0; 139cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sock->unreliableSendSequence = 0; 140cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sock->sendMessageLength = 0; 141cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sock->receiveSequence = 0; 142cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sock->unreliableReceiveSequence = 0; 143cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sock->receiveMessageLength = 0; 144cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 145cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return sock; 146cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 147cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 148cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 149cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid NET_FreeQSocket(qsocket_t *sock) 150cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 151cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich qsocket_t *s; 152cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 153cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // remove it from active list 154cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (sock == net_activeSockets) 155cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich net_activeSockets = net_activeSockets->next; 156cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 157cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 158cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (s = net_activeSockets; s; s = s->next) 159cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (s->next == sock) 160cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 161cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich s->next = sock->next; 162cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 163cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 164cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!s) 165cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Sys_Error ("NET_FreeQSocket: not active\n"); 166cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 167cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 168cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // add it to free list 169cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sock->next = net_freeSockets; 170cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich net_freeSockets = sock; 171cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sock->disconnected = true; 172cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 173cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 174cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 175cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichstatic void NET_Listen_f (void) 176cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 177cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (Cmd_Argc () != 2) 178cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 179cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_Printf ("\"listen\" is \"%u\"\n", listening ? 1 : 0); 180cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 181cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 182cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 183cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich listening = Q_atoi(Cmd_Argv(1)) ? true : false; 184cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 185cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (net_driverlevel=0 ; net_driverlevel<net_numdrivers; net_driverlevel++) 186cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 187cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (net_drivers[net_driverlevel].initialized == false) 188cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich continue; 189cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich dfunc.Listen (listening); 190cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 191cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 192cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 193cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 194cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichstatic void MaxPlayers_f (void) 195cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 196cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int n; 197cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 198cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (Cmd_Argc () != 2) 199cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 200cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_Printf ("\"maxplayers\" is \"%u\"\n", svs.maxclients); 201cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 202cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 203cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 204cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (sv.active) 205cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 206cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_Printf ("maxplayers can not be changed while a server is running.\n"); 207cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 208cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 209cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 210cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich n = Q_atoi(Cmd_Argv(1)); 211cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (n < 1) 212cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich n = 1; 213cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (n > svs.maxclientslimit) 214cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 215cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich n = svs.maxclientslimit; 216cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_Printf ("\"maxplayers\" set to \"%u\"\n", n); 217cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 218cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 219cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if ((n == 1) && listening) 220cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Cbuf_AddText ("listen 0\n"); 221cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 222cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if ((n > 1) && (!listening)) 223cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Cbuf_AddText ("listen 1\n"); 224cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 225cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich svs.maxclients = n; 226cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (n == 1) 227cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Cvar_Set ("deathmatch", "0"); 228cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 229cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Cvar_Set ("deathmatch", "1"); 230cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 231cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 232cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 233cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichstatic void NET_Port_f (void) 234cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 235cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int n; 236cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 237cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (Cmd_Argc () != 2) 238cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 239cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_Printf ("\"port\" is \"%u\"\n", net_hostport); 240cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 241cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 242cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 243cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich n = Q_atoi(Cmd_Argv(1)); 244cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (n < 1 || n > 65534) 245cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 246cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_Printf ("Bad value, must be between 1 and 65534\n"); 247cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 248cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 249cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 250cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich DEFAULTnet_hostport = n; 251cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich net_hostport = n; 252cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 253cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (listening) 254cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 255cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // force a change to the new port 256cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Cbuf_AddText ("listen 0\n"); 257cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Cbuf_AddText ("listen 1\n"); 258cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 259cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 260cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 261cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 262cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichstatic void PrintSlistHeader(void) 263cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 264cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_Printf("Server Map Users\n"); 265cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_Printf("--------------- --------------- -----\n"); 266cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich slistLastShown = 0; 267cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 268cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 269cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 270cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichstatic void PrintSlist(void) 271cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 272cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int n; 273cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 274cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (n = slistLastShown; n < hostCacheCount; n++) 275cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 276cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (hostcache[n].maxusers) 277cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_Printf("%-15.15s %-15.15s %2u/%2u\n", hostcache[n].name, hostcache[n].map, hostcache[n].users, hostcache[n].maxusers); 278cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 279cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_Printf("%-15.15s %-15.15s\n", hostcache[n].name, hostcache[n].map); 280cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 281cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich slistLastShown = n; 282cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 283cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 284cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 285cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichstatic void PrintSlistTrailer(void) 286cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 287cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (hostCacheCount) 288cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_Printf("== end list ==\n\n"); 289cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 290cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_Printf("No Quake servers found.\n\n"); 291cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 292cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 293cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 294cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid NET_Slist_f (void) 295cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 296cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (slistInProgress) 297cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 298cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 299cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (! slistSilent) 300cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 301cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_Printf("Looking for Quake servers...\n"); 302cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich PrintSlistHeader(); 303cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 304cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 305cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich slistInProgress = true; 306cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich slistStartTime = Sys_FloatTime(); 307cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 308cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich SchedulePollProcedure(&slistSendProcedure, 0.0); 309cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich SchedulePollProcedure(&slistPollProcedure, 0.1); 310cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 311cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich hostCacheCount = 0; 312cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 313cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 314cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 315cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichstatic void Slist_Send(void* /* arg */) 316cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 317cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (net_driverlevel=0; net_driverlevel < net_numdrivers; net_driverlevel++) 318cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 319cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!slistLocal && net_driverlevel == 0) 320cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich continue; 321cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (net_drivers[net_driverlevel].initialized == false) 322cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich continue; 323cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich dfunc.SearchForHosts (true); 324cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 325cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 326cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if ((Sys_FloatTime() - slistStartTime) < 0.5) 327cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich SchedulePollProcedure(&slistSendProcedure, 0.75); 328cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 329cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 330cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 331cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichstatic void Slist_Poll(void* /* arg */) 332cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 333cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (net_driverlevel=0; net_driverlevel < net_numdrivers; net_driverlevel++) 334cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 335cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!slistLocal && net_driverlevel == 0) 336cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich continue; 337cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (net_drivers[net_driverlevel].initialized == false) 338cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich continue; 339cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich dfunc.SearchForHosts (false); 340cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 341cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 342cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (! slistSilent) 343cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich PrintSlist(); 344cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 345cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if ((Sys_FloatTime() - slistStartTime) < 1.5) 346cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 347cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich SchedulePollProcedure(&slistPollProcedure, 0.1); 348cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 349cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 350cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 351cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (! slistSilent) 352cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich PrintSlistTrailer(); 353cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich slistInProgress = false; 354cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich slistSilent = false; 355cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich slistLocal = true; 356cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 357cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 358cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 359cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 360cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=================== 361cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichNET_Connect 362cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=================== 363cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 364cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 365cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint hostCacheCount = 0; 366cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichhostcache_t hostcache[HOSTCACHESIZE]; 367cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 368cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichqsocket_t *NET_Connect (const char *host) 369cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 370cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich qsocket_t *ret; 371cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int n; 372cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int numdrivers = net_numdrivers; 373cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 374cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich SetNetTime(); 375cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 376cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (host && *host == 0) 377cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich host = NULL; 378cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 379cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (host) 380cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 381cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (Q_strcasecmp (host, "local") == 0) 382cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 383cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich numdrivers = 1; 384cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich goto JustDoIt; 385cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 386cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 387cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (hostCacheCount) 388cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 389cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (n = 0; n < hostCacheCount; n++) 390cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (Q_strcasecmp (host, hostcache[n].name) == 0) 391cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 392cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich host = hostcache[n].cname; 393cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 394cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 395cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (n < hostCacheCount) 396cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich goto JustDoIt; 397cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 398cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 399cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 400cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich slistSilent = host ? true : false; 401cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich NET_Slist_f (); 402cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 403cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich while(slistInProgress) 404cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich NET_Poll(); 405cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 406cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (host == NULL) 407cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 408cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (hostCacheCount != 1) 409cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return NULL; 410cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich host = hostcache[0].cname; 411cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_Printf("Connecting to...\n%s @ %s\n\n", hostcache[0].name, host); 412cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 413cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 414cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (hostCacheCount) 415cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (n = 0; n < hostCacheCount; n++) 416cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (Q_strcasecmp (host, hostcache[n].name) == 0) 417cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 418cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich host = hostcache[n].cname; 419cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 420cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 421cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 422cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichJustDoIt: 423cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (net_driverlevel=0 ; net_driverlevel<numdrivers; net_driverlevel++) 424cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 425cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (net_drivers[net_driverlevel].initialized == false) 426cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich continue; 427cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ret = dfunc.Connect (host); 428cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (ret) 429cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return ret; 430cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 431cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 432cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (host) 433cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 434cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_Printf("\n"); 435cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich PrintSlistHeader(); 436cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich PrintSlist(); 437cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich PrintSlistTrailer(); 438cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 439cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 440cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return NULL; 441cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 442cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 443cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 444cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 445cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=================== 446cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichNET_CheckNewConnections 447cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=================== 448cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 449cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 450cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichstruct vcrConnect_t 451cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 452cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich double time; 453cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int op; 454cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich long session; 455cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} vcrConnect; 456cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 457cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichqsocket_t *NET_CheckNewConnections (void) 458cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 459cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich qsocket_t *ret; 460cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 461cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich SetNetTime(); 462cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 463cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (net_driverlevel=0 ; net_driverlevel<net_numdrivers; net_driverlevel++) 464cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 465cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (net_drivers[net_driverlevel].initialized == false) 466cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich continue; 467cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (net_driverlevel && listening == false) 468cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich continue; 469cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ret = dfunc.CheckNewConnections (); 470cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (ret) 471cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 472cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (recording) 473cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 474cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vcrConnect.time = host_time; 475cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vcrConnect.op = VCR_OP_CONNECT; 476cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vcrConnect.session = (long)ret; 477cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Sys_FileWrite (vcrFile, &vcrConnect, sizeof(vcrConnect)); 478cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Sys_FileWrite (vcrFile, ret->address, NET_NAMELEN); 479cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 480cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return ret; 481cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 482cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 483cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 484cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (recording) 485cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 486cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vcrConnect.time = host_time; 487cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vcrConnect.op = VCR_OP_CONNECT; 488cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vcrConnect.session = 0; 489cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Sys_FileWrite (vcrFile, &vcrConnect, sizeof(vcrConnect)); 490cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 491cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 492cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return NULL; 493cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 494cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 495cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 496cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=================== 497cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichNET_Close 498cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=================== 499cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 500cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid NET_Close (qsocket_t *sock) 501cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 502cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!sock) 503cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 504cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 505cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (sock->disconnected) 506cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 507cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 508cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich SetNetTime(); 509cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 510cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // call the driver_Close function 511cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sfunc.Close (sock); 512cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 513cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich NET_FreeQSocket(sock); 514cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 515cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 516cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 517cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 518cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 519cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichNET_GetMessage 520cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 521cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichIf there is a complete message, return it in net_message 522cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 523cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichreturns 0 if no data is waiting 524cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichreturns 1 if a message was received 525cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichreturns -1 if connection is invalid 526cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 527cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 528cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 529cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichstruct vcrGetMessage_t 530cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 531cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich double time; 532cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int op; 533cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich long session; 534cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int ret; 535cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int len; 536cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} vcrGetMessage; 537cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 538cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichextern void PrintStats(qsocket_t *s); 539cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 540cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint NET_GetMessage (qsocket_t *sock) 541cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 542cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int ret; 543cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 544cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!sock) 545cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return -1; 546cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 547cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (sock->disconnected) 548cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 549cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_Printf("NET_GetMessage: disconnected socket\n"); 550cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return -1; 551cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 552cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 553cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich SetNetTime(); 554cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 555cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ret = sfunc.QGetMessage(sock); 556cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 557cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // see if this connection has timed out 558cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (ret == 0 && sock->driver) 559cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 560cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (net_time - sock->lastMessageTime > net_messagetimeout.value) 561cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 562cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich NET_Close(sock); 563cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return -1; 564cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 565cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 566cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 567cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 568cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (ret > 0) 569cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 570cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (sock->driver) 571cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 572cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sock->lastMessageTime = net_time; 573cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (ret == 1) 574cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich messagesReceived++; 575cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else if (ret == 2) 576cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich unreliableMessagesReceived++; 577cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 578cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 579cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (recording) 580cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 581cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vcrGetMessage.time = host_time; 582cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vcrGetMessage.op = VCR_OP_GETMESSAGE; 583cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vcrGetMessage.session = (long)sock; 584cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vcrGetMessage.ret = ret; 585cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vcrGetMessage.len = net_message.cursize; 586cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Sys_FileWrite (vcrFile, &vcrGetMessage, 24); 587cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Sys_FileWrite (vcrFile, net_message.data, net_message.cursize); 588cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 589cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 590cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 591cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 592cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (recording) 593cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 594cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vcrGetMessage.time = host_time; 595cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vcrGetMessage.op = VCR_OP_GETMESSAGE; 596cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vcrGetMessage.session = (long)sock; 597cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vcrGetMessage.ret = ret; 598cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Sys_FileWrite (vcrFile, &vcrGetMessage, 20); 599cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 600cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 601cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 602cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return ret; 603cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 604cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 605cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 606cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 607cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================== 608cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichNET_SendMessage 609cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 610cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichTry to send a complete length+message unit over the reliable stream. 611cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichreturns 0 if the message cannot be delivered reliably, but the connection 612cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich is still considered valid 613cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichreturns 1 if the message was sent properly 614cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichreturns -1 if the connection died 615cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================== 616cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 617cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichstruct vcrSendMessage_t 618cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 619cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich double time; 620cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int op; 621cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich long session; 622cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int r; 623cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} vcrSendMessage; 624cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 625cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint NET_SendMessage (qsocket_t *sock, sizebuf_t *data) 626cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 627cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int r; 628cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 629cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!sock) 630cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return -1; 631cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 632cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (sock->disconnected) 633cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 634cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_Printf("NET_SendMessage: disconnected socket\n"); 635cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return -1; 636cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 637cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 638cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich SetNetTime(); 639cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich r = sfunc.QSendMessage(sock, data); 640cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (r == 1 && sock->driver) 641cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich messagesSent++; 642cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 643cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (recording) 644cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 645cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vcrSendMessage.time = host_time; 646cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vcrSendMessage.op = VCR_OP_SENDMESSAGE; 647cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vcrSendMessage.session = (long)sock; 648cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vcrSendMessage.r = r; 649cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Sys_FileWrite (vcrFile, &vcrSendMessage, 20); 650cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 651cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 652cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return r; 653cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 654cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 655cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 656cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint NET_SendUnreliableMessage (qsocket_t *sock, sizebuf_t *data) 657cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 658cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int r; 659cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 660cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!sock) 661cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return -1; 662cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 663cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (sock->disconnected) 664cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 665cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_Printf("NET_SendMessage: disconnected socket\n"); 666cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return -1; 667cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 668cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 669cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich SetNetTime(); 670cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich r = sfunc.SendUnreliableMessage(sock, data); 671cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (r == 1 && sock->driver) 672cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich unreliableMessagesSent++; 673cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 674cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (recording) 675cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 676cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vcrSendMessage.time = host_time; 677cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vcrSendMessage.op = VCR_OP_SENDMESSAGE; 678cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vcrSendMessage.session = (long)sock; 679cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vcrSendMessage.r = r; 680cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Sys_FileWrite (vcrFile, &vcrSendMessage, 20); 681cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 682cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 683cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return r; 684cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 685cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 686cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 687cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 688cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================== 689cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichNET_CanSendMessage 690cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 691cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichReturns true or false if the given qsocket can currently accept a 692cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichmessage to be transmitted. 693cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================== 694cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 695cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichqboolean NET_CanSendMessage (qsocket_t *sock) 696cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 697cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int r; 698cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 699cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!sock) 700cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return false; 701cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 702cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (sock->disconnected) 703cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return false; 704cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 705cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich SetNetTime(); 706cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 707cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich r = sfunc.CanSendMessage(sock); 708cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 709cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (recording) 710cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 711cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vcrSendMessage.time = host_time; 712cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vcrSendMessage.op = VCR_OP_CANSENDMESSAGE; 713cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vcrSendMessage.session = (long)sock; 714cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vcrSendMessage.r = r; 715cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Sys_FileWrite (vcrFile, &vcrSendMessage, 20); 716cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 717cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 718cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return r; 719cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 720cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 721cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 722cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint NET_SendToAll(sizebuf_t *data, int blocktime) 723cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 724cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich double start; 725cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i; 726cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int count = 0; 727cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich qboolean state1 [MAX_SCOREBOARD]; 728cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich qboolean state2 [MAX_SCOREBOARD]; 729cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 730cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0, host_client = svs.clients ; i<svs.maxclients ; i++, host_client++) 731cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 732cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!host_client->netconnection) 733cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich continue; 734cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (host_client->active) 735cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 736cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (host_client->netconnection->driver == 0) 737cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 738cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich NET_SendMessage(host_client->netconnection, data); 739cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich state1[i] = true; 740cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich state2[i] = true; 741cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich continue; 742cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 743cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich count++; 744cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich state1[i] = false; 745cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich state2[i] = false; 746cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 747cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 748cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 749cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich state1[i] = true; 750cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich state2[i] = true; 751cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 752cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 753cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 754cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich start = Sys_FloatTime(); 755cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich while (count) 756cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 757cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich count = 0; 758cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0, host_client = svs.clients ; i<svs.maxclients ; i++, host_client++) 759cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 760cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (! state1[i]) 761cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 762cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (NET_CanSendMessage (host_client->netconnection)) 763cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 764cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich state1[i] = true; 765cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich NET_SendMessage(host_client->netconnection, data); 766cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 767cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 768cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 769cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich NET_GetMessage (host_client->netconnection); 770cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 771cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich count++; 772cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich continue; 773cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 774cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 775cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (! state2[i]) 776cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 777cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (NET_CanSendMessage (host_client->netconnection)) 778cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 779cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich state2[i] = true; 780cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 781cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 782cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 783cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich NET_GetMessage (host_client->netconnection); 784cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 785cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich count++; 786cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich continue; 787cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 788cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 789cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if ((Sys_FloatTime() - start) > blocktime) 790cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 791cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 792cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return count; 793cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 794cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 795cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 796cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich//============================================================================= 797cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 798cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 799cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich==================== 800cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichNET_Init 801cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich==================== 802cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 803cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 804cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid NET_Init (void) 805cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 806cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i; 807cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int controlSocket; 808cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich qsocket_t *s; 809cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 810cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (COM_CheckParm("-playback")) 811cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 812cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich net_numdrivers = 1; 813cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich net_drivers[0].Init = VCR_Init; 814cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 815cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 816cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (COM_CheckParm("-record")) 817cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich recording = true; 818cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 819cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich i = COM_CheckParm ("-port"); 820cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!i) 821cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich i = COM_CheckParm ("-udpport"); 822cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!i) 823cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich i = COM_CheckParm ("-ipxport"); 824cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 825cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (i) 826cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 827cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (i < com_argc-1) 828cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich DEFAULTnet_hostport = Q_atoi (com_argv[i+1]); 829cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 830cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Sys_Error ("NET_Init: you must specify a number after -port"); 831cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 832cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich net_hostport = DEFAULTnet_hostport; 833cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 834cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (COM_CheckParm("-listen") || cls.state == ca_dedicated) 835cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich listening = true; 836cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich net_numsockets = svs.maxclientslimit; 837cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (cls.state != ca_dedicated) 838cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich net_numsockets++; 839cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 840cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich SetNetTime(); 841cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 842cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i = 0; i < net_numsockets; i++) 843cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 844cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich s = (qsocket_t *)Hunk_AllocName(sizeof(qsocket_t), "qsocket"); 845cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich s->next = net_freeSockets; 846cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich net_freeSockets = s; 847cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich s->disconnected = true; 848cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 849cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 850cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // allocate space for network message buffer 851cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich SZ_Alloc (&net_message, NET_MAXMESSAGE); 852cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 853cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Cvar_RegisterVariable (&net_messagetimeout); 854cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Cvar_RegisterVariable (&hostname); 855cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Cvar_RegisterVariable (&config_com_port); 856cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Cvar_RegisterVariable (&config_com_irq); 857cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Cvar_RegisterVariable (&config_com_baud); 858cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Cvar_RegisterVariable (&config_com_modem); 859cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Cvar_RegisterVariable (&config_modem_dialtype); 860cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Cvar_RegisterVariable (&config_modem_clear); 861cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Cvar_RegisterVariable (&config_modem_init); 862cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Cvar_RegisterVariable (&config_modem_hangup); 863cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#ifdef IDGODS 864cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Cvar_RegisterVariable (&idgods); 865cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif 866cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 867cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Cmd_AddCommand ("slist", NET_Slist_f); 868cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Cmd_AddCommand ("listen", NET_Listen_f); 869cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Cmd_AddCommand ("maxplayers", MaxPlayers_f); 870cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Cmd_AddCommand ("port", NET_Port_f); 871cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 872cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // initialize all the drivers 873cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (net_driverlevel=0 ; net_driverlevel<net_numdrivers ; net_driverlevel++) 874cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 875cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich controlSocket = net_drivers[net_driverlevel].Init(); 876cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (controlSocket == -1) 877cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich continue; 878cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich net_drivers[net_driverlevel].initialized = true; 879cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich net_drivers[net_driverlevel].controlSock = controlSocket; 880cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (listening) 881cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich net_drivers[net_driverlevel].Listen (true); 882cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 883cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 884cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (*my_ipx_address) 885cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_DPrintf("IPX address %s\n", my_ipx_address); 886cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (*my_tcpip_address) 887cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_DPrintf("TCP/IP address %s\n", my_tcpip_address); 888cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 889cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 890cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 891cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich==================== 892cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichNET_Shutdown 893cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich==================== 894cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 895cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 896cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid NET_Shutdown (void) 897cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 898cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich qsocket_t *sock; 899cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 900cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich SetNetTime(); 901cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 902cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (sock = net_activeSockets; sock; sock = sock->next) 903cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich NET_Close(sock); 904cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 905cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// 906cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// shutdown the drivers 907cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// 908cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (net_driverlevel = 0; net_driverlevel < net_numdrivers; net_driverlevel++) 909cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 910cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (net_drivers[net_driverlevel].initialized == true) 911cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 912cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich net_drivers[net_driverlevel].Shutdown (); 913cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich net_drivers[net_driverlevel].initialized = false; 914cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 915cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 916cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 917cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (vcrFile != -1) 918cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 919cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_Printf ("Closing vcrfile.\n"); 920cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Sys_FileClose(vcrFile); 921cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 922cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 923cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 924cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 925cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichstatic PollProcedure *pollProcedureList = NULL; 926cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 927cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid NET_Poll(void) 928cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 929cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich PollProcedure *pp; 930cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich qboolean useModem; 931cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 932cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!configRestored) 933cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 934cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (serialAvailable) 935cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 936cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (config_com_modem.value == 1.0) 937cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich useModem = true; 938cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 939cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich useModem = false; 940cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich SetComPortConfig (0, (int)config_com_port.value, (int)config_com_irq.value, (int)config_com_baud.value, useModem); 941cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich SetModemConfig (0, config_modem_dialtype.string, config_modem_clear.string, config_modem_init.string, config_modem_hangup.string); 942cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 943cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich configRestored = true; 944cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 945cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 946cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich SetNetTime(); 947cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 948cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (pp = pollProcedureList; pp; pp = pp->next) 949cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 950cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (pp->nextTime > net_time) 951cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 952cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pollProcedureList = pp->next; 953cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pp->procedure(pp->arg); 954cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 955cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 956cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 957cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 958cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid SchedulePollProcedure(PollProcedure *proc, double timeOffset) 959cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 960cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich PollProcedure *pp, *prev; 961cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 962cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich proc->nextTime = Sys_FloatTime() + timeOffset; 963cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (pp = pollProcedureList, prev = NULL; pp; pp = pp->next) 964cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 965cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (pp->nextTime >= proc->nextTime) 966cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 967cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich prev = pp; 968cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 969cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 970cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (prev == NULL) 971cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 972cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich proc->next = pollProcedureList; 973cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pollProcedureList = proc; 974cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 975cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 976cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 977cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich proc->next = pp; 978cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich prev->next = proc; 979cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 980cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 981cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 982cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#ifdef IDGODS 983cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define IDNET 0xc0f62800 984cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 985cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichqboolean IsID(struct qsockaddr *addr) 986cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 987cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (idgods.value == 0.0) 988cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return false; 989cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 990cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (addr->sa_family != 2) 991cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return false; 992cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 993cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if ((BigLong(*(int *)&addr->sa_data[2]) & 0xffffff00) == IDNET) 994cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return true; 995cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return false; 996cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 997cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif 998