[Toybox] [New toy] rudimentary cpio version...
ibid.ag at gmail.com
ibid.ag at gmail.com
Mon Oct 14 18:51:34 PDT 2013
On Mon, Oct 14, 2013 at 11:38:13AM -0500, Rob Landley wrote:
> On 09/30/2013 10:50:13 PM, ibid.ag at gmail.com wrote:
> >I've finally gotten 'cpio' into a shape where it could be useable.
>
> And I've finally gotten through my email to the point you submitted
> this. (I see an update from the web archive, I can check that in as
> a delta against this.)
There should be 3 versions in the archive:
-the first one I sent (this), which was a case of attaching the wrong file
-the second one I sent, which was the right file:
http://lists.landley.net/pipermail/toybox-landley.net/2013-September/001387.html
http://lists.landley.net/pipermail/toybox-landley.net/attachments/20130930/a4c67169/attachment.c
-the last update, which fixes an issue with symlinks and special files
that we can stat but not read (thereby losing a couple lines of code):
http://lists.landley.net/pipermail/toybox-landley.net/2013-October/001408.html
http://lists.landley.net/pipermail/toybox-landley.net/attachments/20131012/768acc12/attachment.c
>
> >This version can archive and extract directories, sockets, FIFOs,
> >devices,
> >symlinks, and regular files.
> >Supported options are -iot, -H FMT (which is a dummy right now).
>
> I want to tweak the help text but will hold off until I catch up to
> the newer message about this...
>
> >It only writes newc, and could read newc or newcrc.
>
> What's "newcrc"?
newcrc was supposed to be newc + crc (ie, the c_check field contains a
checksum instead of "00000000").
But they messed up and filled it with a count of nonzero bits, which is
pretty weak.
>
> >This does NOT implement -d, which essentially is equivalent to
> >mkdir -p $(dirname $FILE)
> >for every file that needs it.
>
> Let's see, the examples I gave in ramfs-rootfs-initramfs.txt are:
>
> cpio -i -d -H newc -F initramfs_data.cpio --no-absolute-filenames
>
> find . | cpio -o -H newc | gzip
>
> It would be nice to get that example working, although...
> --no-absolute-filenames? really? There's no short for that? (I
> expect just NEVER doing absolute filenames is the right thing, and
> if you _want_ that you cd to the root directory yourself and extract
> it from there...)
The quick way to do that is to increment name until name[0] != '/'.
> >Hard links are not supported, though it would be easy to add them
> >given
> >a hash table or something like that.
>
> I've been thinking of doing that for tar and cp and such, and
> somebody submitted code that was doing something like that
> already... (Sigh, pending is getting overwhelming, I don't remember
> where.)
That was tcpsvd.
> My first guess at this is to do a simple linked list (scales well to
> a couple thousand entries) and then upgrade it to a balanced binary
> tree of some kind later. (Hash tables tend to need manual tuning for
> good performance, hash function and number of buckets and so on.)
>
> But for right now we can leave it as a todo item.
>
> >I also have not implemented the "<n> blocks" output on stderr.
> >If desired, I can add it pretty simply.
>
> Sigh. Is there any sort of spec on this? SUSv4 utilities doesn't
> list cpio or tar, and
> http://pubs.opengroup.org/onlinepubs/9699919799/utilities/pax.html
> is a "Jorg Schilling is on the posix committee" level Solaris
> disaster.
>
> I'd guess it's desirable, though. (This might be a place where
> looking at the busybox --help output is justified to see what subset
> they chose. :)
OK, it's in LSB.
LSB 4.1 says "See SUSv2"
http://pubs.opengroup.org/onlinepubs/7908799/xcu/cpio.html
Which lists:
cpio -o[aBcv]
cpio -i[Bcdmrtuvf] [pattern ...]
cpio -p[adlmuv] directory
cpio -p is a fancy way of doing cp -R, so let's ignore it.
That leaves aBcdmrtuvf
of those, -a changes atime (why?), -c is a nop or means adding
old binary/old character format.
-B is blocksize (we'd ignore it), so rf are the meaningful ones beyond
what busybox has.
Busybox has the "<n> blocks" and also implements -dmvuF.
-F is
if (TT.fname) {
close(toys.optflags & (FLAG_i|FLAG_t) ? 0 : 1);
xopen(TT.fname, TT.optflags & FLAG_o ? O_CREAT|O_WRONLY|O_TRUNC :
O_RDONLY);
}
-d needs the logic from mkdir -p
-m would be close to touch -m in logic
-v is pretty simple.
-u is the current behavior; I'd need to check before creating if it
isn't set...
> >There is one assumption this makes: that the mode of a file, as
> >mode_t,
> >is bitwise equivalent to the mode as defined for the cpio format.
> >This is true of Linux, but is not mandated by POSIX.
>
> Posix does actually mandate an octal representation for mode bits,
> as a table in the chmod command line description:
>
> http://pubs.opengroup.org/onlinepubs/9699919799/utilities/chmod.html
>
> It doesn't say the OS has to use those _internally_, but everybody
> does because unix version 7 circa 1975 did.
> Merged it in pending here, trying to catch up on email...
Thanks,
Isaac Dunham
1381801894.0
More information about the Toybox
mailing list