Skip to content

Commit 7555098

Browse files
authored
Merge pull request #878 from liujinhui-job/add-accept4-for-ld-preload-mode
add accept4 support, and LINUX_SOCK_CLOEXEC/LINUX_SOCK_NONBLOCK support for ff_socket
2 parents dd83e33 + 753fdb9 commit 7555098

File tree

5 files changed

+112
-5
lines changed

5 files changed

+112
-5
lines changed

adapter/syscall/ff_hook_syscall.c

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ static __thread struct ff_getsockname_args *getsockname_args = NULL;
6666
static __thread struct ff_getpeername_args *getpeername_args = NULL;
6767
static __thread struct ff_setsockopt_args *setsockopt_args = NULL;
6868
static __thread struct ff_accept_args *accept_args = NULL;
69+
static __thread struct ff_accept4_args *accept4_args = NULL;
6970
static __thread struct ff_connect_args *connect_args = NULL;
7071
static __thread struct ff_recvfrom_args *recvfrom_args = NULL;
7172
static __thread struct ff_recvmsg_args *recvmsg_args = NULL;
@@ -680,8 +681,62 @@ ff_hook_accept4(int fd, struct sockaddr *addr,
680681

681682
CHECK_FD_OWNERSHIP(accept4, (fd, addr, addrlen, flags));
682683

683-
errno = ENOSYS;
684-
return -1;
684+
DEFINE_REQ_ARGS_STATIC(accept4);
685+
static __thread struct sockaddr *sh_addr = NULL;
686+
static __thread socklen_t sh_addr_len = 0;
687+
static __thread socklen_t *sh_addrlen = NULL;
688+
689+
if (addr != NULL) {
690+
if (sh_addr == NULL || sh_addr_len < *addrlen) {
691+
if(sh_addr) {
692+
share_mem_free(sh_addr);
693+
}
694+
695+
sh_addr_len = *addrlen;
696+
sh_addr = share_mem_alloc(sh_addr_len);
697+
if (sh_addr == NULL) {
698+
RETURN_ERROR_NOFREE(ENOMEM);
699+
}
700+
}
701+
702+
if (sh_addrlen == NULL) {
703+
sh_addrlen = share_mem_alloc(sizeof(socklen_t));
704+
if (sh_addrlen == NULL) {
705+
//share_mem_free(sh_addr); // Don't free
706+
RETURN_ERROR_NOFREE(ENOMEM);
707+
}
708+
}
709+
*sh_addrlen = *addrlen;
710+
711+
args->addr = sh_addr;
712+
args->addrlen = sh_addrlen;
713+
args->flags = flags;
714+
}else {
715+
args->addr = NULL;
716+
args->addrlen = NULL;
717+
args->flags = flags;
718+
}
719+
720+
args->fd = fd;
721+
722+
SYSCALL(FF_SO_ACCEPT4, args);
723+
724+
if (ret > 0) {
725+
ret = convert_fstack_fd(ret);
726+
}
727+
728+
if (addr) {
729+
if (ret > 0) {
730+
socklen_t cplen = *sh_addrlen > *addrlen ?
731+
*addrlen : *sh_addrlen;
732+
rte_memcpy(addr, sh_addr, cplen);
733+
*addrlen = *sh_addrlen;
734+
}
735+
//share_mem_free(sh_addr); // Don't free
736+
//share_mem_free(sh_addrlen);
737+
}
738+
739+
RETURN_NOFREE();
685740
}
686741

687742
int

adapter/syscall/ff_socket_ops.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,8 +186,7 @@ ff_sys_accept(struct ff_accept_args *args)
186186
static int
187187
ff_sys_accept4(struct ff_accept4_args *args)
188188
{
189-
errno = ENOSYS;
190-
return -1;
189+
return ff_accept4(args->fd, args->addr, args->addrlen, args->flags);
191190
}
192191

193192
static int

lib/ff_api.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ int ff_getsockopt(int s, int level, int optname, void *optval,
8888
int ff_listen(int s, int backlog);
8989
int ff_bind(int s, const struct linux_sockaddr *addr, socklen_t addrlen);
9090
int ff_accept(int s, struct linux_sockaddr *addr, socklen_t *addrlen);
91+
int ff_accept4(int s, struct linux_sockaddr *addr, socklen_t *addrlen, int flags);
9192
int ff_connect(int s, const struct linux_sockaddr *name, socklen_t namelen);
9293
int ff_close(int fd);
9394
int ff_shutdown(int s, int how);

lib/ff_api.symlist

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ ff_fcntl
2121
ff_socketpair
2222
ff_poll
2323
ff_accept
24+
ff_accept4
2425
ff_listen
2526
ff_bind
2627
ff_connect

lib/ff_syscall_wrapper.c

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,11 @@
208208

209209
/* af define end */
210210

211+
/* Flags for socket, socketpair, accept4 */
212+
213+
#define LINUX_SOCK_CLOEXEC LINUX_O_CLOEXEC
214+
#define LINUX_SOCK_NONBLOCK LINUX_O_NONBLOCK
215+
211216
/* msghdr define start */
212217

213218
static /*__thread*/ struct iovec msg_iov_tmp[UIO_MAXIOV];
@@ -655,6 +660,20 @@ linux2freebsd_opt(int level, int optname)
655660
}
656661
}
657662

663+
static int
664+
linux2freebsd_socket_flags(int flags)
665+
{
666+
if (flags & LINUX_SOCK_NONBLOCK) {
667+
flags &= ~LINUX_SOCK_NONBLOCK;
668+
flags |= SOCK_NONBLOCK;
669+
}
670+
if (flags & LINUX_SOCK_CLOEXEC) {
671+
flags &= ~LINUX_SOCK_CLOEXEC;
672+
flags |= SOCK_CLOEXEC;
673+
}
674+
return flags;
675+
}
676+
658677
static void
659678
linux2freebsd_sockaddr(const struct linux_sockaddr *linux,
660679
socklen_t addrlen, struct sockaddr *freebsd)
@@ -880,7 +899,7 @@ ff_socket(int domain, int type, int protocol)
880899
int rc;
881900
struct socket_args sa;
882901
sa.domain = domain == LINUX_AF_INET6 ? AF_INET6 : domain;
883-
sa.type = type;
902+
sa.type = linux2freebsd_socket_flags(type);
884903
sa.protocol = protocol;
885904
if ((rc = sys_socket(curthread, &sa)))
886905
goto kern_fail;
@@ -1352,6 +1371,38 @@ ff_accept(int s, struct linux_sockaddr * addr,
13521371
return (-1);
13531372
}
13541373

1374+
int
1375+
ff_accept4(int s, struct linux_sockaddr * addr,
1376+
socklen_t * addrlen, int flags)
1377+
{
1378+
int rc;
1379+
struct file *fp;
1380+
struct sockaddr *pf = NULL;
1381+
socklen_t socklen = sizeof(struct sockaddr_storage);
1382+
1383+
if ((rc = kern_accept4(curthread, s, &pf, &socklen, linux2freebsd_socket_flags(flags), &fp)))
1384+
goto kern_fail;
1385+
1386+
rc = curthread->td_retval[0];
1387+
fdrop(fp, curthread);
1388+
1389+
if (addr && pf)
1390+
freebsd2linux_sockaddr(addr, pf);
1391+
1392+
if (addrlen)
1393+
*addrlen = pf->sa_len;
1394+
1395+
if(pf != NULL)
1396+
free(pf, M_SONAME);
1397+
return (rc);
1398+
1399+
kern_fail:
1400+
if(pf != NULL)
1401+
free(pf, M_SONAME);
1402+
ff_os_errno(rc);
1403+
return (-1);
1404+
}
1405+
13551406
int
13561407
ff_listen(int s, int backlog)
13571408
{

0 commit comments

Comments
 (0)