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