2002-10-18 Roland McGrath <roland@redhat.com>
authorroland <roland>
Sat, 19 Oct 2002 20:03:44 +0000 (20:03 +0000)
committerroland <roland>
Sat, 19 Oct 2002 20:03:44 +0000 (20:03 +0000)
* io/Makefile (routines): Add lchmod.
* io/sys/stat.h [__USE_BSD] (lchmod): Declare it.
* sysdeps/generic/lchmod.c: New file.
* sysdeps/mach/hurd/lchmod.c: New file.
* io/Versions (libc: GLIBC_2.3.2): New set, add lchmod.

io/Makefile
io/Versions
io/sys/stat.h
sysdeps/generic/lchmod.c [new file with mode: 0644]
sysdeps/mach/hurd/lchmod.c [new file with mode: 0644]

index f1a619d..97bff36 100644 (file)
@@ -33,7 +33,7 @@ routines :=                                                         \
        xstat fxstat lxstat xmknod xstat64 fxstat64 lxstat64          \
        statfs fstatfs statfs64 fstatfs64                             \
        statvfs fstatvfs statvfs64 fstatvfs64                         \
-       umask chmod fchmod mkdir                                      \
+       umask chmod fchmod lchmod mkdir                               \
        open open64 close read write lseek lseek64 access euidaccess  \
        fcntl flock lockf lockf64                                     \
        dup dup2 pipe                                                 \
index b5626f3..88f3a9a 100644 (file)
@@ -89,6 +89,10 @@ libc {
     # s*
     sendfile64;
   }
+  GLIBC_2.3.2 {
+    # l*
+    lchmod;
+  }
   GLIBC_PRIVATE {
     # functions which have an additional interface since they are
     # cancelable.
index a2a6692..32a3889 100644 (file)
@@ -1,4 +1,5 @@
-/* Copyright (C) 1991, 92, 1995-1999, 2000, 2001 Free Software Foundation, Inc.
+/* Copyright (C) 1991,1992,1995-1999,2000,2001,2002
+       Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -244,10 +245,16 @@ extern int lstat64 (__const char *__restrict __file,
 #endif
 
 /* Set file access permissions for FILE to MODE.
-   This takes an `int' MODE argument because that
-   is what `mode_t's get widened to.  */
+   If FILE is a symbolic link, this affects its target instead.  */
 extern int chmod (__const char *__file, __mode_t __mode) __THROW;
 
+#ifdef __USE_BSD
+/* Set file access permissions for FILE to MODE.
+   If FILE is a symbolic link, this affects the link itself
+   rather than its target.  */
+extern int lchmod (__const char *__file, __mode_t __mode) __THROW;
+#endif
+
 /* Set file access permissions of the file FD is open on to MODE.  */
 #if defined __USE_BSD || defined __USE_XOPEN_EXTENDED
 extern int fchmod (int __fd, __mode_t __mode) __THROW;
diff --git a/sysdeps/generic/lchmod.c b/sysdeps/generic/lchmod.c
new file mode 100644 (file)
index 0000000..524b24c
--- /dev/null
@@ -0,0 +1,33 @@
+/* lchmod -- Change the protections of a file or symbolic link.  Stub version.
+   Copyright (C) 2002 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <errno.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+/* Change the protections of FILE to MODE.  */
+int
+lchmod (const char *file, mode_t mode)
+{
+  __set_errno (ENOSYS);
+  return -1;
+}
+
+stub_warning (lchmod)
+#include <stub-tag.h>
diff --git a/sysdeps/mach/hurd/lchmod.c b/sysdeps/mach/hurd/lchmod.c
new file mode 100644 (file)
index 0000000..4f33f03
--- /dev/null
@@ -0,0 +1,38 @@
+/* lchmod -- Change the protections of a file or symbolic link.  Hurd version.
+   Copyright (C) 2002 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <errno.h>
+#include <stddef.h>
+#include <sys/stat.h>
+#include <hurd.h>
+
+/* Change the protections of FILE to MODE.  */
+int
+lchmod (const char *file, mode_t mode)
+{
+  error_t err;
+  file_t port = __file_name_lookup (file, O_NOLINK, 0);
+  if (port == MACH_PORT_NULL)
+    return -1;
+  err = __file_chmod (port, mode);
+  __mach_port_deallocate (__mach_task_self (), port);
+  if (err)
+    return __hurd_fail (err);
+  return 0;
+}