aboutsummaryrefslogtreecommitdiff
path: root/src/files.c
blob: 5805d2270b2954b435b99099a8a4d707d10aa481 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>

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);
  }
}