*/
#include <dirent.h>
+#include <fts.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
+#include <plog.h>
#include <pio.h>
-
/* Directory separator is \ when cross-compiling for MS Windows
systems */
#if defined(__MINGW32__)
FILE *fsrc, *fdst;
int ret = 0;
+ log_fct("copy %s to %s", src, dst);
+
fsrc = fopen(src, "r");
if (fsrc) {
void mkdirs(const char *dirs, mode_t mode)
{
- char *c = (char *)dirs;
- char *dir = malloc(strlen(dirs) + 1);
+ char *c, *dir;
+ int i;
+
+ log_fct("mkdirs %s", dirs);
- int i = 0;
+ c = (char *)dirs;
+ dir = malloc(strlen(dirs) + 1);
+
+ i = 0;
while (*c) {
if ((*c == DIRSEP || *c == '\0') && c != dirs) {
strncpy(dir, dirs, i);
printf("File copy error: unknown error %d.\n", code);
}
}
+
+int dir_rcopy(const char *src, const char *dst)
+{
+ int ret;
+ char **paths;
+ FTS *ftsp;
+ FTSENT *p, *chp;
+ int fts_options = FTS_COMFOLLOW | FTS_LOGICAL | FTS_NOCHDIR;
+ char *p_dst, *n_dst;
+
+ log_fct_enter();
+
+ log_fct("copy dir %s to %s", src, dst);
+
+ paths = malloc(2 * sizeof(char *));
+ paths[0] = strdup(src);
+ paths[1] = NULL;
+
+ ftsp = fts_open(paths, fts_options, NULL);
+ if (!ftsp)
+ return 1;
+
+ chp = fts_children(ftsp, 0);
+ if (!chp)
+ return 0;
+
+ n_dst = dir_normalize(dst);
+
+ while ((p = fts_read(ftsp)) != NULL) {
+ switch (p->fts_info) {
+ case FTS_D:
+ p_dst = path_append(n_dst,
+ p->fts_path + strlen(src) + 1);
+ mkdirs(p_dst, 0777);
+ free(p_dst);
+ break;
+ case FTS_F:
+ p_dst = path_append(n_dst,
+ p->fts_path + strlen(src) + 1);
+ file_copy(p->fts_path, p_dst);
+ free(p_dst);
+ break;
+ default:
+ break;
+ }
+ }
+ fts_close(ftsp);
+
+ free(n_dst);
+ free(paths);
+
+ ret = 0;
+
+ log_fct_exit();
+
+ return ret;
+}