Bug 549298 – impossible to copy files with p (pipe) flag

2009-02-19  Alexander Larsson  <alexl@redhat.com>

        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
This commit is contained in:
Alexander Larsson 2009-02-19 15:26:32 +00:00 committed by Alexander Larsson
parent d439f9bfae
commit 0ee2b46405
2 changed files with 39 additions and 15 deletions

View File

@ -1,3 +1,11 @@
2009-02-19 Alexander Larsson <alexl@redhat.com>
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 <alexl@redhat.com>
Bug 560564 Replacing a symlink with its linked file truncates the original file

View File

@ -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;