9
0
Fork 0

libfile: Add copy_recursive

To recursively copy a directory tree.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
Sascha Hauer 2014-10-23 21:46:01 +02:00
parent 3249006a2f
commit 9f11887009
2 changed files with 42 additions and 0 deletions

View File

@ -15,6 +15,8 @@ int write_file(const char *filename, void *buf, size_t size);
int copy_file(const char *src, const char *dst, int verbose);
int copy_recursive(const char *src, const char *dst);
int compare_file(const char *f1, const char *f2);
#endif /* __LIBFILE_H */

View File

@ -332,6 +332,46 @@ out:
}
EXPORT_SYMBOL(copy_file);
int copy_recursive(const char *src, const char *dst)
{
struct stat s;
DIR *dir;
struct dirent *d;
int ret;
ret = stat(src, &s);
if (ret)
return ret;
if (!S_ISDIR(s.st_mode))
return copy_file(src, dst, 0);
ret = make_directory(dst);
if (ret)
return ret;
dir = opendir(src);
if (!dir)
return -EIO;
while ((d = readdir(dir))) {
char *from, *to;
if (!strcmp(d->d_name, ".") || !strcmp(d->d_name, ".."))
continue;
from = asprintf("%s/%s", src, d->d_name);
to = asprintf("%s/%s", dst, d->d_name);
ret = copy_recursive(from, to);
if (ret)
break;
free(from);
free(to);
}
closedir(dir);
return ret;
}
/**
* compare_file - Compare two files
* @f1: The first file