]> granicus.if.org Git - strace/commitdiff
Fix decoding of swapon flags
authorDmitry V. Levin <ldv@altlinux.org>
Thu, 7 Apr 2016 01:15:58 +0000 (01:15 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Thu, 7 Apr 2016 01:15:58 +0000 (01:15 +0000)
* swapon.c (SYS_FUNC(swapon)): Print priority regardless
of SWAP_FLAG_PREFER flag being set.
* tests/swap.c (error_msg): Handle EINVAL.
(main): Check decoding of swapon flags.

swapon.c
tests/swap.c

index 5f6df0b853177ed1ef97ac83af19f6fe15e161c0..ef88b1ceba4636e35d0a1602bdb8043187e3161b 100644 (file)
--- a/swapon.c
+++ b/swapon.c
@@ -6,14 +6,19 @@
 
 SYS_FUNC(swapon)
 {
-       int flags = tcp->u_arg[1];
+       unsigned int flags = tcp->u_arg[1];
+       unsigned int prio = flags & SWAP_FLAG_PRIO_MASK;
+       flags &= ~SWAP_FLAG_PRIO_MASK;
 
        printpath(tcp, tcp->u_arg[0]);
        tprints(", ");
-       printflags(swap_flags, flags & ~SWAP_FLAG_PRIO_MASK,
-               "SWAP_FLAG_???");
-       if (flags & SWAP_FLAG_PREFER)
-               tprintf("|%d", flags & SWAP_FLAG_PRIO_MASK);
+       if (flags) {
+               printflags(swap_flags, flags, "SWAP_FLAG_???");
+               if (prio)
+                       tprintf("|%u", prio);
+       } else {
+               tprintf("%u", prio);
+       }
 
        return RVAL_DECODED;
 }
index a2fd1ff4923c1a16aea2c63eba20b3fee1f95ac4..e8f01968fb4ce53acefa6a36882c5a60859a0d96 100644 (file)
@@ -14,6 +14,7 @@ error_msg(int error_num)
        switch (error_num) {
                case ENOSYS: return "ENOSYS";
                case EPERM: return "EPERM";
+               case EINVAL: return "EINVAL";
                default: return "ENOENT";
        }
 }
@@ -27,6 +28,25 @@ main(void)
        printf("swapon(\"%s\", 0) = %d %s (%m)\n",
               sample, rc, error_msg(errno));
 
+       rc = syscall(__NR_swapon, sample, 42);
+       printf("swapon(\"%s\", %s) = %d %s (%m)\n",
+              sample, "42", rc, error_msg(errno));
+
+       rc = syscall(__NR_swapon, sample, SWAP_FLAG_PREFER);
+       printf("swapon(\"%s\", %s) = %d %s (%m)\n",
+              sample, "SWAP_FLAG_PREFER", rc, error_msg(errno));
+
+       rc = syscall(__NR_swapon, sample, SWAP_FLAG_PREFER | 42);
+       printf("swapon(\"%s\", %s) = %d %s (%m)\n",
+              sample, "SWAP_FLAG_PREFER|42", rc, error_msg(errno));
+
+       rc = syscall(__NR_swapon, sample, -1L);
+       printf("swapon(\"%s\", %s) = %d %s (%m)\n",
+              sample,
+              "SWAP_FLAG_PREFER|SWAP_FLAG_DISCARD|SWAP_FLAG_DISCARD_ONCE"
+              "|SWAP_FLAG_DISCARD_PAGES|0xfff80000|32767",
+              rc, error_msg(errno));
+
        rc = syscall(__NR_swapoff, sample);
        printf("swapoff(\"%s\") = %d %s (%m)\n",
               sample, rc, error_msg(errno));