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. -- Rick C. Petty _______________________________________________ freebsd-hackers@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-hackers To unsubscribe, send any mail to "[EMAIL PROTECTED]"