Mercurial > emacs
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