aboutsummaryrefslogtreecommitdiff
path: root/bin/cp
diff options
context:
space:
mode:
authorDag-Erling Smørgrav <des@FreeBSD.org>2024-04-01 17:28:58 +0000
committerDag-Erling Smørgrav <des@FreeBSD.org>2024-04-01 17:29:31 +0000
commitdd286b0dc187c351a9537a363840245d5505b15b (patch)
tree22fec380d22e31551541ee9b2a6eaaa3f37b2247 /bin/cp
parentaaa1806f68ef3102a9b888a03360f166b88618c8 (diff)
Diffstat (limited to 'bin/cp')
-rw-r--r--bin/cp/cp.c27
1 files changed, 18 insertions, 9 deletions
diff --git a/bin/cp/cp.c b/bin/cp/cp.c
index 14d1cc2a3f75..02b879006a4f 100644
--- a/bin/cp/cp.c
+++ b/bin/cp/cp.c
@@ -506,9 +506,13 @@ copy(char *argv[], enum op type, int fts_options, struct stat *root_stat)
* umask blocks owner writes, we fail.
*/
if (dne) {
- if (mkdir(to.p_path,
- curr->fts_statp->st_mode | S_IRWXU) < 0)
- err(1, "%s", to.p_path);
+ mode = curr->fts_statp->st_mode | S_IRWXU;
+ if (mkdir(to.p_path, mode) != 0) {
+ warn("%s", to.p_path);
+ (void)fts_set(ftsp, curr, FTS_SKIP);
+ badcp = rval = 1;
+ break;
+ }
/*
* First DNE with a NULL root_stat is the root
* path, so set root_stat. We can't really
@@ -517,14 +521,19 @@ copy(char *argv[], enum op type, int fts_options, struct stat *root_stat)
* first directory we created and use that.
*/
if (root_stat == NULL &&
- stat(to.p_path, &created_root_stat) == -1) {
- err(1, "stat");
- } else if (root_stat == NULL) {
- root_stat = &created_root_stat;
+ stat(to.p_path, &created_root_stat) != 0) {
+ warn("%s", to.p_path);
+ (void)fts_set(ftsp, curr, FTS_SKIP);
+ badcp = rval = 1;
+ break;
}
+ if (root_stat == NULL)
+ root_stat = &created_root_stat;
} else if (!S_ISDIR(to_stat.st_mode)) {
- errno = ENOTDIR;
- err(1, "%s", to.p_path);
+ warnc(ENOTDIR, "%s", to.p_path);
+ (void)fts_set(ftsp, curr, FTS_SKIP);
+ badcp = rval = 1;
+ break;
}
/*
* Arrange to correct directory attributes later