| #include "tests.h" |
| #include <asm/unistd.h> |
| |
| #ifdef __NR_reboot |
| |
| # include <stdio.h> |
| # include <linux/reboot.h> |
| # include <unistd.h> |
| |
| # define INVALID_MAGIC 319887762 |
| # define INVALID_CMD 0x01234568 |
| |
| # define STR32 "AbCdEfGhIjKlMnOpQrStUvWxYz012345" |
| # define STR128 STR32 STR32 STR32 STR32 |
| |
| int |
| main(void) |
| { |
| static const kernel_ulong_t bogus_magic1 = |
| (kernel_ulong_t) 0xFFFFFFFFFFFFFFFFULL; |
| static const kernel_ulong_t bogus_magic2 = |
| (kernel_ulong_t) 0xdeadfacefa57beefULL; |
| static const kernel_ulong_t bogus_cmd = |
| (kernel_ulong_t) 0xbadda7a09caffee1ULL; |
| static const char buf[] = "reboot"; |
| static const char str256_buf[] = STR128 STR128; |
| |
| long rc; |
| char *str256 = tail_memdup(str256_buf, sizeof(str256_buf) - 1); |
| |
| rc = syscall(__NR_reboot, 0, 0, 0, 0); |
| printf("reboot(0 /* LINUX_REBOOT_MAGIC_??? */, " |
| "0 /* LINUX_REBOOT_MAGIC_??? */, " |
| "LINUX_REBOOT_CMD_CAD_OFF) = %s\n", |
| sprintrc(rc)); |
| |
| rc = syscall(__NR_reboot, bogus_magic1, bogus_magic2, bogus_cmd, -1); |
| printf("reboot(%#x /* LINUX_REBOOT_MAGIC_??? */, " |
| "%#x /* LINUX_REBOOT_MAGIC_??? */, " |
| "%#x /* LINUX_REBOOT_CMD_??? */) = %s\n", |
| (unsigned int) bogus_magic1, (unsigned int) bogus_magic2, |
| (unsigned int) bogus_cmd, sprintrc(rc)); |
| |
| rc = syscall(__NR_reboot, LINUX_REBOOT_MAGIC1, |
| INVALID_MAGIC, LINUX_REBOOT_CMD_RESTART2, buf); |
| printf("reboot(LINUX_REBOOT_MAGIC1, %#x /* LINUX_REBOOT_MAGIC_??? */," |
| " LINUX_REBOOT_CMD_RESTART2, \"%s\") = %s\n", |
| INVALID_MAGIC, buf, sprintrc(rc)); |
| |
| rc = syscall(__NR_reboot, LINUX_REBOOT_MAGIC1, |
| LINUX_REBOOT_MAGIC2, INVALID_CMD); |
| printf("reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2," |
| " %#x /* LINUX_REBOOT_CMD_??? */) = %s\n", |
| INVALID_CMD, sprintrc(rc)); |
| |
| rc = syscall(__NR_reboot, INVALID_MAGIC, LINUX_REBOOT_MAGIC2A, |
| LINUX_REBOOT_CMD_RESTART2, str256); |
| printf("reboot(%#x /* LINUX_REBOOT_MAGIC_??? */, LINUX_REBOOT_MAGIC2A, " |
| "LINUX_REBOOT_CMD_RESTART2, \"%.255s\"...) = %s\n", |
| INVALID_MAGIC, str256, sprintrc(rc)); |
| |
| rc = syscall(__NR_reboot, INVALID_MAGIC, LINUX_REBOOT_MAGIC2B, |
| LINUX_REBOOT_CMD_RESTART2, str256 + 1); |
| printf("reboot(%#x /* LINUX_REBOOT_MAGIC_??? */, LINUX_REBOOT_MAGIC2B, " |
| "LINUX_REBOOT_CMD_RESTART2, \"%.255s\"...) = %s\n", |
| INVALID_MAGIC, str256 + 1, sprintrc(rc)); |
| |
| rc = syscall(__NR_reboot, INVALID_MAGIC, LINUX_REBOOT_MAGIC2C, |
| LINUX_REBOOT_CMD_RESTART2, str256 + 2); |
| printf("reboot(%#x /* LINUX_REBOOT_MAGIC_??? */, LINUX_REBOOT_MAGIC2C, " |
| "LINUX_REBOOT_CMD_RESTART2, %p) = %s\n", |
| INVALID_MAGIC, str256 + 2, sprintrc(rc)); |
| |
| str256[255] = '\0'; |
| rc = syscall(__NR_reboot, INVALID_MAGIC, bogus_magic1, |
| LINUX_REBOOT_CMD_RESTART2, str256); |
| printf("reboot(%#x /* LINUX_REBOOT_MAGIC_??? */, " |
| "%#x /* LINUX_REBOOT_MAGIC_??? */, " |
| "LINUX_REBOOT_CMD_RESTART2, \"%.255s\"...) = %s\n", |
| INVALID_MAGIC, (unsigned int) bogus_magic1, str256, |
| sprintrc(rc)); |
| |
| rc = syscall(__NR_reboot, INVALID_MAGIC, bogus_magic1, |
| LINUX_REBOOT_CMD_RESTART2, str256 + 1); |
| printf("reboot(%#x /* LINUX_REBOOT_MAGIC_??? */, " |
| "%#x /* LINUX_REBOOT_MAGIC_??? */, " |
| "LINUX_REBOOT_CMD_RESTART2, \"%.254s\") = %s\n", |
| INVALID_MAGIC, (unsigned int) bogus_magic1, str256 + 1, |
| sprintrc(rc)); |
| |
| puts("+++ exited with 0 +++"); |
| return 0; |
| } |
| |
| #else |
| |
| SKIP_MAIN_UNDEFINED("__NR_reboot") |
| |
| #endif |