1#include "tests.h"
2#include <asm/unistd.h>
3
4#ifdef __NR_reboot
5
6# include <stdio.h>
7# include <linux/reboot.h>
8# include <unistd.h>
9
10# define INVALID_MAGIC 319887762
11# define INVALID_CMD 0x01234568
12
13# define STR32 "AbCdEfGhIjKlMnOpQrStUvWxYz012345"
14# define STR128 STR32 STR32 STR32 STR32
15
16int
17main(void)
18{
19	static const kernel_ulong_t bogus_magic1 =
20		(kernel_ulong_t) 0xFFFFFFFFFFFFFFFFULL;
21	static const kernel_ulong_t bogus_magic2 =
22		(kernel_ulong_t) 0xdeadfacefa57beefULL;
23	static const kernel_ulong_t bogus_cmd =
24		(kernel_ulong_t) 0xbadda7a09caffee1ULL;
25	static const char buf[] = "reboot";
26	static const char str256_buf[] = STR128 STR128;
27
28	long rc;
29	char *str256 = tail_memdup(str256_buf, sizeof(str256_buf) - 1);
30
31	rc = syscall(__NR_reboot, 0, 0, 0, 0);
32	printf("reboot(0 /* LINUX_REBOOT_MAGIC_??? */, "
33	       "0 /* LINUX_REBOOT_MAGIC_??? */, "
34	       "LINUX_REBOOT_CMD_CAD_OFF) = %s\n",
35	       sprintrc(rc));
36
37	rc = syscall(__NR_reboot, bogus_magic1, bogus_magic2, bogus_cmd, -1);
38	printf("reboot(%#x /* LINUX_REBOOT_MAGIC_??? */, "
39	       "%#x /* LINUX_REBOOT_MAGIC_??? */, "
40	       "%#x /* LINUX_REBOOT_CMD_??? */) = %s\n",
41	       (unsigned int) bogus_magic1, (unsigned int) bogus_magic2,
42	       (unsigned int) bogus_cmd, sprintrc(rc));
43
44	rc = syscall(__NR_reboot, LINUX_REBOOT_MAGIC1,
45			  INVALID_MAGIC, LINUX_REBOOT_CMD_RESTART2, buf);
46	printf("reboot(LINUX_REBOOT_MAGIC1, %#x /* LINUX_REBOOT_MAGIC_??? */,"
47	       " LINUX_REBOOT_CMD_RESTART2, \"%s\") = %s\n",
48	       INVALID_MAGIC, buf, sprintrc(rc));
49
50	rc = syscall(__NR_reboot, LINUX_REBOOT_MAGIC1,
51		     LINUX_REBOOT_MAGIC2, INVALID_CMD);
52	printf("reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2,"
53	       " %#x /* LINUX_REBOOT_CMD_??? */) = %s\n",
54	       INVALID_CMD, sprintrc(rc));
55
56	rc = syscall(__NR_reboot, INVALID_MAGIC, LINUX_REBOOT_MAGIC2A,
57			  LINUX_REBOOT_CMD_RESTART2, str256);
58	printf("reboot(%#x /* LINUX_REBOOT_MAGIC_??? */, LINUX_REBOOT_MAGIC2A, "
59	       "LINUX_REBOOT_CMD_RESTART2, \"%.255s\"...) = %s\n",
60	       INVALID_MAGIC, str256, sprintrc(rc));
61
62	rc = syscall(__NR_reboot, INVALID_MAGIC, LINUX_REBOOT_MAGIC2B,
63			  LINUX_REBOOT_CMD_RESTART2, str256 + 1);
64	printf("reboot(%#x /* LINUX_REBOOT_MAGIC_??? */, LINUX_REBOOT_MAGIC2B, "
65	       "LINUX_REBOOT_CMD_RESTART2, \"%.255s\"...) = %s\n",
66	       INVALID_MAGIC, str256 + 1, sprintrc(rc));
67
68	rc = syscall(__NR_reboot, INVALID_MAGIC, LINUX_REBOOT_MAGIC2C,
69			  LINUX_REBOOT_CMD_RESTART2, str256 + 2);
70	printf("reboot(%#x /* LINUX_REBOOT_MAGIC_??? */, LINUX_REBOOT_MAGIC2C, "
71	       "LINUX_REBOOT_CMD_RESTART2, %p) = %s\n",
72	       INVALID_MAGIC, str256 + 2, sprintrc(rc));
73
74	str256[255] = '\0';
75	rc = syscall(__NR_reboot, INVALID_MAGIC, bogus_magic1,
76			  LINUX_REBOOT_CMD_RESTART2, str256);
77	printf("reboot(%#x /* LINUX_REBOOT_MAGIC_??? */, "
78	       "%#x /* LINUX_REBOOT_MAGIC_??? */, "
79	       "LINUX_REBOOT_CMD_RESTART2, \"%.255s\"...) = %s\n",
80	       INVALID_MAGIC, (unsigned int) bogus_magic1, str256,
81	       sprintrc(rc));
82
83	rc = syscall(__NR_reboot, INVALID_MAGIC, bogus_magic1,
84			  LINUX_REBOOT_CMD_RESTART2, str256 + 1);
85	printf("reboot(%#x /* LINUX_REBOOT_MAGIC_??? */, "
86	       "%#x /* LINUX_REBOOT_MAGIC_??? */, "
87	       "LINUX_REBOOT_CMD_RESTART2, \"%.254s\") = %s\n",
88	       INVALID_MAGIC, (unsigned int) bogus_magic1, str256 + 1,
89	       sprintrc(rc));
90
91	puts("+++ exited with 0 +++");
92	return 0;
93}
94
95#else
96
97SKIP_MAIN_UNDEFINED("__NR_reboot")
98
99#endif
100