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?

Eric


--
------------------------------------------------------------------------
Eric Anderson        Sr. Systems Administrator        Centaur Technology
Anything that works is better than anything that doesn't.
------------------------------------------------------------------------
_______________________________________________
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to