Remove some array length limitations with package lists.

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5875 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2021-05-27 11:36:01 +00:00
parent 148de2e082
commit b4092ab903
4 changed files with 30 additions and 31 deletions

View file

@ -1882,6 +1882,8 @@ void CL_ClearState (qboolean gamestart)
} }
Z_Free(cl.windowtitle); Z_Free(cl.windowtitle);
Z_Free(cl.serverpacknames);
Z_Free(cl.serverpackhashes);
InfoBuf_Clear(&cl.serverinfo, true); InfoBuf_Clear(&cl.serverinfo, true);
@ -2278,13 +2280,13 @@ void CL_PakDownloads(int mode)
*/ */
char local[256]; char local[256];
char *pname; char *pname;
char *s = cl.serverpakcrcs; char *s = cl.serverpackhashes;
int i; int i;
if (!cl.serverpakschanged || !mode) if (!cl.serverpakschanged || !mode)
return; return;
Cmd_TokenizeString(cl.serverpaknames, false, false); Cmd_TokenizeString(cl.serverpacknames, false, false);
for (i = 0; i < Cmd_Argc(); i++) for (i = 0; i < Cmd_Argc(); i++)
{ {
s = COM_Parse(s); s = COM_Parse(s);
@ -2318,13 +2320,13 @@ void CL_CheckServerPacks(void)
pure = cl_pure.ival; pure = cl_pure.ival;
pure = bound(0, pure, 2); pure = bound(0, pure, 2);
if (!*cl.serverpakcrcs || cls.demoplayback) if (!cl.serverpackhashes || cls.demoplayback)
pure = 0; pure = 0;
if (pure != oldpure || cl.serverpakschanged) if (pure != oldpure || cl.serverpakschanged)
{ {
CL_PakDownloads((pure && !cl_download_packages.ival)?1:cl_download_packages.ival); CL_PakDownloads((pure && !cl_download_packages.ival)?1:cl_download_packages.ival);
FS_PureMode(pure, cl.serverpaknames, cl.serverpakcrcs, NULL, NULL, cls.challenge); FS_PureMode(pure, cl.serverpacknames, cl.serverpackhashes, NULL, NULL, cls.challenge);
if (pure) if (pure)
{ {
@ -4197,7 +4199,7 @@ static void CL_Curl_f(void)
char localname[MAX_QPATH]; char localname[MAX_QPATH];
int usage = 0; int usage = 0;
qboolean alreadyhave = false; qboolean alreadyhave = false;
extern char cl_dp_packagenames[4096]; extern char *cl_dp_packagenames;
unsigned int dlflags = DLLF_VERBOSE; unsigned int dlflags = DLLF_VERBOSE;
if (argc < 2) if (argc < 2)
{ {
@ -4250,7 +4252,8 @@ static void CL_Curl_f(void)
} }
else if (!strcmp(arg, "--clear_autodownload")) else if (!strcmp(arg, "--clear_autodownload"))
{ {
*cl_dp_packagenames = 0; Z_Free(cl_dp_packagenames);
cl_dp_packagenames = NULL;
return; return;
} }
else if (!strcmp(arg, "--finish_autodownload")) else if (!strcmp(arg, "--finish_autodownload"))
@ -4283,9 +4286,8 @@ static void CL_Curl_f(void)
if (!CL_CheckOrEnqueDownloadFile(arg, localname, dlflags)) if (!CL_CheckOrEnqueDownloadFile(arg, localname, dlflags))
Con_Printf("Downloading %s to %s\n", arg, localname); Con_Printf("Downloading %s to %s\n", arg, localname);
if (*cl_dp_packagenames) if (cl_dp_packagenames)
Q_strncatz(cl_dp_packagenames, " ", sizeof(cl_dp_packagenames)); Z_StrCat(&cl_dp_packagenames, va("%s%s/%s", cl_dp_packagenames?" ":"", gamedir, localterse));
Q_strncatz(cl_dp_packagenames, va("%s/%s", gamedir, localterse), sizeof(cl_dp_packagenames));
} }
else else
{ {

View file

@ -36,7 +36,7 @@ static void DLC_Poll(qdownload_t *dl);
static void CL_ProcessUserInfo (int slot, player_info_t *player); static void CL_ProcessUserInfo (int slot, player_info_t *player);
#ifdef NQPROT #ifdef NQPROT
char cl_dp_packagenames[4096]; char *cl_dp_packagenames;
static char cl_dp_csqc_progsname[128]; static char cl_dp_csqc_progsname[128];
static int cl_dp_csqc_progssize; static int cl_dp_csqc_progssize;
static int cl_dp_csqc_progscrc; static int cl_dp_csqc_progscrc;
@ -2253,7 +2253,7 @@ static void CL_ParseChunkedDownload(qdownload_t *dl)
if (!strncmp(svname, "package/", 8)) if (!strncmp(svname, "package/", 8))
{ {
int i, c; int i, c;
Cmd_TokenizeString(cl.serverpaknames, false, false); Cmd_TokenizeString(cl.serverpacknames, false, false);
c = Cmd_Argc(); c = Cmd_Argc();
for (i = 0; i < c; i++) for (i = 0; i < c; i++)
{ {
@ -2265,10 +2265,10 @@ static void CL_ParseChunkedDownload(qdownload_t *dl)
else else
{ {
char localname[MAX_OSPATH]; char localname[MAX_OSPATH];
char *crc; char *hash;
Cmd_TokenizeString(cl.serverpakcrcs, false, false); Cmd_TokenizeString(cl.serverpackhashes, false, false);
crc = Cmd_Argv(i); hash = Cmd_Argv(i);
if (FS_GenCachedPakName(svname+8, crc, localname, sizeof(localname))) if (FS_GenCachedPakName(svname+8, hash, localname, sizeof(localname)))
{ {
if (CL_CheckOrEnqueDownloadFile(svname+8, localname, DLLF_NONGAME)) if (CL_CheckOrEnqueDownloadFile(svname+8, localname, DLLF_NONGAME))
if (!CL_CheckDLFile(dl->localname)) if (!CL_CheckDLFile(dl->localname))
@ -3679,7 +3679,8 @@ static void CLQ2_ParseServerData (void)
void CL_ParseEstablished(void) void CL_ParseEstablished(void)
{ {
#ifdef NQPROT #ifdef NQPROT
*cl_dp_packagenames = 0; Z_Free(cl_dp_packagenames);
cl_dp_packagenames = NULL;
cl_dp_serverextension_download = false; cl_dp_serverextension_download = false;
*cl_dp_csqc_progsname = 0; *cl_dp_csqc_progsname = 0;
cl_dp_csqc_progscrc = 0; cl_dp_csqc_progscrc = 0;
@ -3985,19 +3986,15 @@ static void CLNQ_ParseServerData(void) //Doesn't change gamedir - use with caut
InfoBuf_SetStarKey(&cl.serverinfo, "*csprogsname", va("%s", cl_dp_csqc_progsname)); InfoBuf_SetStarKey(&cl.serverinfo, "*csprogsname", va("%s", cl_dp_csqc_progsname));
} }
if (*cl_dp_packagenames) if (cl_dp_packagenames)
{ {
char *in = cl_dp_packagenames; char *in = cl_dp_packagenames;
while (*in) if (cl.serverpacknames)
Z_StrCat(&cl.serverpacknames, " ");
Z_StrCat(&cl.serverpacknames, in);
while ((in = COM_Parse(in)))
{ {
in = COM_Parse(in); Z_StrCat(&cl.serverpackhashes, cl.serverpackhashes?" -":"-"); //no hash info.
if (*cl.serverpaknames)
Q_strncatz(cl.serverpaknames, " ", sizeof(cl.serverpaknames));
Q_strncatz(cl.serverpaknames, com_token, sizeof(cl.serverpaknames));
if (*cl.serverpakcrcs)
Q_strncatz(cl.serverpakcrcs, " ", sizeof(cl.serverpakcrcs));
Q_strncatz(cl.serverpakcrcs, "-", sizeof(cl.serverpakcrcs)); //we don't have any crc info. we'll instead need this info as part of the filename.
cl.serverpakschanged = true; cl.serverpakschanged = true;
} }
} }
@ -6593,12 +6590,12 @@ static void CL_ParseStuffCmd(char *msg, int destsplit) //this protects stuffcmds
else if (!strncmp(stufftext, "//paknames ", 11)) //so that the client knows what to download... else if (!strncmp(stufftext, "//paknames ", 11)) //so that the client knows what to download...
{ //there's a couple of prefixes involved etc { //there's a couple of prefixes involved etc
Q_strncatz(cl.serverpaknames, stufftext+11, sizeof(cl.serverpaknames)); Z_StrCat(&cl.serverpacknames, stufftext+(cl.serverpackhashes?11:10));
cl.serverpakschanged = true; cl.serverpakschanged = true;
} }
else if (!strncmp(stufftext, "//paks ", 7)) //gives the client a list of hashes to match against else if (!strncmp(stufftext, "//paks ", 7)) //gives the client a list of hashes to match against
{ //the client can re-order for cl_pure support, or download dupes to avoid version mismatches { //the client can re-order for cl_pure support, or download dupes to avoid version mismatches
Q_strncatz(cl.serverpakcrcs, stufftext+7, sizeof(cl.serverpakcrcs)); Z_StrCat(&cl.serverpackhashes, stufftext+(cl.serverpackhashes?7:6));
cl.serverpakschanged = true; cl.serverpakschanged = true;
CL_CheckServerPacks(); CL_CheckServerPacks();
} }

View file

@ -797,8 +797,8 @@ typedef struct
qboolean haveserverinfo; //nq servers will usually be false. don't override stuff if we already know better. qboolean haveserverinfo; //nq servers will usually be false. don't override stuff if we already know better.
infobuf_t serverinfo; infobuf_t serverinfo;
char serverpaknames[1024]; char *serverpacknames;
char serverpakcrcs[1024]; char *serverpackhashes;
qboolean serverpakschanged; qboolean serverpakschanged;
int parsecount; // server message counter int parsecount; // server message counter

View file

@ -923,7 +923,7 @@ int SQL_NewServer(void *owner, const char *driver, const char **paramstr)
int SQL_NewQuery(sqlserver_t *server, qboolean (*callback)(queryrequest_t *req, int firstrow, int numrows, int numcols, qboolean eof), const char *str, queryrequest_t **reqout) int SQL_NewQuery(sqlserver_t *server, qboolean (*callback)(queryrequest_t *req, int firstrow, int numrows, int numcols, qboolean eof), const char *str, queryrequest_t **reqout)
{ {
int qsize = Q_strlen(str); int qsize = Q_strlen(str)+1;
queryrequest_t *qreq; queryrequest_t *qreq;
int querynum; int querynum;