]> git.pond.sub.org Git - empserver/blobdiff - src/lib/common/emp_config.c
Update copyright notice
[empserver] / src / lib / common / emp_config.c
index 17488622072bba11716bafadfcfba9b58247df69..fa9fb4f59203424557bf132ad5ce166a78732a6a 100644 (file)
@@ -1,11 +1,11 @@
 /*
  *  Empire - A multi-player, client/server Internet based war game.
- *  Copyright (C) 1986-2008, Dave Pare, Jeff Bailey, Thomas Ruschak,
- *                           Ken Stevens, Steve McClure
+ *  Copyright (C) 1986-2016, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ *                Ken Stevens, Steve McClure, Markus Armbruster
  *
- *  This program is free software; you can redistribute it and/or modify
+ *  Empire is free software: you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
+ *  the Free Software Foundation, either version 3 of the License, or
  *  (at your option) any later version.
  *
  *  This program is distributed in the hope that it will be useful,
@@ -14,8 +14,7 @@
  *  GNU General Public License for more details.
  *
  *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
  *
  *  ---
  *
  *  ---
  *
  *  emp_config.c: Allows config file to control server config. from a file
- * 
+ *
  *  Known contributors to this file:
  *     Julian Onions, 1995
  *     Steve McClure, 1998-2000
+ *     Markus Armbruster, 2004-2011
  */
 
 /*
 #include <string.h>
 #include <unistd.h>
 
-#include "file.h"
 #include "misc.h"
 #include "optlist.h"
 #include "prototypes.h"
 
-/* Dummy one */
-static int emp_config_dummy;
-
-/* things that can be changed */
-struct keymatch configkeys[] = {
-#define        EMP_CONFIG_C_OUTPUT
-#include "econfig-spec.h"
-#undef EMP_CONFIG_C_OUTPUT
-};
-
 static struct keymatch *keylookup(char *key, struct keymatch tbl[]);
-static void set_paths(char *);
+static int set_paths(char *);
 
 /*
  * read in empire configuration
@@ -149,8 +138,8 @@ emp_config(char *file)
     fclose(fp);
 
 done:
-    WORLD_X &= ~1;             /* force even */
-    set_paths(file);
+    if (set_paths(file) < 0)
+       return -1;
 
     return -errors;
 }
@@ -161,52 +150,50 @@ keylookup(char *command, struct keymatch *tbl)
 {
     struct keymatch *kp;
 
-    if (command == 0 || *command == 0)
-       return 0;
-    for (kp = tbl; kp->km_key != 0; kp++) {
+    if (!command || !*command)
+       return NULL;
+    for (kp = tbl; kp->km_key; kp++) {
        if (strcmp(kp->km_key, command) == 0)
            return kp;
     }
     return NULL;
 }
 
-static void
+static int
 set_paths(char *econfig)
 {
-    char *slash;
-    char *cwd = getcwd(NULL, 0);
+    char *p, *slash;
 
 #ifdef _WIN32
-    /* normalize path separator to '\\', for easier searching: */
-    econfig = _fullpath(NULL, econfig, 0);
-    slash = strrchr(econfig, '\\');
-    configdir = malloc(slash - econfig + 1);
-    memcpy(configdir, econfig, slash - econfig);
-    configdir[slash - econfig] = 0;
+    p = _fullpath(NULL, econfig, 0);
+    slash = strrchr(p, '\\');
 #else
-    if ((slash = strrchr(econfig, '/'))) {
-       configdir = malloc(slash - econfig + 1);
-       memcpy(configdir, econfig, slash - econfig);
-       configdir[slash - econfig] = 0;
-    } else
-       configdir = strdup(cwd);
-
-    if (configdir[0] != '/') {
-       char *tmp = configdir;
-       size_t len = strlen(cwd);
-
-       configdir = malloc(len + 1 + strlen(tmp) + 1);
-       sprintf(configdir, "%s/%s", cwd, tmp);
-       free(tmp);
+    char buf[1024];
+    char *cwd;
+
+    cwd = getcwd(buf, sizeof(buf));
+    p = fnameat(econfig, cwd);
+    if (p[0] != '/') {
+       fprintf(stderr, "Can't get current working directory (%s)\n",
+               strerror(errno));
+       if (p != econfig)
+           free(p);
+       return -1;
     }
+    if (p == econfig)
+       p = strdup(p);
+    slash = strrchr(p, '/');
 #endif /* !_WIN32 */
 
+    *slash = 0;
+    configdir = realloc(p, slash + 1 - p);
+
     infodir = fnameat(infodir_conf, configdir);
     gamedir = fnameat(gamedir_conf, configdir);
     builtindir = fnameat(builtindir_conf, configdir);
     schedulefil = fnameat("schedule", configdir);
 
-    free(cwd);
+    return 0;
 }
 
 void