mount: an array of known mount/vfsmount flag pairs
authorRobert Swiecki <robert@swiecki.net>
Thu, 26 Oct 2017 00:27:18 +0000 (02:27 +0200)
committerRobert Swiecki <robert@swiecki.net>
Thu, 26 Oct 2017 00:27:18 +0000 (02:27 +0200)
mount.c

diff --git a/mount.c b/mount.c
index d567b4ac4a7617a7b30572fb6d4c6b3e2f90dab9..ac14c4c7367cde042622c54b4b4169cfb2633ec6 100644 (file)
--- a/mount.c
+++ b/mount.c
@@ -232,22 +232,29 @@ static bool mountRemountRO(struct mounts_t* mpt) {
                return false;
        }
 
+       struct {
+               unsigned long mount_flag;
+               unsigned long vfs_flag;
+       } mountPairs[] = {
+           {MS_RDONLY, ST_RDONLY},
+           {MS_NOSUID, ST_NOSUID},
+           {MS_NODEV, ST_NODEV},
+           {MS_NOEXEC, ST_NOEXEC},
+           {MS_SYNCHRONOUS, ST_SYNCHRONOUS},
+           {MS_MANDLOCK, ST_MANDLOCK},
+           {MS_NOATIME, ST_NOATIME},
+           {MS_NODIRATIME, ST_NODIRATIME},
+           {MS_RELATIME, ST_RELATIME},
+       };
+
        unsigned long new_flags = MS_REMOUNT | MS_RDONLY | MS_BIND;
-       if (vfs.f_flag & ST_RDONLY) {
-               new_flags |= MS_RDONLY;
-       }
-       if (vfs.f_flag & ST_NOSUID) {
-               new_flags |= MS_NOSUID;
-       }
-       if (vfs.f_flag & ST_NODEV) {
-               new_flags |= MS_NODEV;
-       }
-       if (vfs.f_flag & ST_NOEXEC) {
-               new_flags |= MS_NOEXEC;
+       for (size_t i = 0; i < ARRAYSIZE(mountPairs); i++) {
+               if (vfs.f_flag & mountPairs[i].vfs_flag) {
+                       new_flags |= mountPairs[i].mount_flag;
+               }
        }
 
        LOG_D("Re-mounting R/O '%s' (flags:%s)", mpt->dst, mountFlagsToStr(new_flags));
-
        if (mount(mpt->dst, mpt->dst, NULL, new_flags, 0) == -1) {
                PLOG_W("mount('%s', flags:%s)", mpt->dst, mountFlagsToStr(new_flags));
                return false;