From owner-freebsd-hackers@FreeBSD.ORG Tue Aug 1 18:55:29 2006 Return-Path: X-Original-To: freebsd-hackers@freebsd.org Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 3A3E316A4DE for ; Tue, 1 Aug 2006 18:55:29 +0000 (UTC) (envelope-from prvs=julian=361365f97@elischer.org) Received: from a50.ironport.com (a50.ironport.com [63.251.108.112]) by mx1.FreeBSD.org (Postfix) with ESMTP id BA0BD43D60 for ; Tue, 1 Aug 2006 18:55:24 +0000 (GMT) (envelope-from prvs=julian=361365f97@elischer.org) Received: from unknown (HELO [10.251.18.229]) ([10.251.18.229]) by a50.ironport.com with ESMTP; 01 Aug 2006 11:55:24 -0700 Message-ID: <44CFA39C.70905@elischer.org> Date: Tue, 01 Aug 2006 11:55:24 -0700 From: Julian Elischer User-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.7.13) Gecko/20060414 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Eric Anderson 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> <20060801072611.GA717@turion.vk2pj.dyndns.org> <20060801171150.GB3413@megan.kiwi-computer.com> <44CF8F1A.5090506@centtech.com> In-Reply-To: <44CF8F1A.5090506@centtech.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: freebsd-hackers@freebsd.org, rick-freebsd@kiwi-computer.com Subject: Re: [PATCH] adding two new options to 'cp' X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 01 Aug 2006 18:55:29 -0000 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 > >