mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-08-02 07:23:41 +02:00
Merge branch 'backport-1134-file-copy-fix-glib-2-62' into 'glib-2-62'
Backport !1134 Fix for file copy permissions to glib-2-62 See merge request GNOME/glib!1142
This commit is contained in:
31
gio/gfile.c
31
gio/gfile.c
@@ -3188,6 +3188,7 @@ file_copy_fallback (GFile *source,
|
||||
const char *target;
|
||||
char *attrs_to_read;
|
||||
gboolean do_set_attributes = FALSE;
|
||||
GFileCreateFlags create_flags;
|
||||
|
||||
/* need to know the file type */
|
||||
info = g_file_query_info (source,
|
||||
@@ -3277,19 +3278,38 @@ file_copy_fallback (GFile *source,
|
||||
*
|
||||
* If a future API like g_file_replace_with_info() is added, switch
|
||||
* this code to use that.
|
||||
*
|
||||
* Use %G_FILE_CREATE_PRIVATE unless
|
||||
* - we were told to create the file with default permissions (i.e. the
|
||||
* process’ umask),
|
||||
* - or if the source file is on a file system which doesn’t support
|
||||
* `unix::mode` (in which case it probably also makes sense to create the
|
||||
* destination with default permissions because the source cannot be
|
||||
* private),
|
||||
* - or if the destination file is a `GLocalFile`, in which case we can
|
||||
* directly open() it with the permissions from the source file.
|
||||
*/
|
||||
create_flags = G_FILE_CREATE_NONE;
|
||||
if (!(flags & G_FILE_COPY_TARGET_DEFAULT_PERMS) &&
|
||||
g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_UNIX_MODE) &&
|
||||
!G_IS_LOCAL_FILE (destination))
|
||||
create_flags |= G_FILE_CREATE_PRIVATE;
|
||||
if (flags & G_FILE_COPY_OVERWRITE)
|
||||
create_flags |= G_FILE_CREATE_REPLACE_DESTINATION;
|
||||
|
||||
if (G_IS_LOCAL_FILE (destination))
|
||||
{
|
||||
if (flags & G_FILE_COPY_OVERWRITE)
|
||||
out = (GOutputStream*)_g_local_file_output_stream_replace (_g_local_file_get_filename (G_LOCAL_FILE (destination)),
|
||||
FALSE, NULL,
|
||||
flags & G_FILE_COPY_BACKUP,
|
||||
G_FILE_CREATE_REPLACE_DESTINATION |
|
||||
G_FILE_CREATE_PRIVATE, info,
|
||||
create_flags,
|
||||
(flags & G_FILE_COPY_TARGET_DEFAULT_PERMS) ? NULL : info,
|
||||
cancellable, error);
|
||||
else
|
||||
out = (GOutputStream*)_g_local_file_output_stream_create (_g_local_file_get_filename (G_LOCAL_FILE (destination)),
|
||||
FALSE, G_FILE_CREATE_PRIVATE, info,
|
||||
FALSE, create_flags,
|
||||
(flags & G_FILE_COPY_TARGET_DEFAULT_PERMS) ? NULL : info,
|
||||
cancellable, error);
|
||||
}
|
||||
else if (flags & G_FILE_COPY_OVERWRITE)
|
||||
@@ -3297,13 +3317,12 @@ file_copy_fallback (GFile *source,
|
||||
out = (GOutputStream *)g_file_replace (destination,
|
||||
NULL,
|
||||
flags & G_FILE_COPY_BACKUP,
|
||||
G_FILE_CREATE_REPLACE_DESTINATION |
|
||||
G_FILE_CREATE_PRIVATE,
|
||||
create_flags,
|
||||
cancellable, error);
|
||||
}
|
||||
else
|
||||
{
|
||||
out = (GOutputStream *)g_file_create (destination, G_FILE_CREATE_PRIVATE, cancellable, error);
|
||||
out = (GOutputStream *)g_file_create (destination, create_flags, cancellable, error);
|
||||
}
|
||||
|
||||
if (!out)
|
||||
|
Reference in New Issue
Block a user