diff options
Diffstat (limited to 'src/copy.c')
-rw-r--r-- | src/copy.c | 84 |
1 files changed, 0 insertions, 84 deletions
@@ -84,87 +84,3 @@ int copy2(const char *src, const char *dest, unsigned int op) { } return 0; } - -int copytree(const char *srcdir, const char *destdir, unsigned int op) { - DIR *dir; - struct dirent *d; - struct stat st; - mode_t mode; - mode_t umask_value; - errno = 0; - - dir = opendir(srcdir); - if (!dir) { - return -1; - } - - umask_value = umask(0); - umask(umask_value); - - if (lstat(srcdir, &st) < 0) { - perror(srcdir); - closedir(dir); - return -1; - } - - if (op & CT_PERM) { - mode = st.st_mode; - } else { - mode = 0777 & ~umask_value; - } - - // Source directory is not writable so modify the mode for the destination - if (mode & ~S_IWUSR) { - mode |= S_IWUSR; - } - - if (access(destdir, F_OK) < 0) { - if (mkdirs(destdir, mode) < 0) { - perror(destdir); - closedir(dir); - return -1; - } - } - - memset(&st, 0, sizeof(st)); - while ((d = readdir(dir)) != NULL) { - char src[PATH_MAX] = {0}; - char dest[PATH_MAX] = {0}; - if (strcmp(d->d_name, ".") == 0 || strcmp(d->d_name, "..") == 0) { - continue; - } - strcat(src, srcdir); - strcat(src, "/"); - strcat(src, d->d_name); - - strcat(dest, destdir); - strcat(dest, "/"); - strcat(dest, d->d_name); - - if (lstat(src, &st) < 0) { - perror(srcdir); - closedir(dir); - return -1; - } - - if (d->d_type == DT_DIR) { - if (strncmp(src, dest, strlen(src)) == 0) { - closedir(dir); - return -1; - } - - if (access(dest, F_OK) < 0) { - if (mkdir(dest, mode) < 0) { - perror(dest); - closedir(dir); - return -1; - } - } - - copytree(src, dest, op); - } - copy2(src, dest, op); - } - closedir(dir); - return 0; -} |