[hackers] [sbase] cp: Default to -P when -R is specified || Michael Forney

From: <git_AT_suckless.org>
Date: Sat, 28 Dec 2019 19:58:44 +0100 (CET)

commit f4b9b966cf67aecd551dc2daa2398727a76ab1c1
Author: Michael Forney <mforney_AT_mforney.org>
AuthorDate: Sat Dec 21 21:08:36 2019 -0800
Commit: Michael Forney <mforney_AT_mforney.org>
CommitDate: Sat Dec 21 21:26:19 2019 -0800

    cp: Default to -P when -R is specified
    
    POSIX only specifies the -H, -L, and -P options for use with -R, and
    the default is left to the implementation. Without -R, symlinks must
    be followed.
    
    Most implementations use -P as the default with -R, which makes sense
    to me as default behavior (the source and destination trees are the same).
    
    Since we use the same code for -R and without it, and we allow -H, -L,
    and -P without -R, set the default based on the presence of -R. Without
    it, use -L as before, as required by POSIX, and with it, use -P to match
    the behavior of other implementations.

diff --git a/cp.1 b/cp.1
index f74127d..a37caa3 100644
--- a/cp.1
+++ b/cp.1
_AT_@ -48,9 +48,12 @@ Dereference
 if it is a symbolic link.
 .It Fl L
 Dereference all symbolic links.
-This is the default.
+This is the default without
+.Fl R .
 .It Fl P
 Preserve symbolic links.
+This is the default with
+.Fl R .
 .It Fl R
 Traverse directories recursively. If this flag is not specified, directories
 are not copied.
diff --git a/cp.c b/cp.c
index d87e77e..6abe02c 100644
--- a/cp.c
+++ b/cp.c
_AT_@ -45,6 +45,9 @@ main(int argc, char *argv[])
         if (argc < 2)
                 usage();
 
+ if (!cp_follow)
+ cp_follow = cp_rflag ? 'P' : 'L';
+
         if (argc > 2) {
                 if (stat(argv[argc - 1], &st) < 0)
                         eprintf("stat %s:", argv[argc - 1]);
diff --git a/libutil/cp.c b/libutil/cp.c
index b6f8b23..bb85c14 100644
--- a/libutil/cp.c
+++ b/libutil/cp.c
_AT_@ -20,7 +20,7 @@ int cp_pflag = 0;
 int cp_rflag = 0;
 int cp_vflag = 0;
 int cp_status = 0;
-int cp_follow = 'L';
+int cp_follow;
 
 int
 cp(const char *s1, const char *s2, int depth)
Received on Sat Dec 28 2019 - 19:58:44 CET

This archive was generated by hypermail 2.3.0 : Sat Dec 28 2019 - 20:00:23 CET