Can I suggest, that while this topic is interesting, and should be 
pursued, the question of how to implement in-place editing is not 
relevant to *this* case, since it doesn't propose to offer it at this 
time.  Note that this case does not replace /usr/gnu/bin/sed.

(The idea to do so at a future time, in a future case, is probably still 
a good one.  But needn't be done thought about right now.)

     - Garrett

On 03/12/10 01:39 PM, Nicolas Williams wrote:
> On Fri, Mar 12, 2010 at 07:56:00PM +0000, Ceri Davies wrote:
>    
>> On Fri, Mar 12, 2010 at 08:46:01AM -0600, Mike Gerdts wrote:
>>      
>>>                    [...]  A better approach would be the equivalent of:
>>>
>>> 1. ln $file $file.$suffix
>>> 2. newfile=$(mktemp $(dirname $file)/$(basename $file).XXXXXX
>>> 3. chown $user:$group $newfile
>>> 4. chmod $perms $newfile ; # plus more magic to do extended attributes
>>> 5. sed $sedprog $file>  $newfile
>>> 6. rename $newfile $file
>>>        
>> It doesn't really qualify as inplace though, does it?  Note also that -i
>> can optionally leave a backup behind if given a suffix which would
>> remove most concerns over trampling files.
>>      
> If "truly in-place" is not safe, then I don't think we should not have
> "truly in-place".  Now, is the GNU sed's -i described as "truly
> in-place" or is its description able to cover Mike's algorithm?  Here's
> what the GNU sed manpage says:
>
>       --follow-symlinks
>            follow symlinks when processing in place
>       -i[SUFFIX], --in-place[=SUFFIX]
>            edit files in place (makes  backup  if  extension  sup-
>         plied)
>
> Nothing else is said as to what editing a file "in place" means.  I
> think that leaves room for an implementor to take Mike's position.
>
>    
>> Note that FreeBSD's sed supports -i (and -I) using an algorithm which
>> can potentially fail in the situations that you mention; the manpage
>> just calls it out with the following text:
>>
>>     It is not recommended to give a zero-length extension when
>>     in-place editing files, as you risk corruption or partial content in
>>     situations where disk space is exhausted, etc.
>>      
> That is indicative of "truly in-place" editing, but note that the
> cautionary note applies to _any_ kind of in-place edit if the filesystem
> is COW-based (like ZFS).  Some non-extending edits might not complete if
> you run out of space and the filesystem is a ZFS dataset, thus leaving
> you with corrupted file data.
>
> In other words, I don't think there's any kind of stream edit for which
> "in-place" can be safe (see below).  I favor Mike's algorithm.
>
> Perhaps we could have a "file contents replace" operation, like
> rename(2) but which changes the contents observed through open file
> descriptors (and mmap()s) referring to the original...  Then you could
> get something like in-place edits with safety, plus atomicity as a
> bonus.  But that'd be a whole 'nother case/project.
>
> Nico
>    

Reply via email to