summaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
Diffstat (limited to 'src/common')
-rw-r--r--src/common/core.h2
-rw-r--r--src/common/db.c4
-rw-r--r--src/common/grfio.c134
-rw-r--r--src/common/plugins.c2
-rw-r--r--src/common/socket.c5
-rw-r--r--src/common/socket.h7
-rw-r--r--src/common/strlib.c10
7 files changed, 107 insertions, 57 deletions
diff --git a/src/common/core.h b/src/common/core.h
index 68325505a..fc4af3e3e 100644
--- a/src/common/core.h
+++ b/src/common/core.h
@@ -11,7 +11,7 @@ extern int runflag;
extern char *SERVER_NAME;
extern char SERVER_TYPE;
-extern int parse_console(char* buf);
+extern int parse_console(const char* buf);
extern const char *get_svn_revision(void);
extern int do_init(int,char**);
extern void set_server_type(void);
diff --git a/src/common/db.c b/src/common/db.c
index 4dcf1d0b0..595ed241d 100644
--- a/src/common/db.c
+++ b/src/common/db.c
@@ -697,7 +697,7 @@ static void db_free_add(DBMap_impl* db, DBNode node, DBNode *root)
db->alloc_file, db->alloc_line);
exit(EXIT_FAILURE);
}
- if (!(db->options&DB_OPT_DUP_KEY)) { // Make shure we have a key until the node is freed
+ if (!(db->options&DB_OPT_DUP_KEY)) { // Make sure we have a key until the node is freed
old_key = node->key;
node->key = db_dup_key(db, node->key);
db->release(old_key, node->data, DB_RELEASE_KEY);
@@ -1976,13 +1976,13 @@ static int db_obj_vclear(DBMap* self, DBApply func, va_list args)
node->deleted = 1;
}
DB_COUNTSTAT(db_node_free);
- ers_free(db->nodes, node);
if (parent) {
if (parent->left == node)
parent->left = NULL;
else
parent->right = NULL;
}
+ ers_free(db->nodes, node);
node = parent;
}
db->ht[i] = NULL;
diff --git a/src/common/grfio.c b/src/common/grfio.c
index fe94e0803..3c0960f30 100644
--- a/src/common/grfio.c
+++ b/src/common/grfio.c
@@ -12,6 +12,8 @@
#include "../common/cbasetypes.h"
#include "../common/showmsg.h"
#include "../common/malloc.h"
+#include "../common/strlib.h"
+#include "../common/utils.h"
//----------------------------
@@ -381,6 +383,35 @@ static void filelist_adjust(void)
}
}
+
+/// Combines are resource path with the data folder location to
+/// create local resource path.
+static void grfio_localpath_create(char* buffer, size_t size, const char* filename)
+{
+ unsigned int i;
+ size_t len;
+
+ len = strlen(data_dir);
+
+ if( data_dir[0] == 0 || data_dir[len-1] == '/' || data_dir[len-1] == '\\' )
+ {
+ safesnprintf(buffer, size, "%s%s", data_dir, filename);
+ }
+ else
+ {
+ safesnprintf(buffer, size, "%s/%s", data_dir, filename);
+ }
+
+ for( i = 0; buffer[i]; i++ )
+ {// normalize path
+ if( buffer[i] == '\\' )
+ {
+ buffer[i] = '/';
+ }
+ }
+}
+
+
/***********************************************************
*** Grfio Sobroutines ***
***********************************************************/
@@ -398,13 +429,10 @@ int grfio_size(char* fname)
FILELIST lentry;
struct stat st;
- sprintf(lfname, "%s%s", data_dir, fname);
-
- for (p = &lfname[0]; *p != 0; p++)
- if (*p=='\\') *p = '/';
+ grfio_localpath_create(lfname, sizeof(lfname), fname);
if (stat(lfname, &st) == 0) {
- strncpy(lentry.fn, fname, sizeof(lentry.fn) - 1);
+ safestrncpy(lentry.fn, fname, sizeof(lentry.fn));
lentry.fnd = NULL;
lentry.declen = st.st_size;
lentry.gentry = 0; // 0:LocalFile
@@ -428,35 +456,28 @@ void* grfio_reads(char* fname, int* size)
entry = filelist_find(fname);
if (entry == NULL || entry->gentry <= 0) { // LocalFileCheck
- char lfname[256], *p;
- FILELIST lentry;
+ char lfname[256];
+ int declen;
- sprintf(lfname, "%s%s", data_dir, fname);
-
- for (p = &lfname[0]; *p != 0; p++)
- if (*p == '\\') *p = '/';
+ grfio_localpath_create(lfname, sizeof(lfname), ( entry && entry->fnd ) ? entry->fnd : fname);
in = fopen(lfname, "rb");
if (in != NULL) {
- if (entry != NULL && entry->gentry == 0) {
- lentry.declen = entry->declen;
- } else {
- fseek(in,0,SEEK_END);
- lentry.declen = ftell(in);
- }
+ fseek(in,0,SEEK_END);
+ declen = ftell(in);
fseek(in,0,SEEK_SET);
- buf2 = (unsigned char *)aMallocA(lentry.declen + 1024);
- fread(buf2, 1, lentry.declen, in);
+ buf2 = (unsigned char *)aMallocA(declen+1); // +1 for resnametable zero-termination
+ fread(buf2, 1, declen, in);
fclose(in);
- strncpy(lentry.fn, fname, sizeof(lentry.fn) - 1);
- lentry.fnd = NULL;
- lentry.gentry = 0; // 0:LocalFile
- entry = filelist_modify(&lentry);
+ if( size )
+ {
+ size[0] = declen;
+ }
} else {
if (entry != NULL && entry->gentry < 0) {
entry->gentry = -entry->gentry; // local file checked
} else {
- ShowError("%s not found (grfio_reads - local file %s)\n", fname, lfname);
+ ShowError("grfio_reads: %s not found (local file: %s)\n", fname, lfname);
return NULL;
}
}
@@ -465,11 +486,11 @@ void* grfio_reads(char* fname, int* size)
char* grfname = gentry_table[entry->gentry - 1];
in = fopen(grfname, "rb");
if(in != NULL) {
- unsigned char *buf = (unsigned char *)aMallocA(entry->srclen_aligned + 1024);
+ unsigned char *buf = (unsigned char *)aMallocA(entry->srclen_aligned);
fseek(in, entry->srcpos, 0);
fread(buf, 1, entry->srclen_aligned, in);
fclose(in);
- buf2 = (unsigned char *)aMallocA(entry->declen + 1024);
+ buf2 = (unsigned char *)aMallocA(entry->declen+1); // +1 for resnametable zero-termination
if (entry->type == 1 || entry->type == 3 || entry->type == 5) {
uLongf len;
if (entry->cycle >= 0)
@@ -485,14 +506,16 @@ void* grfio_reads(char* fname, int* size)
} else {
memcpy(buf2, buf, entry->declen);
}
+ if( size )
+ {
+ size[0] = entry->declen;
+ }
aFree(buf);
} else {
- ShowError("%s not found (grfio_reads - GRF file %s)\n", fname, grfname);
+ ShowError("grfio_reads: %s not found (GRF file: %s)\n", fname, grfname);
return NULL;
}
}
- if (size != NULL && entry != NULL)
- *size = entry->declen;
return buf2;
}
@@ -590,7 +613,7 @@ static int grfio_entryread(char* grfname, int gentry)
aentry.srcpos = getlong(grf_filelist+ofs2+13)+0x2e;
aentry.cycle = srccount;
aentry.type = type;
- strncpy(aentry.fn, fname,sizeof(aentry.fn)-1);
+ safestrncpy(aentry.fn, fname, sizeof(aentry.fn));
aentry.fnd = NULL;
#ifdef GRFIO_LOCAL
aentry.gentry = -(gentry+1); // As Flag for making it a negative number carrying out the first time LocalFileCheck
@@ -657,7 +680,7 @@ static int grfio_entryread(char* grfname, int gentry)
aentry.srcpos = getlong(grf_filelist+ofs2+13)+0x2e;
aentry.cycle = srccount;
aentry.type = type;
- strncpy(aentry.fn,fname,sizeof(aentry.fn)-1);
+ safestrncpy(aentry.fn, fname, sizeof(aentry.fn));
aentry.fnd = NULL;
#ifdef GRFIO_LOCAL
aentry.gentry = -(gentry+1); // As Flag for making it a negative number carrying out the first time LocalFileCheck
@@ -686,17 +709,16 @@ static int grfio_entryread(char* grfname, int gentry)
*------------------------------------------*/
static void grfio_resourcecheck(void)
{
- char w1[256], w2[256], src[256], dst[256], restable[256], line[256];
+ char w1[256], w2[256], src[256], dst[256], restable[256], line[256], local[256];
char *ptr, *buf;
FILELIST* entry;
+ FILELIST fentry;
int size;
FILE* fp;
int i = 0;
// read resnametable from data directory and return if successful
- sprintf(restable, "%sdata\\resnametable.txt", data_dir);
- for (ptr = &restable[0]; *ptr != 0; ptr++)
- if (*ptr == '\\') *ptr = '/';
+ grfio_localpath_create(restable, sizeof(restable), "data\\resnametable.txt");
fp = fopen(restable, "rb");
if (fp) {
@@ -710,14 +732,28 @@ static void grfio_resourcecheck(void)
sprintf(dst, "data\\%s", w2);
entry = filelist_find(dst);
// create new entries reusing the original's info
- if (entry != NULL) {
- FILELIST fentry;
+ if (entry != NULL)
+ {// alias for GRF resource
memcpy(&fentry, entry, sizeof(FILELIST));
- strncpy(fentry.fn, src, sizeof(fentry.fn) - 1);
+ safestrncpy(fentry.fn, src, sizeof(fentry.fn));
fentry.fnd = aStrdup(dst);
filelist_modify(&fentry);
i++;
}
+ else
+ {
+ grfio_localpath_create(local, sizeof(local), dst);
+
+ if( exists(local) )
+ {// alias for local resource
+ memset(&fentry, 0, sizeof(fentry));
+ //fentry.gentry = 0;
+ safestrncpy(fentry.fn, src, sizeof(fentry.fn));
+ fentry.fnd = aStrdup(dst);
+ filelist_modify(&fentry);
+ i++;
+ }
+ }
}
}
fclose(fp);
@@ -738,14 +774,28 @@ static void grfio_resourcecheck(void)
sprintf(src, "data\\%s", w1);
sprintf(dst, "data\\%s", w2);
entry = filelist_find(dst);
- if (entry != NULL) {
- FILELIST fentry;
+ if (entry != NULL)
+ {// alias for GRF resource
memcpy(&fentry, entry, sizeof(FILELIST));
- strncpy(fentry.fn, src, sizeof(fentry.fn) - 1);
+ safestrncpy(fentry.fn, src, sizeof(fentry.fn));
fentry.fnd = aStrdup(dst);
filelist_modify(&fentry);
i++;
}
+ else
+ {
+ grfio_localpath_create(local, sizeof(local), dst);
+
+ if( exists(local) )
+ {// alias for local resource
+ memset(&fentry, 0, sizeof(fentry));
+ //fentry.gentry = 0;
+ safestrncpy(fentry.fn, src, sizeof(fentry.fn));
+ fentry.fnd = aStrdup(dst);
+ filelist_modify(&fentry);
+ i++;
+ }
+ }
}
ptr = strchr(ptr, '\n'); // Next line
if (!ptr) break;
@@ -824,7 +874,7 @@ void grfio_init(char* fname)
if(strcmp(w1, "grf") == 0) // GRF file
grf_num += (grfio_add(w2) == 0);
else if(strcmp(w1,"data_dir") == 0) { // Data directory
- strcpy(data_dir, w2);
+ safestrncpy(data_dir, w2, sizeof(data_dir));
}
}
fclose(data_conf);
diff --git a/src/common/plugins.c b/src/common/plugins.c
index 2d81548a1..2d50fc9e8 100644
--- a/src/common/plugins.c
+++ b/src/common/plugins.c
@@ -251,6 +251,8 @@ Plugin* plugin_open(const char* filename)
func = (Plugin_Event_Func*)DLL_SYM(plugin->dll, events[i].func_name);
if (func)
register_plugin_event(func, events[i].event_name);
+ else
+ ShowError("Failed to locate function '%s' in '%s'.\n", events[i].func_name, filename);
}
i++;
}
diff --git a/src/common/socket.c b/src/common/socket.c
index 89c605c9d..ff667cf2e 100644
--- a/src/common/socket.c
+++ b/src/common/socket.c
@@ -996,10 +996,10 @@ int access_ipmask(const char* str, AccessControl* acc)
(n == 5 && m[0] > 32) ){ // invalid bit mask
return 0;
}
- ip = (uint32)(a[0] | (a[1] << 8) | (a[2] << 16) | (a[3] << 24));
+ ip = MAKEIP(a[0],a[1],a[2],a[3]);
if( n == 8 )
{// standard mask
- mask = (uint32)(a[0] | (a[1] << 8) | (a[2] << 16) | (a[3] << 24));
+ mask = MAKEIP(m[0],m[1],m[2],m[3]);
} else if( n == 5 )
{// bit mask
mask = 0;
@@ -1007,7 +1007,6 @@ int access_ipmask(const char* str, AccessControl* acc)
mask = (mask >> 1) | 0x80000000;
--m[0];
}
- mask = ntohl(mask);
} else
{// just this ip
mask = 0xFFFFFFFF;
diff --git a/src/common/socket.h b/src/common/socket.h
index f7309f6d3..0a740a63f 100644
--- a/src/common/socket.h
+++ b/src/common/socket.h
@@ -135,6 +135,7 @@ uint32 host2ip(const char* hostname);
const char* ip2str(uint32 ip, char ip_str[16]);
uint32 str2ip(const char* ip_str);
#define CONVIP(ip) ((ip)>>24)&0xFF,((ip)>>16)&0xFF,((ip)>>8)&0xFF,((ip)>>0)&0xFF
+#define MAKEIP(a,b,c,d) (uint32)( ( ( (a)&0xFF ) << 24 ) | ( ( (b)&0xFF ) << 16 ) | ( ( (c)&0xFF ) << 8 ) | ( ( (d)&0xFF ) << 0 ) )
uint16 ntows(uint16 netshort);
int socket_getips(uint32* ips, int max);
@@ -152,12 +153,6 @@ void set_eof(int fd);
#define SEND_SHORTLIST
#ifdef SEND_SHORTLIST
-struct send_shortlist_node {
- struct send_shortlist_node *next; // Next node in the linked list
- struct send_shortlist_node *prev; // Previous node in the linked list
- int fd; // FD that needs sending.
-};
-
// Add a fd to the shortlist so that it'll be recognized as a fd that needs
// sending done on it.
void send_shortlist_add_fd(int fd);
diff --git a/src/common/strlib.c b/src/common/strlib.c
index 019e2d629..a0cba906c 100644
--- a/src/common/strlib.c
+++ b/src/common/strlib.c
@@ -925,6 +925,7 @@ bool sv_readdb(const char* directory, const char* filename, char delim, int minc
char** fields; // buffer for fields ([0] is reserved)
int columns, fields_length;
char path[1024], line[1024];
+ char* match;
snprintf(path, sizeof(path), "%s/%s", directory, filename);
@@ -944,9 +945,12 @@ bool sv_readdb(const char* directory, const char* filename, char delim, int minc
while( fgets(line, sizeof(line), fp) )
{
lines++;
- if( line[0] == '/' && line[1] == '/' )
- continue;
- //TODO: strip trailing // comment
+
+ if( ( match = strstr(line, "//") ) != NULL )
+ {// strip comments
+ match[0] = 0;
+ }
+
//TODO: strip trailing whitespace
if( line[0] == '\0' || line[0] == '\n' || line[0] == '\r')
continue;