summaryrefslogtreecommitdiff
path: root/libfstools
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2015-03-22 14:08:27 +0100
committerFelix Fietkau <nbd@openwrt.org>2015-03-22 14:08:27 +0100
commit2d6bccbb70ce2f8195aad348c653c4c13f21c90c (patch)
tree09dbee2d7353cda1cad51ec2a324607dca761465 /libfstools
parent0b99adb02f2eb822fbfc4efcb8ebf5fecbd74974 (diff)
downloadfstools-2d6bccbb70ce2f8195aad348c653c4c13f21c90c.tar.gz
overlay: create a common function for deleting all overlay data (optionally excluding sysupgrade.tgz)
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Diffstat (limited to 'libfstools')
-rw-r--r--libfstools/libfstools.h2
-rw-r--r--libfstools/overlay.c39
2 files changed, 41 insertions, 0 deletions
diff --git a/libfstools/libfstools.h b/libfstools/libfstools.h
index a9f8576..1d41eea 100644
--- a/libfstools/libfstools.h
+++ b/libfstools/libfstools.h
@@ -48,4 +48,6 @@ extern int jffs2_switch(struct volume *v);
extern int handle_whiteout(const char *dir);
extern void foreachdir(const char *dir, int (*cb)(const char*));
+extern void overlay_delete(const char *dir, bool keep_sysupgrade);
+
#endif
diff --git a/libfstools/overlay.c b/libfstools/overlay.c
index 21012ba..c535693 100644
--- a/libfstools/overlay.c
+++ b/libfstools/overlay.c
@@ -32,6 +32,38 @@
#define SWITCH_JFFS2 "/tmp/.switch_jffs2"
+static bool keep_sysupgrade;
+
+static int
+handle_rmdir(const char *dir)
+{
+ struct dirent *dt;
+ struct stat st;
+ DIR *d;
+ int fd;
+
+ d = opendir(dir);
+ if (!d)
+ return -1;
+
+ fd = dirfd(d);
+
+ while ((dt = readdir(d)) != NULL) {
+ if (fstatat(fd, dt->d_name, &st, AT_SYMLINK_NOFOLLOW) || S_ISDIR(st.st_mode))
+ continue;
+
+ if (keep_sysupgrade && !strcmp(dt->d_name, "sysupgrade.tgz"))
+ continue;
+
+ unlinkat(fd, dt->d_name, 0);
+ }
+
+ closedir(d);
+ rmdir(dir);
+
+ return 0;
+}
+
void
foreachdir(const char *dir, int (*cb)(const char*))
{
@@ -51,6 +83,13 @@ foreachdir(const char *dir, int (*cb)(const char*))
cb(dir);
}
+void
+overlay_delete(const char *dir, bool _keep_sysupgrade)
+{
+ keep_sysupgrade = _keep_sysupgrade;
+ foreachdir(dir, handle_rmdir);
+}
+
static int
overlay_mount(struct volume *v, char *fs)
{