replace non-thread-safe functions

replace all uses of strtok, localtime, gmtime and readdir

on platforms without safe versions, use homebrew or unsafe...
This commit is contained in:
ac-stef
2016-02-28 23:14:47 +01:00
parent 98d01d1f34
commit 32ffd3a4cd
11 changed files with 60 additions and 38 deletions
+4 -4
View File
@@ -256,11 +256,11 @@ void toserverme(char *text)
void echo(char *text)
{
const char *s = strtok(text, "\n");
char *b, *s = strtok_r(text, "\n", &b);
do
{
conoutf("%s", s ? s : "");
s = strtok(NULL, "\n");
s = strtok_r(NULL, "\n", &b);
}
while(s);
}
@@ -268,12 +268,12 @@ void echo(char *text)
VARP(allowhudechos, 0, 1, 1);
void hudecho(char *text)
{
const char *s = strtok(text, "\n");
char *b, *s = strtok_r(text, "\n", &b);
void (*outf)(const char *s, ...) = allowhudechos ? hudoutf : conoutf;
do
{
outf("%s", s ? s : "");
s = strtok(NULL, "\n");
s = strtok_r(NULL, "\n", &b);
}
while(s);
}
+2 -2
View File
@@ -87,7 +87,7 @@ const char *highlight(const char *text)
if(!marker || !strstr(text, player1->name)) return text;
defformatstring(subst)("\fs%s%s\fr", marker, player1->name);
char *temp = newstring(text);
char *s = strtok(temp, sep), *l = temp, *c, *r = result;
char *b, *s = strtok_r(temp, sep, &b), *l = temp, *c, *r = result;
result[0] = '\0';
while(s)
{
@@ -101,7 +101,7 @@ const char *highlight(const char *text)
}
l = s + strlen(s);
}
s = strtok(NULL, sep);
s = strtok_r(NULL, sep, &b);
}
if(MAXTRANS - strlen(result) > strlen(text) - (l - temp)) strcat(result, text + (l - temp));
delete[] temp;
+3 -3
View File
@@ -1423,8 +1423,8 @@ const char *parseDemoFilename(char *srvfinfo)
{
int fip = 0;
char sep[] = ":";
char *pch;
pch = strtok (srvfinfo,sep);
char *pch, *b;
pch = strtok_r(srvfinfo, sep, &b);
while (pch != NULL && fip < 4)
{
fip++;
@@ -1436,7 +1436,7 @@ const char *parseDemoFilename(char *srvfinfo)
case 4: stamp = atoi(pch); break;
default: break;
}
pch = strtok (NULL, sep);
pch = strtok_r(NULL, sep, &b);
}
copystring(srvmap, pch);
}
+3 -3
View File
@@ -454,12 +454,12 @@ void loadhistory()
{
char *histbuf = loadfile(path("config/history", true), NULL);
if(!histbuf) return;
char *line = NULL;
line = strtok(histbuf, "\n");
char *line = NULL, *b;
line = strtok_r(histbuf, "\n", &b);
while(line)
{
history.add(new hline)->buf = newstring(line);
line = strtok(NULL, "\n");
line = strtok_r(NULL, "\n", &b);
}
DELETEA(histbuf);
histpos = history.length();
+3 -3
View File
@@ -98,7 +98,7 @@ void setedithide(char *text) // FIXME: human indexing inside
eh_ents.setsize(0);
if(text && text[0] != '\0')
{
const char *s = strtok(text, " ");
char *b, *s = strtok_r(text, " ", &b);
do
{
bool k = false;
@@ -108,7 +108,7 @@ void setedithide(char *text) // FIXME: human indexing inside
if(sn!=-1) { loopv(eh_ents) { if(eh_ents[i]==sn) { k = true; } } }
else sn = tn;
if(!k) { if(sn>0 && sn<MAXENTTYPES) eh_ents.add(sn); }
s = strtok(NULL, " ");
s = strtok_r(NULL, " ", &b);
}
while(s);
}
@@ -120,7 +120,7 @@ void seteditshow(char *just)
eh_ents.setsize(0);
if(just && just[0] != '\0')
{
const char *s = strtok(just, " ");
char *b, *s = strtok_r(just, " ", &b);
int sn = -1;
int tn = atoi(s);
loopi(MAXENTTYPES) if(!strcmp(entnames[i], s)) sn = i;
+1
View File
@@ -36,6 +36,7 @@
#include <Dbghelp.h>
#endif
#define ZLIB_DLL
#define NO_POSIX_R
#endif
#ifndef STANDALONE
+6 -6
View File
@@ -854,7 +854,7 @@ const char *favcatcheck(serverinfo &si, const char *ckeys, char *autokeys = NULL
if(!ckeys) return NULL;
static char *nkeys = NULL;
const char *sep = " \t\n\r";
char *keys = newstring(ckeys), *k = strtok(keys, sep);
char *keys = newstring(ckeys), *b, *k = strtok_r(keys, sep, &b);
bool res = false;
DELETEA(nkeys);
nkeys = newstring(strlen(ckeys));
@@ -871,7 +871,7 @@ const char *favcatcheck(serverinfo &si, const char *ckeys, char *autokeys = NULL
if(*nkeys) strcat(nkeys, " ");
strcat(nkeys, k);
}
k = strtok(NULL, sep);
k = strtok_r(NULL, sep, &b);
}
delete[] keys;
return res ? nkeys : NULL;
@@ -883,13 +883,13 @@ void serverbrowseralternativeviews(int shiftdirection)
const char *ckeys = getalias("serverbrowseraltviews");
if(!ckeys) return;
const char *sep = " \t\n\r";
char *keys = newstring(ckeys), *k = strtok(keys, sep);
char *keys = newstring(ckeys), *b, *k = strtok_r(keys, sep, &b);
vector<int> cats;
cats.add(0);
while(k)
{
loopv(favcats) if(!strcmp(favcats[i], k)) cats.add(i + 1);
k = strtok(NULL, sep);
k = strtok_r(NULL, sep, &b);
}
delete[] keys;
if(cats.length())
@@ -916,7 +916,7 @@ bool assignserverfavourites()
loopi(FC_NUM) { alx[i] = getalias(favcatargname(favcats[j], i)); alxn[i] = alx[i] ? atoi(alx[i]) : 0; }
favcattags.add(alx[FC_TAG]);
bool showonlythiscat = j == showonlyfavourites - 1;
char *keys = newstring(alx[FC_KEYS]), *k = strtok(keys, sep);
char *keys = newstring(alx[FC_KEYS]), *b, *k = strtok_r(keys, sep, &b);
while(k)
{
loopv(servers)
@@ -939,7 +939,7 @@ bool assignserverfavourites()
}
}
}
k = strtok(NULL, sep);
k = strtok_r(NULL, sep, &b);
}
delete[] keys;
}
+15 -15
View File
@@ -318,19 +318,19 @@ struct servermaprot : serverconfigfile
const char *sep = ": ";
configset c;
int i, line = 0;
char *l, *p = buf;
char *b, *l, *p = buf;
logline(ACLOG_VERBOSE,"reading map rotation '%s'", filename);
while(p < buf + filelen)
{
l = p; p += strlen(p) + 1; line++;
l = strtok(l, sep);
l = strtok_r(l, sep, &b);
if(l)
{
copystring(c.mapname, behindpath(l));
for(i = 3; i < CONFIG_MAXPAR; i++) c.par[i] = 0; // default values
for(i = 0; i < CONFIG_MAXPAR; i++)
{
if((l = strtok(NULL, sep)) != NULL) c.par[i] = atoi(l);
if((l = strtok_r(NULL, sep, &b)) != NULL) c.par[i] = atoi(l);
else break;
}
if(i > 2)
@@ -498,15 +498,15 @@ struct servernickblacklist : serverconfigfile
int line = 1, errors = 0;
iprchain iprc;
blackline bl;
char *l, *s, *r, *p = buf;
char *b, *l, *s, *r, *p = buf;
logline(ACLOG_VERBOSE,"reading nickname blacklist '%s'", filename);
while(p < buf + filelen)
{
l = p; p += strlen(p) + 1;
l = strtok(l, sep);
l = strtok_r(l, sep, &b);
if(l)
{
s = strtok(NULL, sep);
s = strtok_r(NULL, sep, &b);
int ic = 0;
if(s && (!strcmp(l, "accept") || !strcmp(l, "a")))
{ // accept nickname IP-range
@@ -544,7 +544,7 @@ struct servernickblacklist : serverconfigfile
bl.frag[i] = blfraglist.length();
blfraglist.add(newstring(s));
}
s = strtok(NULL, sep);
s = strtok_r(NULL, sep, &b);
if(!s) break;
}
bl.ignorecase = ic > 0;
@@ -733,19 +733,19 @@ struct serverpasswords : serverconfigfile
pwddetail c;
const char *sep = " ";
int i, line = 1, par[ADMINPWD_MAXPAR];
char *l, *p = buf;
char *b, *l, *p = buf;
logline(ACLOG_VERBOSE,"reading admin passwords '%s'", filename);
while(p < buf + filelen)
{
l = p; p += strlen(p) + 1;
l = strtok(l, sep);
l = strtok_r(l, sep, &b);
if(l)
{
copystring(c.pwd, l);
par[0] = 0; // default values
for(i = 0; i < ADMINPWD_MAXPAR; i++)
{
if((l = strtok(NULL, sep)) != NULL) par[i] = atoi(l);
if((l = strtok_r(NULL, sep, &b)) != NULL) par[i] = atoi(l);
else break;
}
//if(i > 0)
@@ -815,10 +815,10 @@ struct serverinfofile
defformatstring(fname)("%s_%s.txt", fnbase, lang);
path(fname);
int len, n;
char *c, *s, *t, *buf = loadfile(fname, &len);
char *c, *b, *s, *t, *buf = loadfile(fname, &len);
if(!buf) return NULL;
char *nbuf = new char[len + 2];
for(t = nbuf, s = strtok(buf, "\n\r"); s; s = strtok(NULL, "\n\r"))
for(t = nbuf, s = strtok_r(buf, "\n\r", &b); s; s = strtok_r(NULL, "\n\r", &b))
{
c = strstr(s, "//");
if(c) *c = '\0'; // strip comments
@@ -885,19 +885,19 @@ struct killmessagesfile : serverconfigfile
if(getfilesize(filename) == filelen) return;
if(!load()) return;
char *l, *s, *p = buf;
char *b, *l, *s, *p = buf;
const char *sep = " \"";
int line = 0;
logline(ACLOG_VERBOSE,"reading kill messages file '%s'", filename);
while(p < buf + filelen)
{
l = p; p += strlen(p) + 1;
l = strtok(l, sep);
l = strtok_r(l, sep, &b);
char *message;
if(l)
{
s = strtok(NULL, sep);
s = strtok_r(NULL, sep, &b);
bool fragmsg = !strcmp(l, "fragmessage");
bool gibmsg = !strcmp(l, "gibmessage");
if(s && (fragmsg || gibmsg))
+2 -2
View File
@@ -277,8 +277,8 @@ bool listdir(const char *dir, const char *ext, vector<char *> &files)
DIR *d = opendir(path(pathname));
if(d)
{
struct dirent *de;
while((de = readdir(d)) != NULL)
struct dirent *de, b;
while(!readdir_r(d, &b, &de) && de != NULL)
{
if(!ext) files.add(newstring(de->d_name));
else
+18
View File
@@ -2,12 +2,30 @@
#include "cube.h"
#ifdef NO_POSIX_R
char *strtok_r(char *s, const char *delim, char **b)
{
if(s) *b = s;
*b += strspn(*b, delim);
if(!**b) return NULL;
s = *b;
*b += strcspn(s, delim);
if(**b) *(*b)++ = '\0';
return s;
}
#endif
const char *timestring(bool local, const char *fmt)
{
static string asciitime;
time_t t = time(NULL);
#ifdef NO_POSIX_R
struct tm * timeinfo;
timeinfo = local ? localtime(&t) : gmtime (&t);
#else
struct tm *timeinfo, b;
timeinfo = local ? localtime_r(&t, &b) : gmtime_r(&t, &b);
#endif
strftime(asciitime, sizeof(string) - 1, fmt ? fmt : "%Y%m%d_%H.%M.%S", timeinfo); // sortable time for filenames
return asciitime;
}
+3
View File
@@ -28,6 +28,9 @@ typedef unsigned int uint;
#define ASSERT(c) if(c) {}
#endif
#ifdef NO_POSIX_R
extern char *strtok_r(char *s, const char *delim, char **b); // homebrew
#endif
#ifdef swap
#undef swap
#endif