[gnome-commander] Change owner of a file with GIO
- From: Uwe Scholz <uwescholz src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-commander] Change owner of a file with GIO
- Date: Sun, 30 May 2021 16:39:14 +0000 (UTC)
commit cd385ba5b2332df819294b49c90938ae0b0430c4
Author: Uwe Scholz <u scholz83 gmx de>
Date: Sun May 30 18:38:33 2021 +0200
Change owner of a file with GIO
src/dialogs/gnome-cmd-chown-dialog.cc | 37 ++++++++---------
src/dialogs/gnome-cmd-file-props-dialog.cc | 11 +++--
src/gnome-cmd-file.cc | 67 +++++++++++++++++++++++++-----
src/gnome-cmd-file.h | 2 +-
4 files changed, 82 insertions(+), 35 deletions(-)
---
diff --git a/src/dialogs/gnome-cmd-chown-dialog.cc b/src/dialogs/gnome-cmd-chown-dialog.cc
index 92d398277..5e82d245e 100644
--- a/src/dialogs/gnome-cmd-chown-dialog.cc
+++ b/src/dialogs/gnome-cmd-chown-dialog.cc
@@ -1,4 +1,4 @@
-/**
+/**
* @file gnome-cmd-chown-dialog.cc
* @copyright (C) 2001-2006 Marcus Bjurman\n
* @copyright (C) 2007-2012 Piotr Eljasiak\n
@@ -46,22 +46,16 @@ G_DEFINE_TYPE (GnomeCmdChownDialog, gnome_cmd_chown_dialog, GNOME_CMD_TYPE_DIALO
static void do_chown (GnomeCmdFile *in, uid_t uid, gid_t gid, gboolean recurse)
{
- g_return_if_fail (in != NULL);
- g_return_if_fail (in->info != NULL);
+ g_return_if_fail (in != nullptr);
+ g_return_if_fail (in->gFileInfo != nullptr);
- GnomeVFSResult ret = in->chown(uid, gid);
-
- if (ret != GNOME_VFS_OK)
+ if(!in->chown(uid, gid))
{
- gchar *fpath = in->get_real_path();
- gchar *msg = g_strdup_printf (_("Could not chown %s"), fpath);
- gnome_cmd_show_message (*main_win, msg, gnome_vfs_result_to_string (ret));
- g_free (msg);
- g_free (fpath);
+ return;
}
- else
- if (!recurse)
- return;
+
+ if (!recurse)
+ return;
if (in->GetGfileAttributeUInt32(G_FILE_ATTRIBUTE_STANDARD_TYPE) == G_FILE_TYPE_DIRECTORY)
{
@@ -72,11 +66,14 @@ static void do_chown (GnomeCmdFile *in, uid_t uid, gid_t gid, gboolean recurse)
for (GList *i = gnome_cmd_dir_get_files (dir); i; i = i->next)
{
GnomeCmdFile *f = (GnomeCmdFile *) i->data;
- if (!f->is_dotdot && strcmp (f->info->name, ".") != 0
- && !GNOME_VFS_FILE_INFO_SYMLINK(f->info))
+
+ auto filename = GetGfileAttributeString(f->gFile, G_FILE_ATTRIBUTE_STANDARD_NAME);
+ if (!f->is_dotdot && strcmp (filename, ".") != 0
+ && !g_file_info_get_is_symlink(f->gFileInfo))
{
do_chown (f, uid, gid, TRUE);
}
+ g_free(filename);
}
gnome_cmd_dir_unref (dir);
}
@@ -109,8 +106,8 @@ static void on_ok (GtkButton *button, GnomeCmdChownDialog *dialog)
g_return_if_fail (f != NULL);
- if (GNOME_VFS_FILE_INFO_LOCAL (f->info))
- do_chown (f, uid, gid, recurse);
+ //ToDo: Check if this works also on non-local filesystems
+ do_chown (f, uid, gid, recurse);
}
view_refresh (NULL, NULL);
@@ -185,7 +182,9 @@ GtkWidget *gnome_cmd_chown_dialog_new (GList *files)
dialog->priv->files = gnome_cmd_file_list_copy (files);
GnomeCmdFile *f = GNOME_CMD_FILE (dialog->priv->files->data);
- gnome_cmd_chown_component_set (GNOME_CMD_CHOWN_COMPONENT (dialog->priv->chown_component), f->info->uid,
f->info->gid);
+ gnome_cmd_chown_component_set (GNOME_CMD_CHOWN_COMPONENT (dialog->priv->chown_component),
+ GetGfileAttributeUInt32(f->gFile, G_FILE_ATTRIBUTE_UNIX_UID),
+ GetGfileAttributeUInt32(f->gFile, G_FILE_ATTRIBUTE_UNIX_GID));
return GTK_WIDGET (dialog);
}
diff --git a/src/dialogs/gnome-cmd-file-props-dialog.cc b/src/dialogs/gnome-cmd-file-props-dialog.cc
index 2f655bdd8..ddb7e5e83 100644
--- a/src/dialogs/gnome-cmd-file-props-dialog.cc
+++ b/src/dialogs/gnome-cmd-file-props-dialog.cc
@@ -188,6 +188,7 @@ static void do_calc_tree_size (GnomeCmdFilePropsDialogPrivate *data)
static void on_dialog_ok (GtkButton *btn, GnomeCmdFilePropsDialogPrivate *data)
{
GnomeVFSResult result = GNOME_VFS_OK;
+ gboolean retValue = true;
const gchar *filename = gtk_entry_get_text (GTK_ENTRY (data->filename_entry));
@@ -209,15 +210,17 @@ static void on_dialog_ok (GtkButton *btn, GnomeCmdFilePropsDialogPrivate *data)
if (result == GNOME_VFS_OK)
{
-
uid_t uid = gnome_cmd_chown_component_get_owner (GNOME_CMD_CHOWN_COMPONENT (data->chown_component));
gid_t gid = gnome_cmd_chown_component_get_group (GNOME_CMD_CHOWN_COMPONENT (data->chown_component));
- if (uid != data->f->info->uid || gid != data->f->info->gid)
- result = data->f->chown(uid,gid);
+ if ( uid != GetGfileAttributeUInt32(data->f->gFile, G_FILE_ATTRIBUTE_UNIX_UID)
+ || gid != GetGfileAttributeUInt32(data->f->gFile, G_FILE_ATTRIBUTE_UNIX_GID))
+ {
+ retValue = data->f->chown(uid,gid);
+ }
}
- if (result != GNOME_VFS_OK)
+ if (result != GNOME_VFS_OK || !retValue)
{
gnome_cmd_show_message (NULL, filename, gnome_vfs_result_to_string (result));
return;
diff --git a/src/gnome-cmd-file.cc b/src/gnome-cmd-file.cc
index b5ad43a7f..f4661a2c8 100644
--- a/src/gnome-cmd-file.cc
+++ b/src/gnome-cmd-file.cc
@@ -378,6 +378,8 @@ void GnomeCmdFile::chmod(guint32 permissions)
return;
}
+ g_object_unref(gFileInfoPerms);
+
if (has_parent_dir (this))
{
GnomeCmdDir *dir = ::get_parent_dir (this);
@@ -385,21 +387,65 @@ void GnomeCmdFile::chmod(guint32 permissions)
gnome_cmd_dir_file_changed (dir, uri_str);
g_free (uri_str);
}
- g_object_unref(gFileInfoPerms);
}
-GnomeVFSResult GnomeCmdFile::chown(uid_t uid, gid_t gid)
+gboolean GnomeCmdFile::chown(uid_t uid, gid_t gid)
{
- g_return_val_if_fail (info != nullptr, GNOME_VFS_ERROR_CORRUPTED_DATA);
+ GError *error;
+ error = nullptr;
- if (uid != (uid_t)-1)
- info->uid = uid;
- info->gid = gid;
+ auto gFileInfoMods = g_file_query_info(gFile,
+ G_FILE_ATTRIBUTE_UNIX_UID "," G_FILE_ATTRIBUTE_UNIX_GID,
+ G_FILE_QUERY_INFO_NONE,
+ nullptr,
+ &error);
+ if (error)
+ {
+ g_message ("chown: retrieving file info failed: %s", error->message);
- GnomeVFSURI *uri = get_uri();
- GnomeVFSResult ret = gnome_vfs_set_file_info_uri (uri, info, GNOME_VFS_SET_FILE_INFO_OWNER);
- gnome_vfs_uri_unref (uri);
+ gchar *fname = GetGfileAttributeString(G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME);
+ gchar *msg = g_strdup_printf (_("Could not chown %s"), fname);
+ gnome_cmd_show_message (*main_win, msg, error->message);
+ g_free (msg);
+ g_free (fname);
+
+ g_error_free (error);
+ return false;
+ }
+
+ if (uid != (uid_t) -1)
+ {
+ g_file_info_set_attribute_uint32(gFileInfoMods,
+ G_FILE_ATTRIBUTE_UNIX_UID,
+ uid);
+ }
+
+ g_file_info_set_attribute_uint32(gFileInfoMods,
+ G_FILE_ATTRIBUTE_UNIX_GID,
+ gid);
+
+ g_file_set_attributes_from_info(gFile,
+ gFileInfoMods,
+ G_FILE_QUERY_INFO_NONE,
+ nullptr,
+ &error);
+ if (error)
+ {
+ g_message ("chmod: setting file mode failed: %s", error->message);
+
+ gchar *fname = GetGfileAttributeString(G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME);
+ gchar *msg = g_strdup_printf (_("Could not chown %s"), fname);
+ gnome_cmd_show_message (*main_win, msg, error->message);
+ g_free (msg);
+ g_free (fname);
+
+ g_object_unref(gFileInfoMods);
+ g_error_free (error);
+ return false;
+ }
+
+ g_object_unref(gFileInfoMods);
if (has_parent_dir (this))
{
@@ -408,8 +454,7 @@ GnomeVFSResult GnomeCmdFile::chown(uid_t uid, gid_t gid)
gnome_cmd_dir_file_changed (dir, uri_str);
g_free (uri_str);
}
-
- return ret;
+ return true;
}
diff --git a/src/gnome-cmd-file.h b/src/gnome-cmd-file.h
index 3978ce61d..7a823e05f 100644
--- a/src/gnome-cmd-file.h
+++ b/src/gnome-cmd-file.h
@@ -91,7 +91,7 @@ struct GnomeCmdFile
gboolean get_type_pixmap_and_mask(GdkPixmap **pixmap, GdkBitmap **mask);
void chmod(guint32 permissions);
- GnomeVFSResult chown(uid_t uid, gid_t gid);
+ gboolean chown(uid_t uid, gid_t gid);
GnomeVFSResult rename(const gchar *new_name);
void update_info(GnomeVFSFileInfo *info);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]