aboutsummaryrefslogtreecommitdiff
path: root/src/copy.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/copy.c')
-rw-r--r--src/copy.c84
1 files changed, 0 insertions, 84 deletions
diff --git a/src/copy.c b/src/copy.c
index 7a397e6..f69a756 100644
--- a/src/copy.c
+++ b/src/copy.c
@@ -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;
-}