Make PBD::sys::exists_and_writable take a string instead of sys::path
[ardour.git] / libs / pbd / filesystem.cc
index a4bf78180261428e5e5b5fd344394fbee17ee7fc..105af6ea32c57cf10ab0875e5562a3f915a9ae18 100644 (file)
@@ -94,7 +94,7 @@ exists (const path & p)
 }
 
 bool
-exists_and_writable (const path & p)
+exists_and_writable (const std::string & p)
 {
        /* writable() really reflects the whole folder, but if for any
           reason the session state file can't be written to, still
@@ -103,7 +103,7 @@ exists_and_writable (const path & p)
 
        struct stat statbuf;
 
-       if (g_stat (p.to_string().c_str(), &statbuf) != 0) {
+       if (g_stat (p.c_str(), &statbuf) != 0) {
                /* doesn't exist - not writable */
                return false;
        } else {
@@ -111,6 +111,13 @@ exists_and_writable (const path & p)
                        /* exists and is not writable */
                        return false;
                }
+               /* filesystem may be mounted read-only, so even though file
+                * permissions permit access, the mount status does not.
+                * access(2) seems like the best test for this.
+                */
+               if (g_access (p.to_string().c_str(), W_OK) != 0) {
+                       return false;
+               }
        }
 
        return true;
@@ -177,49 +184,7 @@ rename (const path & from_path, const path & to_path)
                throw filesystem_error(g_strerror(errno), errno);
        }
 }
-
-// XXX character encoding.
-void
-copy_file(const path & from_path, const path & to_path)
-{
-       std::ifstream in(from_path.to_string().c_str());
-       std::ofstream out(to_path.to_string().c_str());
-       
-       if (!in || !out) {
-               throw filesystem_error(string_compose(_("Could not open files %1 and %2 for copying"),
-                                       from_path.to_string(), to_path.to_string()));
-       }
-       
-       out << in.rdbuf();
-       
-       if (!in || !out) {
-               remove (to_path);
-               throw filesystem_error(string_compose(_("Could not copy existing file %1 to %2"),
-                                       from_path.to_string(), to_path.to_string()));
-       }
-}
-
-static
-bool accept_all_files (string const &, void *)
-{
-       return true;
-}
        
-void
-copy_files(const path & from_path, const path & to_dir)
-{
-       PathScanner scanner;
-       vector<string*>* files = scanner (from_path.to_string(), accept_all_files, 0, true, false);
-       for (vector<string*>::iterator i = files->begin(); i != files->end(); ++i) {
-               sys::path from = from_path;
-               from /= **i;
-               sys::path to = to_dir;
-               to /= **i;
-
-               copy_file (from, to);
-       }
-}
-
 string
 basename (const path & p)
 {
@@ -246,14 +211,6 @@ extension (const path & p)
 
 }
 
-/** Take a (possibly) relative path and make it absolute */
-path
-get_absolute_path (const path & p)
-{
-       Glib::RefPtr<Gio::File> f = Gio::File::create_for_path (p.to_string ());
-       return f->get_path ();
-}
-
 } // namespace sys
 
 } // namespace PBD