1
0
Fork 0
forked from fte/fteqw

sv_tcpport to callback, reallocate command buffer properly (I'm sure this caused a few untracable bugs in the past)

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@2247 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
TimeServ 2006-05-07 05:31:01 +00:00
parent 6f64002cc3
commit 575df34f7e
3 changed files with 88 additions and 67 deletions

View file

@ -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));

View file

@ -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
//

View file

@ -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)