From 0cec0ffc787ee969b4003d04c031d38e2c523715 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Martin=20v=2E=20L=C3=B6wis?= <martin@v.loewis.de>
Date: Sun, 28 Jul 2002 16:33:45 +0000
Subject: Patch #573770: Implement lchown.

---
 Doc/lib/libos.tex     |  7 +++++++
 Misc/NEWS             |  6 +++---
 Modules/posixmodule.c | 30 ++++++++++++++++++++++++++++++
 configure             |  7 ++++---
 configure.in          |  4 ++--
 pyconfig.h.in         |  3 +++
 6 files changed, 49 insertions(+), 8 deletions(-)

diff --git a/Doc/lib/libos.tex b/Doc/lib/libos.tex
index 7a63890..d5f9a34 100644
--- a/Doc/lib/libos.tex
+++ b/Doc/lib/libos.tex
@@ -641,6 +641,13 @@ and \var{gid}.
 Availability: \UNIX.
 \end{funcdesc}
 
+\begin{funcdesc}{lchown}{path, uid, gid}
+Change the owner and group id of \var{path} to the numeric \var{uid}
+and gid. This function will not follow symbolic links.
+Availability: \UNIX.
+\versionadded{2.3}
+\end{funcdesc}
+
 \begin{funcdesc}{link}{src, dst}
 Create a hard link pointing to \var{src} named \var{dst}.
 Availability: \UNIX.
diff --git a/Misc/NEWS b/Misc/NEWS
index f8f3b7f..f7a0bcd 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -162,8 +162,8 @@ Extension modules
   This will create a temporary in-memory bsddb that won't be
   written to disk.
 
-- posix.killpg, posix.mknod, and posix.getpgid have been added where
-  available.
+- posix.lchown, posix.killpg, posix.mknod, and posix.getpgid have been
+  added where available.
 
 - The locale module now exposes the C library's gettext interface.
 
@@ -339,7 +339,7 @@ Build
   to require editing the core to teach the trashcan mechanism about the
   new type.
 
-- Accoring to Annex F of the current C standard,
+- According to Annex F of the current C standard,
 
     The Standard C macro HUGE_VAL and its float and long double analogs,
     HUGE_VALF and HUGE_VALL, expand to expressions whose values are
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index 47bea6f..6100067 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -930,6 +930,33 @@ posix_chown(PyObject *self, PyObject *args)
 }
 #endif /* HAVE_CHOWN */
 
+#ifdef HAVE_LCHOWN
+PyDoc_STRVAR(posix_lchown__doc__,
+"lchown(path, uid, gid)\n\n\
+Change the owner and group id of path to the numeric uid and gid.\n\
+This function will not follow symbolic links.");
+
+static PyObject *
+posix_lchown(PyObject *self, PyObject *args)
+{
+	char *path = NULL;
+	int uid, gid;
+	int res;
+	if (!PyArg_ParseTuple(args, "etii:lchown",
+	                      Py_FileSystemDefaultEncoding, &path,
+	                      &uid, &gid))
+		return NULL;
+	Py_BEGIN_ALLOW_THREADS
+	res = lchown(path, (uid_t) uid, (gid_t) gid);
+	Py_END_ALLOW_THREADS
+	if (res < 0)
+		return posix_error_with_allocated_filename(path);
+	PyMem_Free(path);
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+#endif /* HAVE_LCHOWN */
+
 
 #ifdef HAVE_GETCWD
 PyDoc_STRVAR(posix_getcwd__doc__,
@@ -6225,6 +6252,9 @@ static PyMethodDef posix_methods[] = {
 #ifdef HAVE_CHOWN
 	{"chown",	posix_chown, METH_VARARGS, posix_chown__doc__},
 #endif /* HAVE_CHOWN */
+#ifdef HAVE_LCHOWN
+	{"lchown",	posix_lchown, METH_VARARGS, posix_lchown__doc__},
+#endif /* HAVE_LCHOWN */
 #ifdef HAVE_CHROOT
 	{"chroot",	posix_chroot, METH_VARARGS, posix_chroot__doc__},
 #endif
diff --git a/configure b/configure
index 7fc3bfd..9024bcb 100755
--- a/configure
+++ b/configure
@@ -1,5 +1,5 @@
 #! /bin/sh
-# From configure.in Revision: 1.334 .
+# From configure.in Revision: 1.335 .
 # Guess values for system-dependent variables and create Makefiles.
 # Generated by GNU Autoconf 2.53.
 #
@@ -11438,11 +11438,12 @@ echo "${ECHO_T}MACHDEP_OBJS" >&6
 
 
 
+
 for ac_func in alarm chown chroot clock confstr ctermid ctermid_r execv \
  fchdir flock fork fsync fdatasync fpathconf ftime ftruncate \
  gai_strerror getgroups getlogin getpeername getpgid getpid getpwent getwd \
- hstrerror inet_pton kill killpg link lstat mkfifo mknod mktime mremap \
- nice pathconf pause plock poll pthread_init \
+ hstrerror inet_pton kill killpg lchown link lstat mkfifo mknod mktime \
+ mremap nice pathconf pause plock poll pthread_init \
  putenv readlink \
  select setegid seteuid setgid setgroups \
  setlocale setregid setreuid setsid setpgid setuid setvbuf snprintf \
diff --git a/configure.in b/configure.in
index 98d54d1..88a285f 100644
--- a/configure.in
+++ b/configure.in
@@ -1619,8 +1619,8 @@ AC_MSG_RESULT(MACHDEP_OBJS)
 AC_CHECK_FUNCS(alarm chown chroot clock confstr ctermid ctermid_r execv \
  fchdir flock fork fsync fdatasync fpathconf ftime ftruncate \
  gai_strerror getgroups getlogin getpeername getpgid getpid getpwent getwd \
- hstrerror inet_pton kill killpg link lstat mkfifo mknod mktime mremap \
- nice pathconf pause plock poll pthread_init \
+ hstrerror inet_pton kill killpg lchown link lstat mkfifo mknod mktime \
+ mremap nice pathconf pause plock poll pthread_init \
  putenv readlink \
  select setegid seteuid setgid setgroups \
  setlocale setregid setreuid setsid setpgid setuid setvbuf snprintf \
diff --git a/pyconfig.h.in b/pyconfig.h.in
index 8a9a1ad..05a355b 100644
--- a/pyconfig.h.in
+++ b/pyconfig.h.in
@@ -211,6 +211,9 @@
    Solaris and Linux, the necessary defines are already defined.) */
 #undef HAVE_LARGEFILE_SUPPORT
 
+/* Define to 1 if you have the `lchown' function. */
+#undef HAVE_LCHOWN
+
 /* Define to 1 if you have the `dl' library (-ldl). */
 #undef HAVE_LIBDL
 
-- 
cgit v0.12

