@@ -, +, @@ --- bin/cp/cp.1 | 4 ++-- bin/cp/cp.c | 16 ++++++++++------ 2 files changed, 12 insertions(+), 8 deletions(-) --- b/bin/cp/cp.1 +++ b/bin/cp/cp.1 @@ -84,10 +84,10 @@ If the .Fl R option is specified, all symbolic links are followed. .It Fl P +No symbolic links are followed. If the .Fl R -option is specified, no symbolic links are followed. -This is the default. +option is specified, this is the default. .It Fl R If .Ar source_file --- b/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); --