diff options
Diffstat (limited to 'src/copy.c')
-rw-r--r-- | src/copy.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/src/copy.c b/src/copy.c new file mode 100644 index 0000000..f63d4f2 --- /dev/null +++ b/src/copy.c @@ -0,0 +1,48 @@ +#define _GNU_SOURCE + +#include <copy.h> +#include <fcntl.h> +#include <filehandler.h> +#include <ftw.h> +#include <string.h> +#include <sys/sendfile.h> +#include <sys/stat.h> +#include <unistd.h> + +#include "../config.h" + +int +copy_recursively(const char *fpath, + const struct stat *sb, + int typeflag, + struct FTW *ftwbuf) +{ + (void) sb; + (void) ftwbuf; + + const char *path = fpath + strlen(DIRECTORY) + 1; + char *output_path = NULL; + asprintf(&output_path, "%s/%s", OUTPUT, path); + + if (typeflag == FTW_D) { + mkdir(output_path, 0700); + return FTW_CONTINUE; + } + + if (typeflag != FTW_F) + return FTW_CONTINUE; + + FILE *in = fopen(fpath, "r"); + size_t size = fsize(in); + fclose(in); + + int in_fd = open(fpath, O_RDONLY); + int out_fd = open(output_path, O_WRONLY | O_CREAT, 0700); + + sendfile(out_fd, in_fd, 0, size); + + close(in_fd); + close(out_fd); + + return FTW_CONTINUE; +} |