From 54d1c2157faabea62dea3757dc5c420e9bd99a2e Mon Sep 17 00:00:00 2001 From: Giuseppe Scrivano Date: Sat, 30 Jun 2018 18:49:35 +0200 Subject: [PATCH] containerfs: convert char devices(0, 0) to whiteout Signed-off-by: Giuseppe Scrivano --- main.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/main.c b/main.c index bfb639c..410aed2 100644 --- a/main.c +++ b/main.c @@ -46,6 +46,7 @@ #include #include #include +#include #include @@ -577,7 +578,9 @@ traverse_dir (char * const dir, struct lo_node *lower, bool low) struct lo_node *root, *n, *parent; int ret = -1; char *const dirs[] = {dir, NULL}; - FTS *fts = fts_open (dirs, FTS_NOSTAT | FTS_COMFOLLOW, NULL); + const char *name; + char tmp[PATH_MAX + 4]; + FTS *fts = fts_open (dirs, FTS_COMFOLLOW, NULL); if (fts == NULL) return NULL; @@ -624,7 +627,18 @@ traverse_dir (char * const dir, struct lo_node *lower, bool low) case FTS_SL: case FTS_SLNONE: case FTS_DEFAULT: - n = make_lo_node (ent->fts_path, ent->fts_name, false); + name = ent->fts_name; + if ((ent->fts_statp->st_mode & S_IFMT) == S_IFCHR) + { + if (major (ent->fts_statp->st_rdev) == 0 + && minor (ent->fts_statp->st_rdev) == 0) + { + sprintf (tmp, ".wh.%s", ent->fts_name); + name = tmp; + } + } + + n = make_lo_node (ent->fts_path, name, false); if (n == NULL) goto err; n->low = low ? 1 : 0;