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));