summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2014-12-08 14:54:09 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2014-12-08 14:54:09 +0100
commit3eade89c7573f8893fe045290e374d4502092e13 (patch)
treedefd4218ff82053d44f54595af4e882ea7eb988a /lib
parentc2b5a7015b7323af4b7c8cf19a06b954f4f09949 (diff)
parent7962e7a0b423a5dfba251622f64d3891f69a55c0 (diff)
downloadbarebox-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.c40
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