[PATCH] adding two new options to 'cp'
Julian Elischer
julian at elischer.org
Tue Aug 1 18:55:29 UTC 2006
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
>
>
More information about the freebsd-hackers
mailing list