]> granicus.if.org Git - strace/blob - tests/libsocketcall.c
Update copyright headers
[strace] / tests / libsocketcall.c
1 /*
2  * Invoke a socket syscall, either directly or via __NR_socketcall.
3  *
4  * Copyright (c) 2016-2018 Dmitry V. Levin <ldv@altlinux.org>
5  * All rights reserved.
6  *
7  * SPDX-License-Identifier: GPL-2.0-or-later
8  */
9
10 #include "tests.h"
11 #include <errno.h>
12 #include <unistd.h>
13 #include <asm/unistd.h>
14
15 /*
16  * Invoke a socket syscall, either directly or via __NR_socketcall.
17  * if nr == -1, no direct syscall invocation will be made.
18  */
19 int
20 socketcall(const int nr, const int call,
21            long a1, long a2, long a3, long a4, long a5)
22 {
23         int rc = -1;
24         errno = ENOSYS;
25
26 # ifdef __NR_socketcall
27         static int have_socketcall = -1;
28
29         if (have_socketcall < 0) {
30                 if (syscall(__NR_socketcall, 0L, 0L, 0L, 0L, 0L) < 0
31                     && EINVAL == errno) {
32                         have_socketcall = 1;
33                 } else {
34                         have_socketcall = 0;
35                 }
36         }
37
38         if (have_socketcall) {
39                 const long args[] = { a1, a2, a3, a4, a5 };
40                 rc = syscall(__NR_socketcall, call, args);
41         } else
42 # endif
43         {
44                 if (nr != -1)
45                         rc = syscall(nr, a1, a2, a3, a4, a5);
46         }
47
48         return rc;
49 }