]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libmount: support name=value for mnt_match_options()
authorKarel Zak <kzak@redhat.com>
Tue, 20 Dec 2016 15:01:22 +0000 (16:01 +0100)
committerKarel Zak <kzak@redhat.com>
Tue, 20 Dec 2016 15:01:22 +0000 (16:01 +0100)
$ findmnt --options mode=755
TARGET         SOURCE FSTYPE   OPTIONS
/sys/fs/cgroup tmpfs  tmpfs    rw,nosuid,nodev,noexec,relatime,mode=755
/dev           udev   devtmpfs rw,relatime,size=1983516k,nr_inodes=495879,mode=755

Signed-off-by: Karel Zak <kzak@redhat.com>
libmount/src/optstr.c

index 2aa6e8ccb2eed02ce135bd54b3599ae04d13f1ef..4b9622ed5a113b3d3655779b19f9c8c645280dee 100644 (file)
@@ -1113,8 +1113,8 @@ int mnt_optstr_fix_user(char **optstr)
 int mnt_match_options(const char *optstr, const char *pattern)
 {
        char *name, *pat = (char *) pattern;
-       char *buf;
-       size_t namesz = 0, valsz = 0;
+       char *buf, *patval;
+       size_t namesz = 0, patvalsz = 0;
        int match = 1;
 
        if (!pattern && !optstr)
@@ -1128,10 +1128,11 @@ int mnt_match_options(const char *optstr, const char *pattern)
 
        /* walk on pattern string
         */
-       while (match && !mnt_optstr_next_option(&pat, &name, &namesz, NULL, &valsz)) {
+       while (match && !mnt_optstr_next_option(&pat, &name, &namesz,
+                                               &patval, &patvalsz)) {
                char *val;
                size_t sz;
-               int no = 0;
+               int no = 0, rc;
 
                if (*name == '+')
                        name++, namesz--;
@@ -1140,7 +1141,14 @@ int mnt_match_options(const char *optstr, const char *pattern)
 
                xstrncpy(buf, name, namesz + 1);
 
-               switch (mnt_optstr_get_option(optstr, buf, &val, &sz)) {
+               rc = mnt_optstr_get_option(optstr, buf, &val, &sz);
+
+               /* check also value (if the pattern is "foo=value") */
+               if (rc == 0 && patvalsz > 0 &&
+                   (patvalsz != sz || strncmp(patval, val, sz) != 0))
+                       rc = 1;
+
+               switch (rc) {
                case 0:         /* found */
                        match = no == 0 ? 1 : 0;
                        break;