Relocate path names when searching for files.
authorJohn Darrington <john@darrington.wattle.id.au>
Sat, 7 Feb 2009 22:51:13 +0000 (07:51 +0900)
committerJohn Darrington <john@darrington.wattle.id.au>
Sat, 7 Feb 2009 22:51:13 +0000 (07:51 +0900)
When searching for configuration files etc. in a
search path, relocate the filenames before testing
for their existence.  Closes bug #25508

src/data/file-name.c
src/libpspp/str.c
src/libpspp/str.h

index 14afd60e53be5f86e01963d6f0a9aa08927e5de3..e9411b65d950d444ee07dbfd155bdaeb982d1351 100644 (file)
@@ -138,6 +138,7 @@ fn_search_path (const char *base_name, const char *path_)
       if (!ds_is_empty (&file) && !ISSLASH (ds_last (&file)))
        ds_put_char (&file, '/');
       ds_put_cstr (&file, base_name);
+      ds_relocate (&file);
 
       /* Check whether file exists. */
       if (fn_exists (ds_cstr (&file)))
index 9a7c6da8bfa8c36e50cca3cfd7b7bfe99a6cf0db..552968b5c837d02411e4e101a7ba419b1b0d7a32 100644 (file)
@@ -26,6 +26,7 @@
 #include <libpspp/message.h>
 #include <libpspp/pool.h>
 
+#include <relocatable.h>
 #include "minmax.h"
 #include "xalloc.h"
 #include "xsize.h"
@@ -1396,3 +1397,20 @@ ds_put_char_multiple (struct string *st, int ch, size_t cnt)
 {
   memset (ds_put_uninit (st, cnt), ch, cnt);
 }
+
+
+/* If relocation has been enabled, replace ST,
+   with its relocated version */
+void
+ds_relocate (struct string *st)
+{
+  const char *orig = ds_cstr (st);
+  const char *rel = relocate (orig);
+
+  if ( orig != rel)
+    {
+      ds_clear (st);
+      ds_put_cstr (st, rel);
+      free ((char *) rel);
+    }
+}
index ff00b3593356580bd3a2888a1d2c26ebaec4c217..ca990dbc3632f8b4d4f0870cf8874f595be44163 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 1997-9, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1997-9, 2000, 2009 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -218,4 +218,8 @@ void ds_put_format (struct string *, const char *, ...)
      PRINTF_FORMAT (2, 3);
 char *ds_put_uninit (struct string *st, size_t incr);
 
+/* Other */
+/* calls relocate from gnulib on ST */
+void ds_relocate (struct string *st);
+
 #endif /* str_h */