This commit is contained in:
Your Name 2024-06-24 11:24:23 +03:00
parent c1b916a4b6
commit 32f0b3ae40
1 changed files with 11 additions and 23 deletions

View File

@ -84,12 +84,12 @@ char copy(struct stat st, const char *src, const char *dst) {
}
int cptree(const char *src, const char *dst) {
struct stat stat_path;
if (mu_get_stats(f_flag, L_flag, src, &stat_path))
struct stat src_stat;
if (mu_get_stats(f_flag, !L_flag, src, &src_stat))
return 1;
if (!S_ISDIR(stat_path.st_mode)) {
if (copy(stat_path, src, dst)) {
if (!S_ISDIR(src_stat.st_mode)) {
if (copy(src_stat, src, dst)) {
if (f_flag)
fprintf(stderr, "cp: %s: %s\n", dst, strerror(errno));
@ -100,7 +100,9 @@ int cptree(const char *src, const char *dst) {
}
else if (!r_flag) {
fprintf(stderr, "cp: omitting directory: %s\n", dst);
if (f_flag)
fprintf(stderr, "cp: omitting directory: %s\n", dst);
return 1;
}
@ -113,7 +115,9 @@ int cptree(const char *src, const char *dst) {
DIR *dir = opendir(src);
if (dir == NULL) {
fprintf(stderr, "cp: %s: Can`t open directory\n", src);
if (f_flag)
fprintf(stderr, "cp: %s: Can`t open directory\n", src);
return 1;
}
@ -121,25 +125,9 @@ int cptree(const char *src, const char *dst) {
struct dirent *ep;
while ((ep = readdir(dir)) != NULL) {
if (!strcmp(ep->d_name, ".") || !strcmp(ep->d_name, ".."))
if (!strcmp(ep->d_name, ".") || !strcmp(ep->d_name, "..") || !strcmp(dst, ep->d_name))
continue;
/* Check for recursion */
char *dup = strdup(dst);
if (dup != NULL) {
char *bname = basename(dup);
if (bname != NULL) {
if (!strcmp(bname, ep->d_name)) {
fprintf(stderr, "cp: recursion detected, omitting directory '%s'\n", dst);
free(dup);
continue;
}
}
free(dup);
}
/* Copy */
char *src_path = mu_make_path(f_flag, src, ep->d_name);
if (src_path == NULL)