diff options
| author | Dag-Erling Smørgrav <des@FreeBSD.org> | 2024-04-01 17:28:58 +0000 |
|---|---|---|
| committer | Dag-Erling Smørgrav <des@FreeBSD.org> | 2024-04-01 17:29:31 +0000 |
| commit | dd286b0dc187c351a9537a363840245d5505b15b (patch) | |
| tree | 22fec380d22e31551541ee9b2a6eaaa3f37b2247 /bin/cp | |
| parent | aaa1806f68ef3102a9b888a03360f166b88618c8 (diff) | |
Diffstat (limited to 'bin/cp')
| -rw-r--r-- | bin/cp/cp.c | 27 |
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 |
