Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 1 Aug 2006 12:11:50 -0500
From:      "Rick C. Petty" <rick-freebsd@kiwi-computer.com>
To:        Peter Jeremy <peterjeremy@optushome.com.au>
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: [PATCH] adding two new options to 'cp'
Message-ID:  <20060801171150.GB3413@megan.kiwi-computer.com>
In-Reply-To: <20060801072611.GA717@turion.vk2pj.dyndns.org>
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>

next in thread | previous in thread | raw e-mail | index | archive | help
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



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