]> sourceware.org Git - newlib-cygwin.git/commitdiff
* fhandler.h (class fhandler_socket): Declare new methods fchown,
authorCorinna Vinschen <corinna@vinschen.de>
Sat, 19 Feb 2005 20:03:18 +0000 (20:03 +0000)
committerCorinna Vinschen <corinna@vinschen.de>
Sat, 19 Feb 2005 20:03:18 +0000 (20:03 +0000)
fchmod and facl.
* fhandler_socket.cc (fhandler_socket::fstat): Handle AF_LOCAL
sockets.
(fhandler_socket::fchmod): New method.
(fhandler_socket::fchown): New method.
(fhandler_socket::facl): New method.

winsup/cygwin/ChangeLog
winsup/cygwin/fhandler.h
winsup/cygwin/fhandler_socket.cc

index 31685c20d4badb9047ce229970d6f66f3468720d..5c5cc537cdf4312c542babd921a3adc9dae8446e 100644 (file)
@@ -1,3 +1,13 @@
+2005-02-19  Corinna Vinschen  <corinna@vinschen.de>
+
+       * fhandler.h (class fhandler_socket): Declare new methods fchown,
+       fchmod and facl.
+       * fhandler_socket.cc (fhandler_socket::fstat): Handle AF_LOCAL
+       sockets.
+       (fhandler_socket::fchmod): New method.
+       (fhandler_socket::fchown): New method.
+       (fhandler_socket::facl): New method.
+
 2005-02-19  Corinna Vinschen  <corinna@vinschen.de>
 
        * localtime.cc: Temporary implementation of setting __tzrule's offset
index 2d9c6215ebb1e01d26138a8c260f9263e0d99c47..0617a82c50fde3a0d23eac428105892932b84986 100644 (file)
@@ -433,6 +433,9 @@ class fhandler_socket: public fhandler_base
   void signal_secret_event ();
   void close_secret_event ();
   int __stdcall fstat (struct __stat64 *buf) __attribute__ ((regparm (2)));
+  int __stdcall fchmod (mode_t mode) __attribute__ ((regparm (1)));
+  int __stdcall fchown (__uid32_t uid, __gid32_t gid) __attribute__ ((regparm (2)));
+  int __stdcall facl (int, int, __acl32 *) __attribute__ ((regparm (3)));
   bool is_slow () {return 1;}
 };
 
index 4f5552662429fa8fc2a14100364ac7cea2e7c3d4..757c5a76bf40c0b7b2f65fc530c1f5d301c723c6 100644 (file)
@@ -34,6 +34,7 @@
 #include "select.h"
 #include "wininfo.h"
 #include <unistd.h>
+#include <sys/acl.h>
 
 extern bool fdsock (cygheap_fdmanip& fd, const device *, SOCKET soc);
 extern "C" {
@@ -386,16 +387,67 @@ fhandler_socket::dup (fhandler_base *child)
 int __stdcall
 fhandler_socket::fstat (struct __stat64 *buf)
 {
-  int res = fhandler_base::fstat (buf);
-  if (!res)
+  int res;
+  if (get_device () == FH_UNIX)
     {
-      buf->st_dev = 0;
-      buf->st_ino = (__ino64_t) ((DWORD) get_handle ());
-      buf->st_mode = S_IFSOCK | S_IRWXU | S_IRWXG | S_IRWXO;
+      res = fhandler_base::fstat_fs (buf);
+      if (!res)
+        {
+         buf->st_mode = (buf->st_mode & ~S_IFMT) | S_IFSOCK;
+       }
+    }
+  else
+    {
+      res = fhandler_base::fstat (buf);
+      if (!res)
+       {
+         buf->st_dev = 0;
+         buf->st_ino = (__ino64_t) ((DWORD) get_handle ());
+         buf->st_mode = S_IFSOCK | S_IRWXU | S_IRWXG | S_IRWXO;
+       }
     }
   return res;
 }
 
+int
+fhandler_socket::fchmod (mode_t mode)
+{
+  if (get_device () == FH_UNIX)
+    {
+      fhandler_disk_file fh;
+      fh.set_name (pc);
+      fh.get_device () = FH_FS;
+      int ret = fh.fchmod (mode);
+      SetFileAttributes        (pc, GetFileAttributes (pc) | FILE_ATTRIBUTE_SYSTEM);
+      return ret;
+    }
+  return 0;
+}
+
+int
+fhandler_socket::fchown (__uid32_t uid, __gid32_t gid)
+{
+  if (get_device () == FH_UNIX)
+    {
+      fhandler_disk_file fh;
+      fh.set_name (pc);
+      return fh.fchown (uid, gid);
+    }
+  return 0;
+}
+
+int
+fhandler_socket::facl (int cmd, int nentries, __aclent32_t *aclbufp)
+{
+  if (get_device () == FH_UNIX)
+    {
+      fhandler_disk_file fh;
+      fh.set_name (pc);
+      return fh.facl (cmd, nentries, aclbufp);
+    }
+  return fhandler_base::facl (cmd, nentries, aclbufp);
+}
+
 int
 fhandler_socket::bind (const struct sockaddr *name, int namelen)
 {
This page took 0.040021 seconds and 5 git commands to generate.