changeset 2741:1d72336294c6

* fileio.c (ro_fsys) [SOLARIS_BROKEN_ACCESS]: Check for the filesystem being ro, since Solaris 2.1 doesn't. (file-writable-p): Call ro_fsys. * s/sol2.h (SOLARIS_BROKEN_ACCESS): Define this.
author Jim Blandy <jimb@redhat.com>
date Tue, 11 May 1993 01:39:42 +0000
parents d7ed0a89ee41
children 7800e6a86421
files src/fileio.c src/s/sol2.h
diffstat 2 files changed, 36 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/fileio.c	Tue May 11 00:07:51 1993 +0000
+++ b/src/fileio.c	Tue May 11 01:39:42 1993 +0000
@@ -2065,6 +2065,30 @@
 #endif /* not S_IFLNK */
 }
 
+#ifdef SOLARIS_BROKEN_ACCESS
+/* In Solaris 2.1, the readonly-ness of the filesystem is not
+   considered by the access system call.  This is Sun's bug, but we
+   still have to make Emacs work.  */
+
+#include <sys/statvfs.h>
+
+static int
+ro_fsys (path)
+    char *path;
+{
+    struct statvfs statvfsb;
+
+    if (statvfs(path, &statvfsb))
+      return 1;  /* error from statvfs, be conservative and say not wrtable */
+    else
+      /* Otherwise, fsys is ro if bit is set.  */
+      return statvfsb.f_flag & ST_RDONLY;
+}
+#else
+/* But on every other os, access has already done the right thing.  */
+#define ro_fsys(path) 0
+#endif
+
 /* Having this before file-symlink-p mysteriously caused it to be forgotten
    on the RT/PC.  */
 DEFUN ("file-writable-p", Ffile_writable_p, Sfile_writable_p, 1, 1, 0,
@@ -2085,13 +2109,16 @@
     return call2 (handler, Qfile_writable_p, abspath);
 
   if (access (XSTRING (abspath)->data, 0) >= 0)
-    return (access (XSTRING (abspath)->data, 2) >= 0) ? Qt : Qnil;
+    return ((access (XSTRING (abspath)->data, 2) >= 0
+	     && ! ro_fsys (XSTRING (abspath)))
+	    ? Qt : Qnil);
   dir = Ffile_name_directory (abspath);
 #ifdef VMS
   if (!NILP (dir))
     dir = Fdirectory_file_name (dir);
 #endif /* VMS */
-  return (access (!NILP (dir) ? (char *) XSTRING (dir)->data : "", 2) >= 0
+  return ((access (!NILP (dir) ? (char *) XSTRING (dir)->data : "", 2) >= 0
+	   && ! ro_fsys ((char *) XSTRING (dir)))
 	  ? Qt : Qnil);
 }
 
--- a/src/s/sol2.h	Tue May 11 00:07:51 1993 +0000
+++ b/src/s/sol2.h	Tue May 11 01:39:42 1993 +0000
@@ -17,3 +17,10 @@
 #else /* GCC */
 #define C_SWITCH_SYSTEM -traditional
 #endif /* GCC */
+
+/* Karl Berry writes:
+If you have the misfortune to be running Solaris 2.1, you may have
+noticed that the access system call does not check the readonlyness of
+the filesystem the path refers to.  This is a bug, according to
+access(2), but in the meantime, some of us need the right behavior.  */
+#define SOLARIS_BROKEN_ACCESS