Module Name: src Committed By: ozaki-r Date: Thu Feb 16 08:08:01 UTC 2017
Modified Files: src/lib/librumphijack: hijack.c Log Message: Support paccept for nc To generate a diff of this commit: cvs rdiff -u -r1.121 -r1.122 src/lib/librumphijack/hijack.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/lib/librumphijack/hijack.c diff -u src/lib/librumphijack/hijack.c:1.121 src/lib/librumphijack/hijack.c:1.122 --- src/lib/librumphijack/hijack.c:1.121 Fri Dec 2 20:53:36 2016 +++ src/lib/librumphijack/hijack.c Thu Feb 16 08:08:01 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: hijack.c,v 1.121 2016/12/02 20:53:36 christos Exp $ */ +/* $NetBSD: hijack.c,v 1.122 2017/02/16 08:08:01 ozaki-r Exp $ */ /*- * Copyright (c) 2011 Antti Kantee. All Rights Reserved. @@ -34,7 +34,7 @@ #include <rump/rumpuser_port.h> #if !defined(lint) -__RCSID("$NetBSD: hijack.c,v 1.121 2016/12/02 20:53:36 christos Exp $"); +__RCSID("$NetBSD: hijack.c,v 1.122 2017/02/16 08:08:01 ozaki-r Exp $"); #endif #include <sys/param.h> @@ -89,7 +89,8 @@ __RCSID("$NetBSD: hijack.c,v 1.121 2016/ enum dualcall { DUALCALL_WRITE, DUALCALL_WRITEV, DUALCALL_PWRITE, DUALCALL_PWRITEV, DUALCALL_IOCTL, DUALCALL_FCNTL, - DUALCALL_SOCKET, DUALCALL_ACCEPT, DUALCALL_BIND, DUALCALL_CONNECT, + DUALCALL_SOCKET, DUALCALL_ACCEPT, DUALCALL_PACCEPT, + DUALCALL_BIND, DUALCALL_CONNECT, DUALCALL_GETPEERNAME, DUALCALL_GETSOCKNAME, DUALCALL_LISTEN, DUALCALL_RECVFROM, DUALCALL_RECVMSG, DUALCALL_SENDTO, DUALCALL_SENDMSG, @@ -267,6 +268,7 @@ struct sysnames { } syscnames[] = { { DUALCALL_SOCKET, S(REALSOCKET), RSYS_NAME(SOCKET) }, { DUALCALL_ACCEPT, "accept", RSYS_NAME(ACCEPT) }, + { DUALCALL_PACCEPT, "paccept", RSYS_NAME(PACCEPT) }, { DUALCALL_BIND, "bind", RSYS_NAME(BIND) }, { DUALCALL_CONNECT, "connect", RSYS_NAME(CONNECT) }, { DUALCALL_GETPEERNAME, "getpeername", RSYS_NAME(GETPEERNAME) }, @@ -1334,6 +1336,35 @@ accept(int s, struct sockaddr *addr, soc return fd; } +int +paccept(int s, struct sockaddr *addr, socklen_t *addrlen, + const sigset_t * restrict sigmask, int flags) +{ + int (*op_paccept)(int, struct sockaddr *, socklen_t *, + const sigset_t * restrict, int); + int fd; + bool isrump; + + isrump = fd_isrump(s); + + DPRINTF(("paccept -> %d", s)); + if (isrump) { + op_paccept = GETSYSCALL(rump, PACCEPT); + s = fd_host2rump(s); + } else { + op_paccept = GETSYSCALL(host, PACCEPT); + } + fd = op_paccept(s, addr, addrlen, sigmask, flags); + if (fd != -1 && isrump) + fd = fd_rump2host(fd); + else + fd = fd_host2host(fd); + + DPRINTF((" <- %d\n", fd)); + + return fd; +} + /* * ioctl() and fcntl() are varargs calls and need special treatment. */