| 1 | /* |
| 2 | * Test GDB syscall catchpoints. |
| 3 | * |
| 4 | * SPDX-License-Identifier: GPL-2.0-or-later |
| 5 | */ |
| 6 | #define _GNU_SOURCE |
| 7 | #include <stdlib.h> |
| 8 | #include <unistd.h> |
| 9 | |
| 10 | const char *catch_syscalls_state = "start"; |
| 11 | |
| 12 | void end_of_main(void) |
| 13 | { |
| 14 | } |
| 15 | |
| 16 | int main(void) |
| 17 | { |
| 18 | int ret = EXIT_FAILURE; |
| 19 | char c0 = 'A', c1; |
| 20 | int fd[2]; |
| 21 | |
| 22 | catch_syscalls_state = "pipe2"; |
| 23 | if (pipe2(fd, 0)) { |
| 24 | goto out; |
| 25 | } |
| 26 | |
| 27 | catch_syscalls_state = "write"; |
| 28 | if (write(fd[1], &c0, sizeof(c0)) != sizeof(c0)) { |
| 29 | goto out_close; |
| 30 | } |
| 31 | |
| 32 | catch_syscalls_state = "read"; |
| 33 | if (read(fd[0], &c1, sizeof(c1)) != sizeof(c1)) { |
| 34 | goto out_close; |
| 35 | } |
| 36 | |
| 37 | catch_syscalls_state = "check"; |
| 38 | if (c0 == c1) { |
| 39 | ret = EXIT_SUCCESS; |
| 40 | } |
| 41 | |
| 42 | out_close: |
| 43 | catch_syscalls_state = "close"; |
| 44 | close(fd[0]); |
| 45 | close(fd[1]); |
| 46 | |
| 47 | out: |
| 48 | catch_syscalls_state = "end"; |
| 49 | end_of_main(); |
| 50 | return ret; |
| 51 | } |