[Toybox] cp updated.

Rob Landley rob at landley.net
Wed Jan 9 19:03:00 PST 2013


I checked in the long-pending update to cp, which turned into a  
largeish rewrite. (Actually several iterative rewrites to figure out  
how _not_ to have it be a giant forest of gotos but still be reasonably  
efficient.)

It's now using the current dirtree stuff, and using openat() and  
friends instead of generating a long path, and it's handling  
block/char/sock/fifo entries correctly. Plus I managed to strip it down  
to just one main() function and one dirtree callback function.

It's doing -l (copy as hardlinks) but I haven't implemented -s (copy as  
symlinks) yet. I also have -HLP left to do. (I note that -Lr is pilot  
error: it detects source and destination being the same, both in the  
current file and the "we've recursed down to the top level directory  
again ala "cp -R .. .", but you can still make follow-symlink loops it  
won't catch.) Also, I need to test cp -r with both files and  
directories of mode 000. I know what I'm currently doing won't work on  
NFS (ask me if I care), but what other corner cases am I missing.  
(Really I can just create everything mode 600 and then fix it in the -p  
logic, I just don't like doing two metadata syscalls when I don't have  
to. There's always a potential race condition between create and adjust  
on a live filesystem and I'm never quite sure I've caught 'em all...)

Next up along this axis is "mv", which is a bit funky in that mv across  
devices is a combined cp and rm. I'll probably fold mv into cp because  
of this (but not rm because posix's fiddly behavior requirements for  
that are horrible).

Rob

P.S. I just noticed Busybox has a "preserve hardlink" thing I'm not  
doing yet either. (Spotted it when yanking more entries from  
Aboriginal's baseconfig-busybox.) I'd planned to tackle that for  
tar/zip/cpio and such, and can make it generic then.
 1357786980.0


More information about the Toybox mailing list