diff options
author | Joseph Hunkeler <jhunkeler@gmail.com> | 2024-10-14 09:32:03 -0400 |
---|---|---|
committer | Joseph Hunkeler <jhunkeler@gmail.com> | 2024-10-14 09:43:31 -0400 |
commit | 5a9688e9e78a25a42bddfc4388fb4ce3311ded74 (patch) | |
tree | bcc1b54c3f8a7f1eab0d6b3e129f098721a41537 /src/copy.c | |
parent | b98088f7b7cfe4b08eb39fa1b6b86210cb6c08b8 (diff) | |
download | stasis-5a9688e9e78a25a42bddfc4388fb4ce3311ded74.tar.gz |
Refactor directory structure
* Move core library sources into src/lib/core
* Move command-line programs into src/cli
Diffstat (limited to 'src/copy.c')
-rw-r--r-- | src/copy.c | 86 |
1 files changed, 0 insertions, 86 deletions
diff --git a/src/copy.c b/src/copy.c deleted file mode 100644 index f69a756..0000000 --- a/src/copy.c +++ /dev/null @@ -1,86 +0,0 @@ -#include "copy.h" - -int copy2(const char *src, const char *dest, unsigned int op) { - size_t bytes_read; - size_t bytes_written; - char buf[STASIS_BUFSIZ]; - struct stat src_stat, dnamest; - FILE *fp1, *fp2; - - if (lstat(src, &src_stat) < 0) { - perror(src); - return -1; - } - - if (access(dest, F_OK) == 0) { - unlink(dest); - } - - char dname[1024] = {0}; - strcpy(dname, dest); - char *dname_endptr; - - dname_endptr = strrchr(dname, '/'); - if (dname_endptr != NULL) { - *dname_endptr = '\0'; - } - - stat(dname, &dnamest); - if (S_ISLNK(src_stat.st_mode)) { - char lpath[1024] = {0}; - if (readlink(src, lpath, sizeof(lpath)) < 0) { - perror(src); - return -1; - } - if (symlink(lpath, dest) < 0) { - // silent - return -1; - } - } else if (S_ISREG(src_stat.st_mode) && src_stat.st_nlink > 2 && src_stat.st_dev == dnamest.st_dev) { - if (link(src, dest) < 0) { - perror(src); - return -1; - } - } else if (S_ISFIFO(src_stat.st_mode) || S_ISBLK(src_stat.st_mode) || S_ISCHR(src_stat.st_mode) || S_ISSOCK(src_stat.st_mode)) { - if (mknod(dest, src_stat.st_mode, src_stat.st_rdev) < 0) { - perror(src); - return -1; - } - } else if (S_ISREG(src_stat.st_mode)) { - fp1 = fopen(src, "rb"); - if (!fp1) { - perror(src); - return -1; - } - - fp2 = fopen(dest, "w+b"); - if (!fp2) { - perror(dest); - return -1; - } - - bytes_written = 0; - while ((bytes_read = fread(buf, sizeof(char), sizeof(buf), fp1)) != 0) { - bytes_written += fwrite(buf, sizeof(char), bytes_read, fp2); - } - fclose(fp1); - fclose(fp2); - - if (bytes_written != (size_t) src_stat.st_size) { - fprintf(stderr, "%s: SHORT WRITE (expected %zu bytes, but wrote %zu bytes)\n", dest, src_stat.st_size, bytes_written); - return -1; - } - - if (op & CT_OWNER && chown(dest, src_stat.st_uid, src_stat.st_gid) < 0) { - perror(dest); - } - - if (op & CT_PERM && chmod(dest, src_stat.st_mode) < 0) { - perror(dest); - } - } else { - errno = EOPNOTSUPP; - return -1; - } - return 0; -} |