Make conftab.c independent of the current directory
authorMarkus Armbruster <armbru@pond.sub.org>
Sun, 3 Feb 2008 20:43:49 +0000 (21:43 +0100)
committerMarkus Armbruster <armbru@pond.sub.org>
Thu, 7 Feb 2008 07:01:54 +0000 (08:01 +0100)
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.

include/prototypes.h
src/lib/common/conftab.c
src/lib/gen/fnameat.c
src/server/main.c

index 84462efa4c2ec844acaa5f7c059ba41316633cc7..6c170c174c4e229a91b8ce22e4862674b07591ac 100644 (file)
@@ -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);
index f18d572e2ec1f18db0de1362884f310f7ea14fae..980c710d7491e982eea344e528edcd609218e0ee 100644 (file)
 
 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;
index 1f4a942cfcf5ad09ff7ea26367f4db803925be7d..995320c36fa56429f36fcd378486940128358167 100644 (file)
@@ -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;
+}
index 20d1a264570518109291a1e2af92a8994f1673d4..3953f95c8bd870cfaec768cdb3a523a4f55c366c 100644 (file)
@@ -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)) {