/*
* 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-2015, 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,
* 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
done:
WORLD_X &= ~1; /* force even */
- set_paths(file);
+ if (set_paths(file) < 0)
+ return -1;
return -errors;
}
{
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