]> git.cameronkatri.com Git - freebsd-patches.git/commitdiff
Add cp(1): Make -P work without -R as per POSIX
authorCameron Katri <me@cameronkatri.com>
Mon, 20 Sep 2021 00:15:54 +0000 (20:15 -0400)
committerCameron Katri <me@cameronkatri.com>
Mon, 20 Sep 2021 00:15:54 +0000 (20:15 -0400)
cp-1-Make-P-work-without-R-as-per-POSIX.patch [new file with mode: 0644]

diff --git a/cp-1-Make-P-work-without-R-as-per-POSIX.patch b/cp-1-Make-P-work-without-R-as-per-POSIX.patch
new file mode 100644 (file)
index 0000000..59a48b9
--- /dev/null
@@ -0,0 +1,103 @@
+From a8829b10000d33dd08471af6f3f1e2b55f4df6f6 Mon Sep 17 00:00:00 2001
+From: Cameron Katri <me@cameronkatri.com>
+Date: Sun, 19 Sep 2021 20:11:20 -0400
+Subject: [PATCH] cp(1): Make -P work without -R as per POSIX
+
+According to POSIX, cp should allow the -P flag to work whether -R is specified or not. Currently, the -P option only works along with -R.
+
+PR: 199466
+---
+ bin/cp/cp.1 |  8 ++++----
+ bin/cp/cp.c | 16 ++++++++++------
+ 2 files changed, 14 insertions(+), 10 deletions(-)
+
+diff --git a/bin/cp/cp.1 b/bin/cp/cp.1
+index f7e2d639def..c9e62553bc5 100644
+--- a/bin/cp/cp.1
++++ b/bin/cp/cp.1
+@@ -32,7 +32,7 @@
+ .\"   @(#)cp.1        8.3 (Berkeley) 4/18/94
+ .\" $FreeBSD$
+ .\"
+-.Dd June 6, 2015
++.Dd August 24, 2021
+ .Dt CP 1
+ .Os
+ .Sh NAME
+@@ -84,10 +84,10 @@ If the
+ .Fl R
+ option is specified, all symbolic links are followed.
+ .It Fl P
+-If the
++No symbolic links are followed.
++This is the default if the
+ .Fl R
+-option is specified, no symbolic links are followed.
+-This is the default.
++option is specified.
+ .It Fl R
+ If
+ .Ar source_file
+diff --git a/bin/cp/cp.c b/bin/cp/cp.c
+index 3a23394df35..d1612003542 100644
+--- a/bin/cp/cp.c
++++ b/bin/cp/cp.c
+@@ -99,7 +99,7 @@ main(int argc, char *argv[])
+ {
+       struct stat to_stat, tmp_stat;
+       enum op type;
+-      int Hflag, Lflag, ch, fts_options, r, have_trailing_slash;
++      int Hflag, Lflag, Pflag, ch, fts_options, r, have_trailing_slash;
+       char *target;
+       fts_options = FTS_NOCHDIR | FTS_PHYSICAL;
+@@ -108,13 +108,14 @@ main(int argc, char *argv[])
+               switch (ch) {
+               case 'H':
+                       Hflag = 1;
+-                      Lflag = 0;
++                      Lflag = Pflag = 0;
+                       break;
+               case 'L':
+                       Lflag = 1;
+-                      Hflag = 0;
++                      Hflag = Pflag = 0;
+                       break;
+               case 'P':
++                      Pflag = 1;
+                       Hflag = Lflag = 0;
+                       break;
+               case 'R':
+@@ -123,6 +124,7 @@ main(int argc, char *argv[])
+               case 'a':
+                       pflag = 1;
+                       Rflag = 1;
++                      Pflag = 1;
+                       Hflag = Lflag = 0;
+                       break;
+               case 'f':
+@@ -145,7 +147,7 @@ main(int argc, char *argv[])
+                       break;
+               case 'r':
+                       rflag = Lflag = 1;
+-                      Hflag = 0;
++                      Hflag = Pflag = 0;
+                       break;
+               case 's':
+                       sflag = 1;
+@@ -180,8 +182,10 @@ main(int argc, char *argv[])
+                       fts_options |= FTS_LOGICAL;
+               }
+       } else {
+-              fts_options &= ~FTS_PHYSICAL;
+-              fts_options |= FTS_LOGICAL | FTS_COMFOLLOW;
++              if (!Pflag) {
++                      fts_options &= ~FTS_PHYSICAL;
++                      fts_options |= FTS_LOGICAL | FTS_COMFOLLOW;
++              }
+       }
+       (void)signal(SIGINFO, siginfo);
+-- 
+2.32.0
+