Fix decoding of swapon flags
* 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.
diff --git a/swapon.c b/swapon.c
index 5f6df0b..ef88b1c 100644
--- 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;
}
diff --git a/tests/swap.c b/tests/swap.c
index a2fd1ff..e8f0196 100644
--- a/tests/swap.c
+++ b/tests/swap.c
@@ -14,6 +14,7 @@
switch (error_num) {
case ENOSYS: return "ENOSYS";
case EPERM: return "EPERM";
+ case EINVAL: return "EINVAL";
default: return "ENOENT";
}
}
@@ -27,6 +28,25 @@
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));