From: Markus Armbruster Date: Sun, 3 Feb 2008 20:43:49 +0000 (+0100) Subject: Make conftab.c independent of the current directory X-Git-Tag: v4.3.12~188 X-Git-Url: http://git.pond.sub.org/?p=empserver;a=commitdiff_plain;h=b76e5a5eed06e7196cfbac1d70e837673ce6c140 Make conftab.c independent of the current directory read_builtin_tables() wanted to run in builtindir, and read_custom_tables() wanted to run in configdir. Bothersome. Use new fopenat() to relax those requirements. The chdir() satisfying them are now superflous, remove them. --- diff --git a/include/prototypes.h b/include/prototypes.h index 84462efa4..6c170c174 100644 --- a/include/prototypes.h +++ b/include/prototypes.h @@ -323,6 +323,7 @@ extern int xundump(FILE *, char *, int *, int); */ /* fnameat.c */ extern char *fnameat(const char *, const char *); +extern FILE *fopenat(const char *, const char *, const char *); /* fsize.c */ extern int fsize(int); extern int blksize(int); diff --git a/src/lib/common/conftab.c b/src/lib/common/conftab.c index f18d572e2..980c710d7 100644 --- a/src/lib/common/conftab.c +++ b/src/lib/common/conftab.c @@ -42,6 +42,10 @@ static int read_custom_table_file(char *); +/* + * Read builtin configuration tables. + * Return 0 on success, -1 on failure. + */ int read_builtin_tables(void) { @@ -56,7 +60,7 @@ read_builtin_tables(void) */ for (ep = empfile; ep->name; ep++) { if (!EF_IS_GAME_STATE(ep->uid) && ep->file) { - if ((fp = fopen(ep->file, "r")) == NULL) { + if ((fp = fopenat(ep->file, "r", builtindir)) == NULL) { fprintf(stderr, "Can't open %s for reading (%s)\n", ep->file, strerror(errno)); return -1; @@ -107,7 +111,7 @@ read_custom_table_file(char *fname) int lineno, res, n; FILE *fp; - if (!(fp = fopen(fname, "r"))) { + if (!(fp = fopenat(fname, "r", configdir))) { fprintf(stderr, "Can't open config table %s for reading (%s)\n", fname, strerror(errno)); return -1; diff --git a/src/lib/gen/fnameat.c b/src/lib/gen/fnameat.c index 1f4a942cf..995320c36 100644 --- a/src/lib/gen/fnameat.c +++ b/src/lib/gen/fnameat.c @@ -71,3 +71,26 @@ fname_is_abs(const char *fname) return fname[0] == '/'; #endif } + +/* + * Open a stream like fopen(), optionally relative to a directory. + * This is exactly like fopen(), except FNAME is interpreted relative + * to DIR if that is neither null nor empty. + */ +FILE * +fopenat(const char *fname, const char *mode, const char *dir) +{ + char *fnat; + FILE *fp; + + fnat = fnameat(fname, dir); + if (!fnat) + return NULL; + + fp = fopen(fnat, mode); + + if (fnat != fname) + free(fnat); + + return fp; +} diff --git a/src/server/main.c b/src/server/main.c index 20d1a2645..3953f95c8 100644 --- a/src/server/main.c +++ b/src/server/main.c @@ -214,23 +214,8 @@ main(int argc, char **argv) if (emp_config(config_file) < 0) exit(EXIT_FAILURE); ef_init(); - if (chdir(configdir)) { - fprintf(stderr, "Can't chdir to %s (%s)\n", - configdir, strerror(errno)); - exit(EXIT_FAILURE); - } - if (chdir(builtindir)) { - fprintf(stderr, "Can't chdir to %s (%s)\n", - builtindir, strerror(errno)); - exit(EXIT_FAILURE); - } if (read_builtin_tables() < 0) exit(EXIT_FAILURE); - if (chdir(configdir)) { - fprintf(stderr, "Can't chdir to %s (%s)\n", - configdir, strerror(errno)); - exit(EXIT_FAILURE); - } if (read_custom_tables() < 0) exit(EXIT_FAILURE); if (chdir(gamedir)) {