[glib] Bug 593406 - Permissions set to 777 after copying via Nautilus



commit 48e0af0157f52ac12b904bd92540432a18b139c7
Author: Benjamin Otte <otte gnome org>
Date:   Tue Sep 1 21:26:08 2009 +0200

    Bug 593406 - Permissions set to 777 after copying via Nautilus
    
    Only fail to set the permissions when the actual file is a symlink.
    The previous fix failed for every file when NOFOLLOW_SYMLINKS was set.

 gio/glocalfileinfo.c |   21 ++++++++++++++++-----
 1 files changed, 16 insertions(+), 5 deletions(-)
---
diff --git a/gio/glocalfileinfo.c b/gio/glocalfileinfo.c
index b4e77d9..7182ec5 100644
--- a/gio/glocalfileinfo.c
+++ b/gio/glocalfileinfo.c
@@ -1874,20 +1874,31 @@ set_unix_mode (char                       *filename,
 	       GError                    **error)
 {
   guint32 val;
+  int res = 0;
   
   if (!get_uint32 (value, &val, error))
     return FALSE;
 
 #ifdef HAVE_SYMLINK
   if (flags & G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS) {
-    g_set_error_literal (error, G_IO_ERROR,
-                         G_IO_ERROR_NOT_SUPPORTED,
-                         _("Cannot set permissions on symlinks"));
-    return FALSE;
+    struct stat statbuf;
+    /* Calling chmod on a symlink changes permissions on the symlink.
+     * We don't want to do this, so we need to check for a symlink */
+    res = g_lstat (filename, &statbuf);
+    if (res == 0 && S_ISLNK (statbuf.st_mode))
+      {
+        g_set_error_literal (error, G_IO_ERROR,
+                             G_IO_ERROR_NOT_SUPPORTED,
+                             _("Cannot set permissions on symlinks"));
+        return FALSE;
+      }
   }
 #endif
 
-  if (g_chmod (filename, val) == -1)
+  if (res == 0)
+    res = g_chmod (filename, val);
+
+  if (res == -1)
     {
       int errsv = errno;
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]