diff options
Diffstat (limited to 'libs/pbd/file_utils.cc')
-rw-r--r-- | libs/pbd/file_utils.cc | 121 |
1 files changed, 92 insertions, 29 deletions
diff --git a/libs/pbd/file_utils.cc b/libs/pbd/file_utils.cc index bb290fa6aa..dd9805a3f3 100644 --- a/libs/pbd/file_utils.cc +++ b/libs/pbd/file_utils.cc @@ -23,14 +23,32 @@ #include <glib.h> #include <glib/gstdio.h> +#ifdef COMPILER_MINGW +#include <io.h> // For W_OK +#endif + #include <glibmm/fileutils.h> #include <glibmm/miscutils.h> #include <glibmm/pattern.h> -#include <giomm/file.h> +#include <errno.h> +#include <string.h> /* strerror */ + +/* open() */ +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> + +/* close(), read(), write() */ +#ifdef COMPILER_MSVC +#include <io.h> // Microsoft's nearest equivalent to <unistd.h> +#else +#include <unistd.h> +#endif #include "pbd/compose.h" #include "pbd/file_utils.h" +#include "pbd/debug.h" #include "pbd/error.h" #include "pbd/pathscanner.h" #include "pbd/stl_delete.h" @@ -76,6 +94,11 @@ find_matching_files_in_directory (const std::string& directory, std::string full_path(directory); full_path = Glib::build_filename (full_path, *file_iter); + DEBUG_TRACE ( + DEBUG::FileUtils, + string_compose("Found file %1\n", full_path) + ); + result.push_back(full_path); } } @@ -94,7 +117,7 @@ find_matching_files_in_directories (const vector<std::string>& paths, } void -find_matching_files_in_search_path (const SearchPath& search_path, +find_matching_files_in_search_path (const Searchpath& search_path, const Glib::PatternSpec& pattern, vector<std::string>& result) { @@ -102,7 +125,7 @@ find_matching_files_in_search_path (const SearchPath& search_path, } bool -find_file_in_search_path(const SearchPath& search_path, +find_file_in_search_path(const Searchpath& search_path, const string& filename, std::string& result) { @@ -113,24 +136,28 @@ find_file_in_search_path(const SearchPath& search_path, if (tmp.size() == 0) { + DEBUG_TRACE ( + DEBUG::FileUtils, + string_compose("No file matching %1 found in Path: %2\n", filename, search_path.to_string()) + ); return false; } -#if 0 if (tmp.size() != 1) { - info << string_compose - ( - "Found more than one file matching %1 in search path %2", - filename, - search_path () - ) - << endmsg; + DEBUG_TRACE ( + DEBUG::FileUtils, + string_compose("Found more that one file matching %1 in Path: %2\n", filename, search_path.to_string()) + ); } -#endif result = tmp.front(); + DEBUG_TRACE ( + DEBUG::FileUtils, + string_compose("Found file %1 in Path: %2\n", filename, search_path.to_string()) + ); + return true; } @@ -139,21 +166,57 @@ copy_file(const std::string & from_path, const std::string & to_path) { if (!Glib::file_test (from_path, Glib::FILE_TEST_EXISTS)) return false; - Glib::RefPtr<Gio::File> from_file = Gio::File::create_for_path(from_path); - Glib::RefPtr<Gio::File> to_file = Gio::File::create_for_path(to_path); + int fd_from = -1; + int fd_to = -1; + char buf[4096]; // BUFSIZ ?? + ssize_t nread; - try - { - from_file->copy (to_file, Gio::FILE_COPY_OVERWRITE); + fd_from = ::open(from_path.c_str(), O_RDONLY); + if (fd_from < 0) { + goto copy_error; } - catch(const Glib::Exception& ex) - { - error << string_compose (_("Unable to Copy file %1 to %2 (%3)"), - from_path, to_path, ex.what()) - << endmsg; - return false; + + fd_to = ::open(to_path.c_str(), O_WRONLY | O_CREAT, 0666); + if (fd_to < 0) { + goto copy_error; } - return true; + + while (nread = ::read(fd_from, buf, sizeof(buf)), nread > 0) { + char *out_ptr = buf; + do { + ssize_t nwritten = ::write(fd_to, out_ptr, nread); + if (nwritten >= 0) { + nread -= nwritten; + out_ptr += nwritten; + } else if (errno != EINTR) { + goto copy_error; + } + } while (nread > 0); + } + + if (nread == 0) { + if (::close(fd_to)) { + fd_to = -1; + goto copy_error; + } + ::close(fd_from); + return true; + } + +copy_error: + int saved_errno = errno; + + if (fd_from >= 0) { + ::close(fd_from); + } + if (fd_to >= 0) { + ::close(fd_to); + } + + error << string_compose (_("Unable to Copy file %1 to %2 (%3)"), + from_path, to_path, strerror(saved_errno)) + << endmsg; + return false; } static @@ -181,16 +244,16 @@ copy_files(const std::string & from_path, const std::string & to_dir) std::string get_absolute_path (const std::string & p) { - Glib::RefPtr<Gio::File> f = Gio::File::create_for_path (p); - return f->get_path (); + if (Glib::path_is_absolute(p)) return p; + return Glib::build_filename (Glib::get_current_dir(), p); } bool equivalent_paths (const std::string& a, const std::string& b) { - struct stat bA; + GStatBuf bA; int const rA = g_stat (a.c_str(), &bA); - struct stat bB; + GStatBuf bB; int const rB = g_stat (b.c_str(), &bB); return (rA == 0 && rB == 0 && bA.st_dev == bB.st_dev && bA.st_ino == bB.st_ino); @@ -221,7 +284,7 @@ exists_and_writable (const std::string & p) make us unwritable. */ - struct stat statbuf; + GStatBuf statbuf; if (g_stat (p.c_str(), &statbuf) != 0) { /* doesn't exist - not writable */ |