From 0ee2b4640536a993fce38e0c4c3e2bf925c10318 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Thu, 19 Feb 2009 15:26:32 +0000 Subject: [PATCH] =?UTF-8?q?Bug=20549298=20=E2=80=93=20impossible=20to=20co?= =?UTF-8?q?py=20files=20with=20p=20(pipe)=20flag?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- gio/ChangeLog | 8 ++++++++ gio/gfile.c | 46 +++++++++++++++++++++++++++++++--------------- 2 files changed, 39 insertions(+), 15 deletions(-) diff --git a/gio/ChangeLog b/gio/ChangeLog index affd6af30..000f4e7e6 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 cc4768131..75c75ed3b 100644 --- a/gio/gfile.c +++ b/gio/gfile.c @@ -2306,19 +2306,22 @@ file_copy_fallback (GFile *source, GFileInfo *info; const char *target; - /* Maybe copy the symlink? */ - if (flags & G_FILE_COPY_NOFOLLOW_SYMLINKS) - { - 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; + /* 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 (g_file_info_get_file_type (info) == G_FILE_TYPE_SYMBOLIC_LINK && - (target = g_file_info_get_symlink_target (info)) != NULL) + if (info == NULL) + return FALSE; + + /* Maybe copy the symlink? */ + if ((flags & G_FILE_COPY_NOFOLLOW_SYMLINKS) && + g_file_info_get_file_type (info) == G_FILE_TYPE_SYMBOLIC_LINK) + { + 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; } - - g_object_unref (info); + /* ... 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;