cks@white.toronto.edu (Chris Siebenmann) (06/27/89)
This hinders attempts to do things like use write permissions to indicate whether a file is currently checked in with a revision control system. Unfortunately, the C code uses access() to determine whether it can write to a file, so I don't have a fix; I've attached my workaround. --- improved-writable.el ;; redefine file-writable-p so it works more "correctly" when you are root ; ; BUGS: See improved-file-writable-p for details. ; ; Last edited: Mon Mar 13 20:32:37 1989 by cks (Chris Siebenmann) on sleepy.white (defun improved-file-writable-p (fn) "Returns t if a file exists and can be written by you, or if the file doesn't exist but the directory can be written by you. Doesn't suffer from the old file-writable-p's defect of always returning t when your UID is 0. BUGS: The criterion for writablity when you are root are somewhat odd; if the file is writable at all, or its parent directory exists, then we return t. This problem exists both because of the author's laziness and a defect in the GNU Emacs system interface (no user-gid function). For extra bonus points, write one that works across NFS." (if (not (eq (user-uid) 0)) (writeable-bogus fn) (let ((attr (file-attributes fn))) (if (not attr) ; not there, check parent directory. (if (file-attributes (file-name-directory fn)) t nil) (let ((modes (nth 8 attr)) (owner (nth 2 attr)) (group (nth 3 attr)) (dir (eq t (car attr)))) (cond (dir t) ; directories always writable ((string-match "w" modes) ; if it's writable to someone, we'll ; take it t) )))))) ; rebind things (tadah!) (defun writeable-bogus (fn) "dummy for stashing file-writable-p." nil) ; this is a magical incantation ; (possible theory : symbol-function generates a new lisp object for us; ; with just fset, we're sharing the old one (which gets nuked with the next ; fset) (fset 'writeable-bogus (symbol-function 'file-writable-p)) ; We only bother doing it when root for effeciency purposes. (if (eq (user-uid) 0) (fset 'file-writable-p 'improved-file-writable-p)) -- "I shall clasp my hands together and bow to the corners of the world." Number Ten Ox, "Bridge of Birds" Chris Siebenmann ...!utgpu!{ncrcan,ontmoh!moore}!ziebmef!cks cks@white.toronto.edu or ...!utgpu!{,csri!}cks