From: Alexander Larsson Date: Thu, 19 Feb 2009 15:26:32 +0000 (+0000) Subject: Bug 549298 – impossible to copy files with p (pipe) flag X-Git-Url: http://git.openbox.org/?a=commitdiff_plain;h=0ee2b4640536a993fce38e0c4c3e2bf925c10318;p=dana%2Fcg-glib.git Bug 549298 – impossible to copy files with p (pipe) flag 2009-02-19 Alexander Larsson Bug 549298 – impossible to copy files with p (pipe) flag * gfile.c: (file_copy_fallback): Error out if the source file is a special file svn path=/trunk/; revision=7885 --- diff --git a/gio/ChangeLog b/gio/ChangeLog index affd6af3..000f4e7e 100644 --- a/gio/ChangeLog +++ b/gio/ChangeLog @@ -1,3 +1,11 @@ +2009-02-19 Alexander Larsson + + Bug 549298 – impossible to copy files with p (pipe) flag + + * gfile.c: + (file_copy_fallback): + Error out if the source file is a special file + 2009-02-18 Alexander Larsson Bug 560564 – Replacing a symlink with its linked file truncates the original file diff --git a/gio/gfile.c b/gio/gfile.c index cc476813..75c75ed3 100644 --- a/gio/gfile.c +++ b/gio/gfile.c @@ -2306,19 +2306,22 @@ file_copy_fallback (GFile *source, GFileInfo *info; const char *target; + /* need to know the file type */ + info = g_file_query_info (source, + G_FILE_ATTRIBUTE_STANDARD_TYPE "," G_FILE_ATTRIBUTE_STANDARD_SYMLINK_TARGET, + G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, + cancellable, + error); + + if (info == NULL) + return FALSE; + /* Maybe copy the symlink? */ - if (flags & G_FILE_COPY_NOFOLLOW_SYMLINKS) + if ((flags & G_FILE_COPY_NOFOLLOW_SYMLINKS) && + g_file_info_get_file_type (info) == G_FILE_TYPE_SYMBOLIC_LINK) { - info = g_file_query_info (source, - G_FILE_ATTRIBUTE_STANDARD_TYPE "," G_FILE_ATTRIBUTE_STANDARD_SYMLINK_TARGET, - G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, - cancellable, - error); - if (info == NULL) - return FALSE; - - if (g_file_info_get_file_type (info) == G_FILE_TYPE_SYMBOLIC_LINK && - (target = g_file_info_get_symlink_target (info)) != NULL) + target = g_file_info_get_symlink_target (info); + if (target) { if (!copy_symlink (destination, flags, cancellable, target, error)) { @@ -2329,10 +2332,23 @@ file_copy_fallback (GFile *source, g_object_unref (info); goto copied_file; } - + /* ... else fall back on a regular file copy */ + g_object_unref (info); + } + /* Handle "special" files (pipes, device nodes, ...)? */ + else if (g_file_info_get_file_type (info) == G_FILE_TYPE_SPECIAL) + { + /* FIXME: could try to recreate device nodes and others? */ + + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Can't copy special file")); g_object_unref (info); + return FALSE; } - + /* Everything else should just fall back on a regular copy. */ + else + g_object_unref (info); + in = open_source_for_copy (source, destination, flags, cancellable, error); if (in == NULL) return FALSE;