# HG changeset patch # User Jim Blandy # Date 737084382 0 # Node ID 1d72336294c6dbce9598f3b9e5110ab7f0e1472f # Parent d7ed0a89ee4119d8fbf16a83529ac3b79a5e325c * 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. diff -r d7ed0a89ee41 -r 1d72336294c6 src/fileio.c --- 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 + +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); } diff -r d7ed0a89ee41 -r 1d72336294c6 src/s/sol2.h --- 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