From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Jim Meyering Newsgroups: gmane.emacs.devel Subject: Re: save-buffer: avoid data loss on interrupt Date: Tue, 13 Dec 2011 21:52:49 +0100 Message-ID: <87d3bsqjmm.fsf@rho.meyering.net> References: <87zkf282ht.fsf@rho.meyering.net> <87pqfsqtsj.fsf@rho.meyering.net> <4EE7AF8B.2090303@cs.ucla.edu> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: dough.gmane.org 1323809582 20144 80.91.229.12 (13 Dec 2011 20:53:02 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Tue, 13 Dec 2011 20:53:02 +0000 (UTC) Cc: Emacs development discussions To: Paul Eggert Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Tue Dec 13 21:52:58 2011 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([140.186.70.17]) by lo.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1RaZLM-0007jl-Vo for ged-emacs-devel@m.gmane.org; Tue, 13 Dec 2011 21:52:57 +0100 Original-Received: from localhost ([::1]:49556 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RaZLL-0003Bj-Sf for ged-emacs-devel@m.gmane.org; Tue, 13 Dec 2011 15:52:55 -0500 Original-Received: from eggs.gnu.org ([140.186.70.92]:33352) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RaZLI-0003BT-Jt for emacs-devel@gnu.org; Tue, 13 Dec 2011 15:52:53 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RaZLH-0002Ry-Bz for emacs-devel@gnu.org; Tue, 13 Dec 2011 15:52:52 -0500 Original-Received: from mx.meyering.net ([88.168.87.75]:57318) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RaZLH-0002Rq-2k for emacs-devel@gnu.org; Tue, 13 Dec 2011 15:52:51 -0500 Original-Received: from rho.meyering.net (localhost.localdomain [127.0.0.1]) by rho.meyering.net (Acme Bit-Twister) with ESMTP id EB8E26007E; Tue, 13 Dec 2011 21:52:49 +0100 (CET) In-Reply-To: <4EE7AF8B.2090303@cs.ucla.edu> (Paul Eggert's message of "Tue, 13 Dec 2011 12:03:23 -0800") Original-Lines: 65 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 88.168.87.75 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:146696 Archived-At: Paul Eggert wrote: > On 12/13/11 09:13, Jim Meyering wrote: > >> - (if (or (and file-precious-flag dir-writable) >> + (if (or (and dir-writable >> + (or file-precious-flag >> + (= (file-nlinks buffer-file-name) 1))) > > I like the general idea, but this solution seems a bit aggressive, > as it will cause the file's ownership to change > if the file's link count is 1, and often that isn't what is wanted. > Instead, how about extending the semantics of break-hardlink-on-save, > with something like the following (untested) patch? > > --- lisp/files.el 2011-12-04 08:02:42 +0000 > +++ lisp/files.el 2011-12-13 19:46:33 +0000 > @@ -4469,8 +4469,11 @@ Before and after saving the buffer, this > (dir-writable (file-writable-p dir))) > (if (or (and file-precious-flag dir-writable) > (and break-hardlink-on-save > - (file-exists-p buffer-file-name) > - (> (file-nlinks buffer-file-name) 1) > + (let ((nlinks (file-nlinks buffer-file-name))) > + (and nlinks > + (> nlinks (if (numberp break-hardlink-on-save) > + break-hardlink-on-save > + 1)))) > (or dir-writable > (error (concat (format > "Directory %s write-protected; " dir) > > That way, you can set break-hardlink-on-save to -1 to get > the behavior that you want. > > While we're on the subject, break-hardlink-on-save is not > documented; I wonder why not? Also, the current code > does not work if the directory is sticky and writable > and the file is owned by someone else (a common situation > in /tmp); this should get fixed too. That'd be ok, but doesn't this deserve to be enabled more often than when someone tweaks the break-hardlink-on-save variable? How about this instead, assuming a file-owner-uid function? (or if the two users of file-attributes is an issue, we could combine file-nlinks and file-owner-uid into a function that calls file-attributes just once) Sure, this might still change the group, but if that's an issue we could compare it to the default group. diff --git a/lisp/files.el b/lisp/files.el index 535715c..b0f01f2 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -4469,7 +4469,8 @@ Before and after saving the buffer, this function runs (dir-writable (file-writable-p dir))) (if (or (and dir-writable (or file-precious-flag - (= (file-nlinks buffer-file-name) 1))) + (and (= (file-nlinks buffer-file-name) 1) + (= (file-owner-uid buffer-file-name) (user-uid))))) (and break-hardlink-on-save (file-exists-p buffer-file-name) (> (file-nlinks buffer-file-name) 1)