Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 01 Aug 2006 11:55:24 -0700
From:      Julian Elischer <julian@elischer.org>
To:        Eric Anderson <anderson@centtech.com>
Cc:        freebsd-hackers@freebsd.org, rick-freebsd@kiwi-computer.com
Subject:   Re: [PATCH] adding two new options to 'cp'
Message-ID:  <44CFA39C.70905@elischer.org>
In-Reply-To: <44CF8F1A.5090506@centtech.com>
References:  <200607271150.k6RBoM9p031745@lurza.secnetix.de>	<44C8FB65.9020102@FreeBSD.org>	<44CE03D2.2050803@centtech.com>	<17614.4005.407223.621637@bhuda.mired.org>	<44CE199C.2020500@centtech.com>	<17614.8289.134373.387558@bhuda.mired.org>	<96b30c400607310847s1d2f845eo212b234d03f51e9a@mail.gmail.com>	<17614.10982.499561.139268@bhuda.mired.org>	<ealpn1$lan$1@sea.gmane.org>	<20060801072611.GA717@turion.vk2pj.dyndns.org>	<20060801171150.GB3413@megan.kiwi-computer.com> <44CF8F1A.5090506@centtech.com>

next in thread | previous in thread | raw e-mail | index | archive | help
Eric Anderson wrote:

> On 08/01/06 12:11, Rick C. Petty wrote:
>
>> On Tue, Aug 01, 2006 at 05:26:11PM +1000, Peter Jeremy wrote:
>>
>>> On Mon, 2006-Jul-31 22:42:49 +0200, Ivan Voras wrote:
>>>
>>>> I agree with this, and while you're in there, can you add -s to 
>>>> copy sparse files (via the usual "if the buffer is all nulls, seek 
>>>> beyond eof instead of writing" trick)?
>>>
>>> Note that it isn's possible to accurately distinguish between a block
>>> of NULs and a hole in the file through the filesystem.  The only way
>>> to accurately copy a sparse file is with dump/restore.
>>
>>
>> Sure it is-- in a number of ways.  The most useful way is to do 
>> something
>> of the sort:
>>
>>   int sd, dd;    // assume these are set to source & dest descriptors
>>   unsigned char* zeros;
>>   unsigned char* buffer;
>>   struct stat st;
>>   size_t bytes, offset;
>>
>>   fstat(sd, &st);
>>   zeros = malloc(st.st_blksize);
>>   bzero(zeros, st.st_blksize);
>>
>>   for (offset = 0; offset < st.st_size; offset += bytes)
>>   {
>>     bytes = st.st_blksize;
>>     if (offset + bytes > st.st_size)
>>       bytes = st.st_size - offset;
>>     read(sd, buffer, bytes);
>>     if (0 == memcmp(buffer, zeros, bytes))
>>       lseek(dd, bytes, SEEK_CUR);
>>     else
>>       write(sd, buffer, bytes);
>>   }
>>
>> Obviously, I didn't add the error checking/handling, but AFAIK this is
>> essentially what the -S option to gnu's tar does.  In this example, you
>> may not mimic the allocated blocks of a sparse file, but you would
>> optimize the copy to use as few filesystem blocks as possible.
>
>
> Wouldn't this be incorrect for files that are really full of zeros?  
> It would turn them in to sparse files when they shouldn't be, 
> correct?  Is that what happens with other tools?


If you use the sparse option then that is what you are asking it to do.


>
> Eric
>
>



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?44CFA39C.70905>