diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2014-12-08 14:54:09 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2014-12-08 14:54:09 +0100 |
commit | 3eade89c7573f8893fe045290e374d4502092e13 (patch) | |
tree | defd4218ff82053d44f54595af4e882ea7eb988a /lib | |
parent | c2b5a7015b7323af4b7c8cf19a06b954f4f09949 (diff) | |
parent | 7962e7a0b423a5dfba251622f64d3891f69a55c0 (diff) | |
download | barebox-3eade89c7573f8893fe045290e374d4502092e13.tar.gz barebox-3eade89c7573f8893fe045290e374d4502092e13.tar.xz |
Merge branch 'for-next/persistent-vars'
Conflicts:
arch/arm/boards/efika-mx-smartbook/defaultenv-efikasb/config
Diffstat (limited to 'lib')
-rw-r--r-- | lib/libfile.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/lib/libfile.c b/lib/libfile.c index 7ed4b93672..8acff042c8 100644 --- a/lib/libfile.c +++ b/lib/libfile.c @@ -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 |