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.
This commit is contained in:
parent
61f5d4887a
commit
f4b9b966cf
5
cp.1
5
cp.1
|
@ -48,9 +48,12 @@ Dereference
|
||||||
if it is a symbolic link.
|
if it is a symbolic link.
|
||||||
.It Fl L
|
.It Fl L
|
||||||
Dereference all symbolic links.
|
Dereference all symbolic links.
|
||||||
This is the default.
|
This is the default without
|
||||||
|
.Fl R .
|
||||||
.It Fl P
|
.It Fl P
|
||||||
Preserve symbolic links.
|
Preserve symbolic links.
|
||||||
|
This is the default with
|
||||||
|
.Fl R .
|
||||||
.It Fl R
|
.It Fl R
|
||||||
Traverse directories recursively. If this flag is not specified, directories
|
Traverse directories recursively. If this flag is not specified, directories
|
||||||
are not copied.
|
are not copied.
|
||||||
|
|
3
cp.c
3
cp.c
|
@ -45,6 +45,9 @@ main(int argc, char *argv[])
|
||||||
if (argc < 2)
|
if (argc < 2)
|
||||||
usage();
|
usage();
|
||||||
|
|
||||||
|
if (!cp_follow)
|
||||||
|
cp_follow = cp_rflag ? 'P' : 'L';
|
||||||
|
|
||||||
if (argc > 2) {
|
if (argc > 2) {
|
||||||
if (stat(argv[argc - 1], &st) < 0)
|
if (stat(argv[argc - 1], &st) < 0)
|
||||||
eprintf("stat %s:", argv[argc - 1]);
|
eprintf("stat %s:", argv[argc - 1]);
|
||||||
|
|
|
@ -20,7 +20,7 @@ int cp_pflag = 0;
|
||||||
int cp_rflag = 0;
|
int cp_rflag = 0;
|
||||||
int cp_vflag = 0;
|
int cp_vflag = 0;
|
||||||
int cp_status = 0;
|
int cp_status = 0;
|
||||||
int cp_follow = 'L';
|
int cp_follow;
|
||||||
|
|
||||||
int
|
int
|
||||||
cp(const char *s1, const char *s2, int depth)
|
cp(const char *s1, const char *s2, int depth)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user