]> granicus.if.org Git - strace/commitdiff
2007-01-16 Dmitry V. Levin <ldv@altlinux.org>
authorDmitry V. Levin <ldv@altlinux.org>
Tue, 16 Jan 2007 15:10:07 +0000 (15:10 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Tue, 16 Jan 2007 15:10:07 +0000 (15:10 +0000)
Update mount parser to match kernel behaviour.
* system.c [LINUX] (MS_VERBOSE): Rename to MS_SILENT.
[LINUX] (MS_UNBINDABLE, MS_PRIVATE, MS_SLAVE, MS_SHARED):
New macros.
[LINUX] (mount_flags): Add them.
[LINUX] (MS_MGC_MSK): New macro.
[LINUX] (sys_mount): Update parser to match kernel behaviour:
discard MS_MGC_VAL magic, do not decode type and/or data
strings when specified flags do not imply valid strings.

ChangeLog
system.c

index 2cfabe0da678829434ff2a5cbb180fc323a333b6..ff9e57c445e1b7c4a83cf803ab90c28021129be5 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2007-01-16  Dmitry V. Levin <ldv@altlinux.org>
+
+       Update mount parser to match kernel behaviour.
+       * system.c [LINUX] (MS_VERBOSE): Rename to MS_SILENT.
+       [LINUX] (MS_UNBINDABLE, MS_PRIVATE, MS_SLAVE, MS_SHARED):
+       New macros.
+       [LINUX] (mount_flags): Add them.
+       [LINUX] (MS_MGC_MSK): New macro.
+       [LINUX] (sys_mount): Update parser to match kernel behaviour:
+       discard MS_MGC_VAL magic, do not decode type and/or data
+       strings when specified flags do not imply valid strings.
+
 2007-01-15  Roland McGrath  <roland@redhat.com>
 
        * configure.ac, NEWS: Version 4.5.15.
index 0970d710ee2a260743dd1d3e011b32a4dcf967ac..9480004a86fb1b62ee84615547469e450698312d 100644 (file)
--- a/system.c
+++ b/system.c
 #define MS_BIND                4096
 #define MS_MOVE                8192
 #define MS_REC         16384
-#define MS_VERBOSE     32768
+#define MS_SILENT      32768
 #define MS_POSIXACL    (1<<16) /* VFS does not apply the umask */
+#define MS_UNBINDABLE  (1<<17) /* change to unbindable */
+#define MS_PRIVATE     (1<<18) /* change to private */
+#define MS_SLAVE       (1<<19) /* change to slave */
+#define MS_SHARED      (1<<20) /* change to shared */
 #define MS_ACTIVE      (1<<30)
 #define MS_NOUSER      (1<<31)
 #define MS_MGC_VAL     0xc0ed0000      /* Magic flag number */
+#define MS_MGC_MSK     0xffff0000      /* Magic flag mask */
 
 #include <sys/socket.h>
 #include <netinet/in.h>
@@ -93,33 +98,52 @@ static const struct xlat mount_flags[] = {
        { MS_BIND,      "MS_BIND"       },
        { MS_MOVE,      "MS_MOVE"       },
        { MS_REC,       "MS_REC"        },
-       { MS_VERBOSE,   "MS_VERBOSE"    },
+       { MS_SILENT,    "MS_SILENT"     },
        { MS_POSIXACL,  "MS_POSIXACL"   },
+       { MS_UNBINDABLE,"MS_UNBINDABLE" },
+       { MS_PRIVATE,   "MS_PRIVATE"    },
+       { MS_SLAVE,     "MS_SLAVE"      },
+       { MS_SHARED,    "MS_SHARED"     },
        { MS_ACTIVE,    "MS_ACTIVE"     },
        { MS_NOUSER,    "MS_NOUSER"     },
        { 0,            NULL            },
 };
 
 int
-sys_mount(tcp)
-struct tcb *tcp;
+sys_mount(struct tcb *tcp)
 {
        if (entering(tcp)) {
+               int ignore_type = 0, ignore_data = 0;
+               unsigned long flags = tcp->u_arg[3];
+
+               /* Discard magic */
+               if ((flags & MS_MGC_MSK) == MS_MGC_VAL)
+                       flags &= ~MS_MGC_MSK;
+
+               if (flags & MS_REMOUNT)
+                       ignore_type = 1;
+               else if (flags & (MS_BIND | MS_MOVE))
+                       ignore_type = ignore_data = 1;
+
                printpath(tcp, tcp->u_arg[0]);
                tprintf(", ");
+
                printpath(tcp, tcp->u_arg[1]);
                tprintf(", ");
-               if ((tcp->u_arg[3] & (MS_BIND|MS_MOVE|MS_REMOUNT)) == 0)
-                       printpath(tcp, tcp->u_arg[2]);
-               else
+
+               if (ignore_type && tcp->u_arg[2])
                        tprintf("%#lx", tcp->u_arg[2]);
+               else
+                       printstr(tcp, tcp->u_arg[2], -1);
                tprintf(", ");
+
                printflags(mount_flags, tcp->u_arg[3], "MS_???");
                tprintf(", ");
-               if ((tcp->u_arg[3] & (MS_BIND|MS_MOVE)) == 0)
-                       printstr(tcp, tcp->u_arg[4], -1);
-               else
+
+               if (ignore_data && tcp->u_arg[4])
                        tprintf("%#lx", tcp->u_arg[4]);
+               else
+                       printstr(tcp, tcp->u_arg[4], -1);
        }
        return 0;
 }