diff options
author | Felix Fietkau <nbd@openwrt.org> | 2015-03-22 14:08:27 +0100 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2015-03-22 14:08:27 +0100 |
commit | 2d6bccbb70ce2f8195aad348c653c4c13f21c90c (patch) | |
tree | 09dbee2d7353cda1cad51ec2a324607dca761465 /libfstools | |
parent | 0b99adb02f2eb822fbfc4efcb8ebf5fecbd74974 (diff) | |
download | fstools-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.h | 2 | ||||
-rw-r--r-- | libfstools/overlay.c | 39 |
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) { |