[Toybox] feature request: toybox cp --parents

Rob Landley rob at landley.net
Thu Jul 27 23:58:54 PDT 2017


Sorry, buried in $DAYJOB stuff again for a bit. Where was I?

> Rob Landley <rob at landley.net> hat geschrieben:
> Right, lemme take a stab at doing this right. -D should act like -r in
> terms of "what we're copying" (the blog entry I linked to above gave me
> the impression it already _was_ just from what uses they considered
> obvious). If we're mkdir-ing the destination then we should do so for
> the top level one too just for conceptual consistency.
Another fun corner case, related to the rm -f chmod thing, does this
mkdir -p copy the permissions and ownership of the parent directories it
creates? (In which case I can't just use the lib function but have to
recurse...)

  $ mkdir -p sub/two
  $ chmod 700 sub/two
  $ touch sub/two/three
  $ mkdir banana
  $ cp --parents sub/two/three banana
  $ ls -l banana/sub
  total 4
  drwx------ 2 landley landley 4096 Jul 28 01:42 two

So yeah, that.

The cp plumbing itself isn't set up to do this (we don't recurse down
through starting directories in our source arguments) so I need to mkdir
-p permissions 700 so there's no exploitable race exposing stuff to
other users with wrong permissions, then have a loop that will stat()
each directory element so we can apply permissions (and chown if we're
root)

And then there's the fun that is --preserve, now with xattrs. I... need
to factor out the "copy credentials from here to here" logic into a
function, don't I? And what do I do if the directory gets deleted
mid-traversal? (Somebody can rm -rf while I cp.)

If the path already exists with different credential do I chmod it?

  $ chmod 700 banana/sub
  $ cp --parents sub/two/three banana
  $ ls -l banana
  total 4
  drwx------ 3 landley landley 4096 Jul 28 01:42 sub
  $ ls -ld sub
  drwxrwxr-x 3 landley landley 4096 Jul 28 01:41 sub

Answer: nope. Leave it alone unless you're creating it. (I ran the cp
again with --preserve=all just to be sure, and the result was the same.)

Grrr. This is fiddly and unpleasant to implement and it would be SO nice
if there was a spec. Are we _creating_ parent directories, or are we
_copying_ parent directories? The man page says:

       --parents
              use full source file name under DIRECTORY

I.E. it doesn't say!

Alexandar: as the guy who asked for this feature, do you care if I do
the simple thing or the "copy corner cases of implementation the man
page doesn't document" thing?

Rob


More information about the Toybox mailing list