next attempt to fix the use of wordexp(3) ...
authorPaul Davis <paul@linuxaudiosystems.com>
Thu, 10 Nov 2011 21:02:14 +0000 (21:02 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Thu, 10 Nov 2011 21:02:14 +0000 (21:02 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@10532 d708f5d6-7413-0410-9779-e7cbd77b26cf

libs/ardour/utils.cc

index c1192c4fe123acd645572cddd1bd08acbd54b6b6..3c6963bbc112faeac36206e9d6b9b0a767e24ee2 100644 (file)
@@ -51,6 +51,7 @@
 #include "pbd/xml++.h"
 #include "pbd/basename.h"
 #include "pbd/strsplit.h"
+#include "pbd/replace_all.h"
 
 #include "ardour/utils.h"
 #include "ardour/rc_configuration.h"
@@ -284,23 +285,24 @@ path_expand (string path)
 #ifdef HAVE_WORDEXP
        /* Handle tilde and environment variable expansion in session path */
        string ret = path;
-
+       string quoted;
        wordexp_t expansion;
-       
-       /* force field expansion to avoid use whitespace, since we know this is
-        * a path
-        */
 
-       char *oifs = getenv ("IFS");
-       setenv ("IFS", "/", 1);
-       int result = wordexp (path.c_str(), &expansion, WRDE_NOCMD|WRDE_UNDEF);
-       if (oifs) {
-               setenv ("IFS", oifs, 1);
-       } else {
-               unsetenv ("IFS");
-       }
+       /* wordexp cannot be forced (it appears) into either
+          
+           (1) NOT doing field splitting
+          (2) splitting based on something other than whitespace
+          
+          (despite the documentation claiming that it obeys IFS etc).
+
+          so, quote the most likely spaces to occur in a path, and that should
+          be about as much as we can do.
+       */
+
+       quoted = path;
+        replace_all (quoted, " ", "\\ ");
 
-       switch (result) {
+       switch (wordexp (quoted.c_str(), &expansion, WRDE_NOCMD|WRDE_UNDEF)) {
        case 0:
                break;
        case WRDE_NOSPACE: