OSDN Git Service

* dir.cc (writable_directory): Comment out previous code,
authorcorinna <corinna>
Wed, 24 May 2000 20:09:43 +0000 (20:09 +0000)
committercorinna <corinna>
Wed, 24 May 2000 20:09:43 +0000 (20:09 +0000)
        return always 1 for now.
        (mkdir): Call set_file_attribute explicitely with S_IFDIR mode bit.
        * syscalls.cc (chown_worker): Ditto.
        (chmod): Ditto.
        * security.cc (get_nt_attribute): Fix error in debug output.
        Never set FILE_DELETE_CHILD for files.
        Construct appropriate inherit attribute according to file type.

winsup/cygwin/ChangeLog
winsup/cygwin/dir.cc
winsup/cygwin/security.cc
winsup/cygwin/syscalls.cc

index 2029f40..cb0156d 100644 (file)
@@ -1,3 +1,14 @@
+Wed May 24 21:59:00 2000  Corinna Vinschen <corinna@vinschen.de>
+
+       * dir.cc (writable_directory): Comment out previous code,
+       return always 1 for now.
+       (mkdir): Call set_file_attribute explicitely with S_IFDIR mode bit.
+       * syscalls.cc (chown_worker): Ditto.
+       (chmod): Ditto.
+       * security.cc (get_nt_attribute): Fix error in debug output.
+       Never set FILE_DELETE_CHILD for files.
+       Construct appropriate inherit attribute according to file type.
+       
 2000-05-23  DJ Delorie  <dj@cygnus.com>
 
        * syscalls.cc (_cygwin_istext_for_stdio): New, for newlib
index f3a869c..741be84 100644 (file)
@@ -23,6 +23,7 @@ details. */
 int __stdcall
 writable_directory (const char *file)
 {
+#if 0
   char dir[strlen (file) + 1];
 
   strcpy (dir, file);
@@ -44,6 +45,9 @@ writable_directory (const char *file)
   int acc = access (usedir, W_OK);
 
   return acc == 0;
+#else
+  return 1;
+#endif
 }
 
 /* opendir: POSIX 5.1.2.1 */
@@ -297,7 +301,7 @@ mkdir (const char *dir, mode_t mode)
   if (CreateDirectoryA (real_dir.get_win32 (), 0))
     {
       set_file_attribute (real_dir.has_acls (), real_dir.get_win32 (),
-                          (mode & 0777) & ~myself->umask);
+                          S_IFDIR | ((mode & 0777) & ~myself->umask));
       res = 0;
     }
   else
index bfec8a1..8537a6d 100644 (file)
@@ -605,7 +605,7 @@ get_nt_attribute (const char *file, int *attribute,
 
   if (! attribute)
     {
-      syscall_printf ("file: %s uid %d, gid %d", uid, gid);
+      syscall_printf ("file: %s uid %d, gid %d", file, uid, gid);
       return 0;
     }
 
@@ -834,6 +834,8 @@ alloc_sd (uid_t uid, gid_t gid, const char *logsrv, int attribute,
   // be (un)set in each ACE.
   if (! (attribute & S_IXOTH))
     attribute &= ~S_ISVTX;
+  if (! (attribute & S_IFDIR))
+    attribute |= S_ISVTX;
 
   // From here fill ACL
   size_t acl_len = sizeof (ACL);
@@ -887,23 +889,26 @@ alloc_sd (uid_t uid, gid_t gid, const char *logsrv, int attribute,
   DWORD group_deny = ~group_allow & other_allow;
   group_deny &= ~(STANDARD_RIGHTS_READ | FILE_READ_ATTRIBUTES | FILE_READ_EA);
 
+  // Construct appropriate inherit attribute
+  DWORD inherit = (attribute & S_IFDIR) ? INHERIT_ALL : DONT_INHERIT;
+
   // Set deny ACE for owner
   if (owner_deny
       && ! add_access_denied_ace (acl, ace_off++, owner_deny,
-                                  owner_sid, acl_len, INHERIT_ALL))
+                                  owner_sid, acl_len, inherit))
       return NULL;
   // Set allow ACE for owner
   if (! add_access_allowed_ace (acl, ace_off++, owner_allow,
-                                owner_sid, acl_len, INHERIT_ALL))
+                                owner_sid, acl_len, inherit))
     return NULL;
   // Set deny ACE for group
   if (group_deny
       && ! add_access_denied_ace (acl, ace_off++, group_deny,
-                                  group_sid, acl_len, INHERIT_ALL))
+                                  group_sid, acl_len, inherit))
       return NULL;
   // Set allow ACE for group
   if (! add_access_allowed_ace (acl, ace_off++, group_allow,
-                                group_sid, acl_len, INHERIT_ALL))
+                                group_sid, acl_len, inherit))
     return NULL;
 
   // Get owner and group from current security descriptor
@@ -948,7 +953,7 @@ alloc_sd (uid_t uid, gid_t gid, const char *logsrv, int attribute,
 
   // Set allow ACE for everyone
   if (! add_access_allowed_ace (acl, ace_off++, other_allow,
-                                get_world_sid (), acl_len, INHERIT_ALL))
+                                get_world_sid (), acl_len, inherit))
     return NULL;
 
   // Set AclSize to computed value
index cf743d0..d2eeab0 100644 (file)
@@ -701,6 +701,8 @@ chown_worker (const char *name, symlink_follow fmode, uid_t uid, gid_t gid)
             uid = old_uid;
           if (gid == (gid_t) -1)
             gid = old_gid;
+          if (win32_path.file_attributes () & FILE_ATTRIBUTE_DIRECTORY)
+            attrib |= S_IFDIR;
          res = set_file_attribute (win32_path.has_acls (),
                                     win32_path.get_win32 (),
                                    uid, gid, attrib,
@@ -805,9 +807,14 @@ chmod (const char *path, mode_t mode)
 
       uid_t uid;
       gid_t gid;
+
+      if (win32_path.file_attributes () & FILE_ATTRIBUTE_DIRECTORY)
+        mode |= S_IFDIR;
       get_file_attribute (win32_path.has_acls (),
                           win32_path.get_win32 (),
                           NULL, &uid, &gid);
+      if (win32_path.file_attributes () & FILE_ATTRIBUTE_DIRECTORY)
+        mode |= S_IFDIR;
       if (! set_file_attribute (win32_path.has_acls (),
                                 win32_path.get_win32 (),
                                uid, gid,