VALGRIND_SUPPRESSIONS_FILES = $(abs_srcdir)/strace.supp
EXTRA_DIST = \
+ accept_compat.h \
attach-p-cmd.h \
caps-abbrev.awk \
caps.awk \
--- /dev/null
+#ifndef _STRACE_TESTS_ACCEPT_COMPAT_H_
+#define _STRACE_TESTS_ACCEPT_COMPAT_H_
+
+#include <unistd.h>
+#include <sys/socket.h>
+#include <asm/unistd.h>
+
+#if defined __NR_socketcall && defined __sparc__
+/*
+ * Work around the fact that
+ * - glibc >= 2.26 uses accept4 syscall to implement accept() call on sparc;
+ * - accept syscall had not been wired up on sparc until v4.4-rc8~4^2~1.
+ */
+static inline int
+do_accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
+{
+ const long args[] = { sockfd, (long) addr, (long) addrlen };
+
+ return syscall(__NR_socketcall, 5, args);
+}
+#else
+# define do_accept accept
+#endif
+
+#endif /* !_STRACE_TESTS_ACCEPT_COMPAT_H_ */
#include <sys/socket.h>
#include <sys/un.h>
+#include "accept_compat.h"
+
#define TEST_SOCKET "net-y-unix.socket"
int
struct sockaddr * const accept_sa = tail_alloc(sizeof(addr));
memset(accept_sa, 0, sizeof(addr));
*len = sizeof(addr);
- int accept_fd = accept(listen_fd, accept_sa, len);
+ int accept_fd = do_accept(listen_fd, accept_sa, len);
if (accept_fd < 0)
perror_msg_and_fail("accept");
unsigned long accept_inode = inode_of_sockfd(accept_fd);
memset(accept_sa, 0, sizeof(addr));
*len = sizeof(addr);
- accept_fd = accept(listen_fd, accept_sa, len);
+ accept_fd = do_accept(listen_fd, accept_sa, len);
if (accept_fd < 0)
perror_msg_and_fail("accept");
accept_inode = inode_of_sockfd(accept_fd);
#include <netinet/tcp.h>
#include <arpa/inet.h>
+#include "accept_compat.h"
+
int
main(void)
{
struct sockaddr * const accept_sa = tail_alloc(sizeof(addr));
memset(accept_sa, 0, sizeof(addr));
*len = sizeof(addr);
- const int accept_fd = accept(listen_fd, accept_sa, len);
+ const int accept_fd = do_accept(listen_fd, accept_sa, len);
if (accept_fd < 0)
perror_msg_and_fail("accept");
const unsigned int connect_port =
#include <sys/socket.h>
#include <sys/un.h>
+#include "accept_compat.h"
+
#define TEST_SOCKET "net-yy-unix.socket"
int
struct sockaddr * const accept_sa = tail_alloc(sizeof(addr));
memset(accept_sa, 0, sizeof(addr));
*len = sizeof(addr);
- int accept_fd = accept(listen_fd, accept_sa, len);
+ int accept_fd = do_accept(listen_fd, accept_sa, len);
if (accept_fd < 0)
perror_msg_and_fail("accept");
unsigned long accept_inode = inode_of_sockfd(accept_fd);
memset(accept_sa, 0, sizeof(addr));
*len = sizeof(addr);
- accept_fd = accept(listen_fd, accept_sa, len);
+ accept_fd = do_accept(listen_fd, accept_sa, len);
if (accept_fd < 0)
perror_msg_and_fail("accept");
accept_inode = inode_of_sockfd(accept_fd);
[1-9][0-9]* +[0-9]+:[0-9]+:[0-9]+\.[0-9]+ +bind\(0, \{sa_family=AF_(LOCAL|UNIX|FILE), sun_path="net-local-stream"\}, 19\) += 0
[1-9][0-9]* +[0-9]+:[0-9]+:[0-9]+\.[0-9]+ +listen\(0, 5\) += 0
[1-9][0-9]* +[0-9]+:[0-9]+:[0-9]+\.[0-9]+ +getsockname\(0, \{sa_family=AF_(LOCAL|UNIX|FILE), sun_path="net-local-stream"\}, \[19\]\) += 0
-[1-9][0-9]* +[0-9]+:[0-9]+:[0-9]+\.[0-9]+ +accept\(0, \{sa_family=AF_(LOCAL|UNIX|FILE)\}, \[19->2\]\) += 1
+[1-9][0-9]* +[0-9]+:[0-9]+:[0-9]+\.[0-9]+ +accept4?\(0, \{sa_family=AF_(LOCAL|UNIX|FILE)\}, \[19->2\](, 0)?\) += 1
[1-9][0-9]* +[0-9]+:[0-9]+:[0-9]+\.[0-9]+ +connect\(1, \{sa_family=AF_(LOCAL|UNIX|FILE), sun_path="net-local-stream"\}, 19\) += 0