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