diff --git a/engine/common/cmd.c b/engine/common/cmd.c index 3cb3b4b38..5c3049b79 100644 --- a/engine/common/cmd.c +++ b/engine/common/cmd.c @@ -189,7 +189,7 @@ void Cbuf_AddText (const char *text, int level) if (!cmd_text[level].buf.maxsize) { - cmd_text[level].buf.data = (qbyte*)Z_Malloc(8192); + cmd_text[level].buf.data = (qbyte*)BZ_Malloc(8192); cmd_text[level].buf.maxsize = 8192; } if (cmd_text[level].buf.cursize + l >= cmd_text[level].buf.maxsize) @@ -205,7 +205,7 @@ void Cbuf_AddText (const char *text, int level) } while (newmax < cmd_text[level].buf.cursize + l) newmax*=2; - cmd_text[level].buf.data = (qbyte*)Z_Malloc(newmax); + cmd_text[level].buf.data = (qbyte*)BZ_Realloc(cmd_text[level].buf.data, newmax); cmd_text[level].buf.maxsize = newmax; } SZ_Write (&cmd_text[level].buf, text, Q_strlen (text)); diff --git a/engine/common/net_wins.c b/engine/common/net_wins.c index d326d8968..7005fe19c 100644 --- a/engine/common/net_wins.c +++ b/engine/common/net_wins.c @@ -652,6 +652,25 @@ void NET_SendLoopPacket (netsrc_t sock, int length, void *data, netadr_t to) } //============================================================================= +void SV_Tcpport_Callback(struct cvar_s *var, char *oldvalue) +{ +#ifdef TCPCONNECT + if (svs.sockettcp == INVALID_SOCKET && sv_tcpport.value) + { + svs.sockettcp = TCP_OpenListenSocket(sv_tcpport.value); + if (svs.sockettcp != INVALID_SOCKET) + NET_GetLocalAddress (svs.sockettcp, &net_local_sv_tcpipadr); + else + Con_Printf("Failed to open TCP port %i\n", (int)sv_tcpport.value); + } + else + { + UDP_CloseSocket(svs.sockettcp); + svs.sockettcp = INVALID_SOCKET; + } +#endif +} + qboolean NET_GetPacket (netsrc_t netsrc) { int ret; @@ -914,26 +933,6 @@ qboolean NET_GetPacket (netsrc_t netsrc) return true; } - -#ifdef TCPCONNECT - if (sv_tcpport.modified) - { - if (svs.sockettcp == INVALID_SOCKET && sv_tcpport.value) - { - svs.sockettcp = TCP_OpenListenSocket(sv_tcpport.value); - if (svs.sockettcp != INVALID_SOCKET) - NET_GetLocalAddress (svs.sockettcp, &net_local_sv_tcpipadr); - else - Con_Printf("Failed to open TCP port %i\n", (int)sv_tcpport.value); - } - else - { - UDP_CloseSocket(svs.sockettcp); - svs.sockettcp = INVALID_SOCKET; - } - sv_tcpport.modified = false; - } -#endif if (svs.sockettcp != INVALID_SOCKET) { int newsock; @@ -1583,9 +1582,8 @@ void NET_CloseServer(void) #ifdef TCPCONNECT if (svs.sockettcp != INVALID_SOCKET) { - UDP_CloseSocket(svs.sockettcp ); + UDP_CloseSocket(svs.sockettcp); svs.sockettcp = INVALID_SOCKET; - sv_tcpport.modified = true; } #endif @@ -1638,10 +1636,15 @@ void NET_InitServer(void) NET_GetLocalAddress (svs.socketipx, &net_local_sv_ipxadr); } #endif + + #ifdef TCPCONNECT + Cvar_ForceCallback(&sv_tcpport); + #endif } else NET_CloseServer(); + // // init the message buffer // diff --git a/engine/server/sv_main.c b/engine/server/sv_main.c index 1b25ee5ad..733c3aed9 100644 --- a/engine/server/sv_main.c +++ b/engine/server/sv_main.c @@ -43,24 +43,28 @@ double realtime; // without any filtering or bounding int host_hunklevel; +// callbacks +void SV_Masterlist_Callback(struct cvar_s *var, char *oldvalue); +void SV_Tcpport_Callback(struct cvar_s *var, char *oldvalue); + typedef struct { qboolean isdp; cvar_t cv; netadr_t adr; } sv_masterlist_t; sv_masterlist_t sv_masterlist[] = { - {false, SCVAR("sv_master1", "")}, - {false, SCVAR("sv_master2", "")}, - {false, SCVAR("sv_master3", "")}, - {false, SCVAR("sv_master4", "")}, - {false, SCVAR("sv_master5", "")}, - {false, SCVAR("sv_master6", "")}, - {false, SCVAR("sv_master7", "")}, - {false, SCVAR("sv_master8", "")}, + {false, SCVARC("sv_master1", "", SV_Masterlist_Callback)}, + {false, SCVARC("sv_master2", "", SV_Masterlist_Callback)}, + {false, SCVARC("sv_master3", "", SV_Masterlist_Callback)}, + {false, SCVARC("sv_master4", "", SV_Masterlist_Callback)}, + {false, SCVARC("sv_master5", "", SV_Masterlist_Callback)}, + {false, SCVARC("sv_master6", "", SV_Masterlist_Callback)}, + {false, SCVARC("sv_master7", "", SV_Masterlist_Callback)}, + {false, SCVARC("sv_master8", "", SV_Masterlist_Callback)}, - {true, SCVAR("sv_masterextra1", "ghdigital.com")}, //69.59.212.88 - {true, SCVAR("sv_masterextra2", "dpmaster.deathmask.net")}, //209.164.24.243 - {true, SCVAR("sv_masterextra3", "12.166.196.192")}, //blaze.mindphukd.org (doesn't resolve currently but works as an ip) + {true, SCVARC("sv_masterextra1", "ghdigital.com", SV_Masterlist_Callback)}, //69.59.212.88 + {true, SCVARC("sv_masterextra2", "dpmaster.deathmask.net", SV_Masterlist_Callback)}, //209.164.24.243 + {true, SCVARC("sv_masterextra3", "12.166.196.192", SV_Masterlist_Callback)}, //blaze.mindphukd.org (doesn't resolve currently but works as an ip) {false, SCVAR(NULL, NULL)} }; @@ -124,7 +128,7 @@ cvar_t sv_masterport = SCVAR("sv_masterport", "0"); cvar_t sv_voicechat = SCVAR("sv_voicechat", "0"); //still development. cvar_t sv_gamespeed = SCVAR("sv_gamespeed", "1"); cvar_t sv_csqcdebug = SCVAR("sv_csqcdebug", "0"); -cvar_t sv_tcpport = SCVAR("sv_tcpport", "0"); +cvar_t sv_tcpport = SCVARC("sv_tcpport", "0", SV_Tcpport_Callback); cvar_t pausable = SCVAR("pausable", "1"); @@ -3342,6 +3346,51 @@ void SV_InitLocal (void) //============================================================================ +void SV_Masterlist_Callback(struct cvar_s *var, char *oldvalue) +{ + int i; + char data[2]; + + for (i = 0; sv_masterlist[i].cv.name; i++) + { + if (var == &sv_masterlist[i].cv) + break; + } + + if (!sv_masterlist[i].cv.name) + return; + + if (*var->string) + { + sv_masterlist[i].adr.port = 0; + return; + } + + if (!NET_StringToAdr(var->string, &sv_masterlist[i].adr)) + { + sv_masterlist[i].adr.port = 0; + Con_Printf ("Couldn't resolve master \"%s\"\n", var->string); + } + else + { + if (sv_masterlist[i].isdp) + { + if (sv_masterlist[i].adr.port == 0) + sv_masterlist[i].adr.port = BigShort (27950); + } + else + { + if (sv_masterlist[i].adr.port == 0) + sv_masterlist[i].adr.port = BigShort (27000); + + data[0] = A2A_PING; + data[1] = 0; + if (sv.state) + NET_SendPacket (NS_SERVER, 2, data, sv_masterlist[i].adr); + } + } +} + /* ================ Master_Heartbeat @@ -3357,7 +3406,6 @@ void Master_Heartbeat (void) int active; int i, j; qboolean madeqwstring = false; - char data[2]; if (!sv_public.value) return; @@ -3372,36 +3420,6 @@ void Master_Heartbeat (void) // send to group master for (i = 0; sv_masterlist[i].cv.name; i++) { - if (sv_masterlist[i].cv.modified) - { - sv_masterlist[i].cv.modified = false; - if (!NET_StringToAdr(sv_masterlist[i].cv.string, &sv_masterlist[i].adr)) - { - sv_masterlist[i].adr.port = 0; - Con_Printf ("Couldn't resolve master \"%s\"\n", sv_masterlist[i].cv.string); - } - else - { - switch(sv_masterlist[i].isdp) - { - case false: - if (sv_masterlist[i].adr.port == 0) - sv_masterlist[i].adr.port = BigShort (27000); - - data[0] = A2A_PING; - data[1] = 0; - if (sv.state) - NET_SendPacket (NS_SERVER, 2, data, sv_masterlist[i].adr); - break; - - case true: - if (sv_masterlist[i].adr.port == 0) - sv_masterlist[i].adr.port = BigShort (27950); - break; - } - } - } - if (sv_masterlist[i].adr.port) { switch(sv_masterlist[i].isdp)