From d057a68a837d278f5dfe55a5dc3c4998e4f126f5 Mon Sep 17 00:00:00 2001 From: dacctal Date: Thu, 11 Jun 2026 20:07:13 +0000 Subject: cpdir checkpoint --- src/files.c | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) (limited to 'src/files.c') diff --git a/src/files.c b/src/files.c index 86d9be4..5805d22 100644 --- a/src/files.c +++ b/src/files.c @@ -1,7 +1,90 @@ +#include +#include +#include #include +#include const char *get_filename_ext(const char *filename) { const char *dot = strrchr(filename, '.'); if(!dot || dot == filename) return ""; return dot + 1; } + +void cpdir(const char *path, const char *dest) { + DIR *dirp = opendir(path); + struct dirent *dirp_ent; + + struct stat dest_st; + stat(dest, &dest_st); + if (dest_st.st_mode && dest_st.st_mode == S_IFDIR) { + mkdir(dest, dest_st.st_mode); + } + + while ((dirp_ent = readdir(dirp))) { + if (dirp_ent->d_name[0] == '.' && + (strlen(dirp_ent->d_name) == 1 || + (strlen(dirp_ent->d_name) == 2 && + dirp_ent->d_name[1] == '.')) + ) continue; + char rfile_line[1024]; + struct stat st; + char *filename = malloc(sizeof(path)+sizeof(dirp_ent->d_name)+2); + snprintf( + filename, + sizeof(path)+sizeof(dirp_ent->d_name)+2, + "%s/%s", + path, dirp_ent->d_name + ); + printf("FILENAME: %s\n", filename); + stat(filename, &st); + if (st.st_mode) { + char *newfile = malloc(sizeof(dest)+sizeof(dirp_ent->d_name)+2); + snprintf( + newfile, + sizeof(dest)+sizeof(dirp_ent->d_name)+2, + "%s/%s", + dest, dirp_ent->d_name + ); + if (st.st_mode == S_IFDIR) { + printf("DIRECTORY\n"); + printf("NEWDIR: %s\n", newfile); + mkdir(newfile, st.st_mode); + cpdir(filename, newfile); + continue; + } + FILE *rfile = fopen(dirp_ent->d_name, "r"); + FILE *wfile = fopen(newfile, "w+"); + if (!rfile || !wfile) { continue; } + size_t ret = fread( + rfile_line, + //sizeof(*rfile_line), + //sizeof(rfile_line)/sizeof(rfile_line[0]), + 1, + 1024, + rfile + ); + if (ret != sizeof(rfile_line)/sizeof(rfile_line[0]) && ferror(rfile)) { + fprintf(stderr, "file read failed: %zu\n", ret); + continue; + } + size_t write = fwrite( + rfile_line, + //sizeof(rfile_line[0]), + 1, + ret, + wfile + ); + if (write != sizeof(rfile_line)/sizeof(rfile_line[0])) { + fprintf(stderr, "file write failed: %zu\n", ret); + continue; + } + if (feof(rfile)) { + fclose(rfile); + fclose(wfile); + continue; + } + free(newfile); + } + free(filename); + } +} -- cgit v1.2.3