Jordi Sanfeliu wrote:
> Well, this was only happening in my hobbyOS ...

OK, then let me clarify the affected platforms, through the patch below.
So that we roughly know where to test things when we make changes to this
#if-ed code.

> Anyway, some days later, I decided to include support for lchown in the 
> Fiwix kernel

That was the right thing to do, since lchown is in POSIX.

Bruno


2023-09-09  Bruno Haible  <[email protected]>

        chown, lchown: Revisit platforms.
        * doc/posix-functions/chown.texi: Update platforms list.
        * doc/posix-functions/lchown.texi: Likewise.
        * lib/chown.c (rpl_chown): Add platform comments.
        * lib/lchown.c: Likewise.

diff --git a/doc/posix-functions/chown.texi b/doc/posix-functions/chown.texi
index 6a62a6039f..295ed21504 100644
--- a/doc/posix-functions/chown.texi
+++ b/doc/posix-functions/chown.texi
@@ -11,18 +11,20 @@
 @item
 Some platforms fail to detect trailing slash on non-directories, as in
 @code{chown("link-to-file/",uid,gid)}:
-FreeBSD 7.2, AIX 7.1, Solaris 9.
+macOS 12.5, FreeBSD 7.2, AIX 7.3.1, Solaris 9.
 @item
 Some platforms fail to update the change time when at least one
 argument was not @minus{}1, but no ownership changes resulted:
-OpenBSD 6.7.
+OpenBSD 7.2.
 @item
 When passed an argument of @minus{}1, some implementations really set the owner
 user/group id of the file to this value, rather than leaving that id of the
-file alone.
+file alone:
+some very old platforms.
 @item
 When applied to a symbolic link, some implementations don't dereference
-the symlink, i.e.@: they behave like @code{lchown}.
+the symlink, i.e.@: they behave like @code{lchown}:
+some very old platforms.
 @item
 This function is missing on some platforms; however, the replacement
 always fails with @code{ENOSYS}:
diff --git a/doc/posix-functions/lchown.texi b/doc/posix-functions/lchown.texi
index d9a95b7d23..74f3abcaeb 100644
--- a/doc/posix-functions/lchown.texi
+++ b/doc/posix-functions/lchown.texi
@@ -9,6 +9,14 @@
 Portability problems fixed by Gnulib:
 @itemize
 @item
+This function is missing on some platforms; however, the replacement
+fails with @code{ENOSYS}:
+mingw, MSVC 14.
+@item
+This function is missing on some platforms; however, the replacement
+fails on symlinks:
+Minix 3.2.1.
+@item
 Some platforms fail to detect trailing slash on non-directories, as in
 @code{lchown("link-to-file/",uid,gid)}:
 FreeBSD 7.2, Solaris 9.
@@ -17,11 +25,6 @@
 argument was not -1, but no ownership changes resulted.  However,
 without @code{lchmod}, the replacement only fixes this for non-symlinks:
 OpenBSD 4.0.
-@item
-This function is missing on some platforms; however, the replacement
-fails on symlinks if @code{chown} is supported, and fails altogether
-with @code{ENOSYS} otherwise:
-Minix 3.1.8, mingw, MSVC 14.
 @end itemize
 
 Portability problems not fixed by Gnulib:
diff --git a/lib/chown.c b/lib/chown.c
index d735818afd..bf15e920b9 100644
--- a/lib/chown.c
+++ b/lib/chown.c
@@ -57,7 +57,7 @@ rpl_chown (const char *file, uid_t uid, gid_t gid)
   bool stat_valid = false;
   int result;
 
-# if CHOWN_CHANGE_TIME_BUG
+# if CHOWN_CHANGE_TIME_BUG /* OpenBSD 7.2 */
   if (gid != (gid_t) -1 || uid != (uid_t) -1)
     {
       if (stat (file, &st))
@@ -66,7 +66,7 @@ rpl_chown (const char *file, uid_t uid, gid_t gid)
     }
 # endif
 
-# if CHOWN_FAILS_TO_HONOR_ID_OF_NEGATIVE_ONE
+# if CHOWN_FAILS_TO_HONOR_ID_OF_NEGATIVE_ONE /* some very old platforms */
   if (gid == (gid_t) -1 || uid == (uid_t) -1)
     {
       /* Stat file to get id(s) that should remain unchanged.  */
@@ -79,7 +79,7 @@ rpl_chown (const char *file, uid_t uid, gid_t gid)
     }
 # endif
 
-# if CHOWN_MODIFIES_SYMLINK
+# if CHOWN_MODIFIES_SYMLINK /* some very old platforms */
   {
     /* Handle the case in which the system-supplied chown function
        does *not* follow symlinks.  Instead, it changes permissions
@@ -118,7 +118,7 @@ rpl_chown (const char *file, uid_t uid, gid_t gid)
   }
 # endif
 
-# if CHOWN_TRAILING_SLASH_BUG
+# if CHOWN_TRAILING_SLASH_BUG /* macOS 12.5, FreeBSD 7.2, AIX 7.3.1, Solaris 9 
*/
   if (!stat_valid)
     {
       size_t len = strlen (file);
@@ -129,7 +129,7 @@ rpl_chown (const char *file, uid_t uid, gid_t gid)
 
   result = chown (file, uid, gid);
 
-# if CHOWN_CHANGE_TIME_BUG
+# if CHOWN_CHANGE_TIME_BUG /* OpenBSD 7.2 */
   if (result == 0 && stat_valid
       && (uid == st.st_uid || uid == (uid_t) -1)
       && (gid == st.st_gid || gid == (gid_t) -1))
diff --git a/lib/lchown.c b/lib/lchown.c
index 19a68c052b..d474bc264e 100644
--- a/lib/lchown.c
+++ b/lib/lchown.c
@@ -30,7 +30,7 @@
 
 /* If the system chown does not follow symlinks, we don't want it
    replaced by gnulib's chown, which does follow symlinks.  */
-# if CHOWN_MODIFIES_SYMLINK
+# if CHOWN_MODIFIES_SYMLINK /* native Windows and some very old platforms */
 #  undef chown
 # endif
 




Reply via email to