changeset 16198:79e42746e843

doc: cover st_ino issues once; add OpenVMS etc. * doc/posix-functions/stat.texi (stat): * doc/posix-functions/lstat.texi (lstat): * doc/posix-functions/fstatat.texi (fstatat): * doc/posix-functions/fstat.texi (fstat): Move general 'struct stat' stuff to sys_stat.texi, leaving behind a pointer. * doc/posix-headers/sys_stat.texi (sys/stat.h): Merge duplicate info about 'struct stat' problems into here. Mention issues with OpenVMS, GNU/Linux NFS, NetApp, ClearCase, and suggest partial workarounds.
author Paul Eggert <eggert@cs.ucla.edu>
date Sat, 31 Dec 2011 13:38:25 -0800
parents 98a6ed2516bf
children 162e917fdda6
files ChangeLog doc/posix-functions/fstat.texi doc/posix-functions/fstatat.texi doc/posix-functions/lstat.texi doc/posix-functions/stat.texi doc/posix-headers/sys_stat.texi
diffstat 6 files changed, 54 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,17 @@
 2011-12-31  Paul Eggert  <eggert@cs.ucla.edu>
 
+	doc: cover st_ino issues once; add OpenVMS etc.
+	* doc/posix-functions/stat.texi (stat):
+	* doc/posix-functions/lstat.texi (lstat):
+	* doc/posix-functions/fstatat.texi (fstatat):
+	* doc/posix-functions/fstat.texi (fstat):
+	Move general 'struct stat' stuff to sys_stat.texi,
+	leaving behind a pointer.
+	* doc/posix-headers/sys_stat.texi (sys/stat.h):
+	Merge duplicate info about 'struct stat' problems into here.
+	Mention issues with OpenVMS, GNU/Linux NFS, NetApp, ClearCase,
+	and suggest partial workarounds.
+
 	same-inode: port to OpenVMS
 	* lib/same-inode.h (SAME_INODE): Port to OpenVMS by checking all
 	three st_ino values.
--- a/doc/posix-functions/fstat.texi
+++ b/doc/posix-functions/fstat.texi
@@ -20,6 +20,8 @@
 Portability problems not fixed by Gnulib:
 @itemize
 @item
+@xref{sys/stat.h}, for general portability problems with @code{struct stat}.
+@item
 On Cygwin, @code{fstat} applied to the file descriptors 0 and 1, returns
 different @code{st_ino} values, even if standard input and standard output
 are not redirected and refer to the same terminal.
--- a/doc/posix-functions/fstatat.texi
+++ b/doc/posix-functions/fstatat.texi
@@ -30,9 +30,5 @@
 Portability problems not fixed by Gnulib:
 @itemize
 @item
-On Windows platforms (excluding Cygwin), @code{st_ino} is always 0.
-@item
-On some file systems, @code{st_size} contains bogus information for
-symlinks; use the gnulib module areadlink-with-size for a better way
-to get symlink contents.
+@xref{sys/stat.h}, for general portability problems with @code{struct stat}.
 @end itemize
--- a/doc/posix-functions/lstat.texi
+++ b/doc/posix-functions/lstat.texi
@@ -28,15 +28,5 @@
 Portability problems not fixed by Gnulib:
 @itemize
 @item
-On Windows platforms (excluding Cygwin), @code{st_ino} is always 0.
-@item
-Because of the definition of @code{struct stat}, it is not possible to
-portably replace @code{stat} via an object-like macro.  Therefore,
-expressions such as @code{(islnk ? lstat : stat) (name, buf)} are not
-portable, and should instead be written @code{islnk ? lstat (name,
-buf) : stat (name, buf)}.
-@item
-On some file systems, @code{st_size} contains bogus information for
-symlinks; use the gnulib module areadlink-with-size for a better way
-to get symlink contents.
+@xref{sys/stat.h}, for general portability problems with @code{struct stat}.
 @end itemize
--- a/doc/posix-functions/stat.texi
+++ b/doc/posix-functions/stat.texi
@@ -25,11 +25,11 @@
 Portability problems not fixed by Gnulib:
 @itemize
 @item
+@xref{sys/stat.h}, for general portability problems with @code{struct stat}.
+@item
 Cygwin's @code{stat} function sometimes sets @code{errno} to @code{EACCES} when
 @code{ENOENT} would be more appropriate.
 @item
-On Windows platforms (excluding Cygwin), @code{st_ino} is always 0.
-@item
 Because of the definition of @code{struct stat}, it is not possible to
 portably replace @code{stat} via an object-like macro.  Therefore,
 expressions such as @code{(islnk ? lstat : stat) (name, buf)} are not
--- a/doc/posix-headers/sys_stat.texi
+++ b/doc/posix-headers/sys_stat.texi
@@ -36,4 +36,40 @@
 @item
 The macro @code{S_IFBLK} is missing on some platforms:
 MSVC 9.
+@item
+On Windows platforms (excluding Cygwin), @code{st_ino} is always 0.
+@item
+On OpenVMS, @code{st_ino} is an array of three @code{ino_t} values,
+not a single value.
+@item
+To partially work around the previous two problems, you can test for
+nonzero @code{st_ino} and use the Gnulib @code{same-inode} module to
+compare nonzero values.  For example, @code{(a.st_ino && SAME_INODE
+(a, b))} is true if the @code{struct stat} values @code{a} and
+@code{b} are known to represent the same file, @code{(a.st_ino &&
+!SAME_INODE (a, b))} is true if they are known to represent different
+files, and @code{!a.st_ino} is true if it is not known whether they
+represent different files.
+@item
+On some platforms, two different files may have the same @code{st_dev}
+and @code{st_ino} values, even when @code{st_ino} is nonzero:
+@itemize
+@item
+GNU/Linux NFS servers that export all local file systems as a single
+NFS file system, if a local @code{st_dev} exceeds 255, or if a local
+@code{st_ino} exceeds 16777215.
+@item
+Network Appliance NFS servers in snapshot directories; see Network
+Appliance bug #195.
+@item
+ClearCase MVFS; see bug id ATRia04618.
 @end itemize
+One partial workaround is to compare other file metadata such as
+@code{st_mode} and @code{st_mtime} to detect this bug, but this
+approach does not work on files whose metadata are being changed by
+other programs.
+@item
+On some file systems, @code{st_size} contains bogus information for
+symlinks; use the Gnulib module @code{areadlink-with-size} for a
+better way to get symlink contents.
+@end itemize