1 /*
2 * Check decoding of getrandom syscall.
3 *
4 * Copyright (c) 2015-2018 Dmitry V. Levin <ldv@strace.io>
5 * Copyright (c) 2015-2021 The strace developers.
6 * All rights reserved.
7 *
8 * SPDX-License-Identifier: GPL-2.0-or-later
9 */
10
11 #include "tests.h"
12 #include "scno.h"
13
14 #include <stdio.h>
15 #include <unistd.h>
16
17 int
18 main(void)
19 {
20 unsigned char buf[4];
21
22 /*
23 * syscall/printf are in the inverted order to trigger tcache
24 * initialisation first see glibc-2.33.9000-879-gfc859c3.
25 */
26 printf("getrandom(NULL, 0, 0) = 0\n");
27 if (syscall(__NR_getrandom, 0, 0, 0) != 0)
28 perror_msg_and_skip("getrandom(NULL, 0, 0)");
29
30 if (syscall(__NR_getrandom, buf, sizeof(buf) - 1, 0) != sizeof(buf) - 1)
31 perror_msg_and_skip("getrandom");
32 printf("getrandom(\"\\x%02x\\x%02x\\x%02x\", 3, 0) = 3\n",
33 (int) buf[0], (int) buf[1], (int) buf[2]);
34
35 if (syscall(__NR_getrandom, buf, sizeof(buf), 1) != sizeof(buf))
36 perror_msg_and_skip("getrandom");
37 printf("getrandom(\"\\x%02x\\x%02x\\x%02x\"..., 4, GRND_NONBLOCK) = 4\n",
38 (int) buf[0], (int) buf[1], (int) buf[2]);
39
40 if (syscall(__NR_getrandom, buf, sizeof(buf), 0x3003) != -1)
41 perror_msg_and_skip("getrandom");
42 printf("getrandom(%p, 4, GRND_NONBLOCK|GRND_RANDOM|0x3000) = "
43 "-1 EINVAL (%m)\n", buf);
44
45 puts("+++ exited with 0 +++");
46 return 0;
47 }