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.
This commit is contained in:
Дмитрий Левин 2016-04-07 01:15:58 +00:00
parent f2f91c0933
commit fcb94cded0
2 changed files with 30 additions and 5 deletions

View File

@ -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;
}

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