From 705ff10c0b9c07b9b51fc2f2bc6f3e6412f6ed9c Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Fri, 14 Aug 2009 12:34:05 +0200 Subject: [PATCH] Replace x86-64 paccept with accept4 This patch changes the paccept syscall to accept4 for x86-64, since the former was dropped in Linux kernel commit v2.6.27-rc7-14-g2d4c826. At the same time, it adds support for pretty printing its arguments. * linux/x86_64/syscallent.h: Replace paccept with accept4, hook in sys_accept4. * net.c (sys_accept): Leave a small stub calling the new... (do_accept): ... function, which also adds a flags_arg argument. (sys_accept4): New. --- linux/syscall.h | 2 +- linux/x86_64/syscallent.h | 2 +- net.c | 28 ++++++++++++++++++++++++---- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/linux/syscall.h b/linux/syscall.h index 60df9345..b373ec88 100644 --- a/linux/syscall.h +++ b/linux/syscall.h @@ -109,7 +109,7 @@ int sys_signalfd4(), sys_eventfd2(), sys_epoll_create1(), sys_dup3(), sys_pipe2( /* sys_socketcall subcalls */ -int sys_socket(), sys_bind(), sys_connect(), sys_listen(); +int sys_socket(), sys_bind(), sys_connect(), sys_listen(), sys_accept4(); int sys_accept(), sys_getsockname(), sys_getpeername(), sys_socketpair(); int sys_send(), sys_recv(), sys_sendto(), sys_recvfrom(); int sys_shutdown(), sys_setsockopt(), sys_getsockopt(); diff --git a/linux/x86_64/syscallent.h b/linux/x86_64/syscallent.h index fd18715e..a941dcb1 100644 --- a/linux/x86_64/syscallent.h +++ b/linux/x86_64/syscallent.h @@ -286,7 +286,7 @@ { 6, TF, sys_fallocate, "fallocate" }, /* 285 */ { 4, TD, sys_timerfd_settime, "timerfd_settime"}, /* 286 */ { 2, TD, sys_timerfd_gettime, "timerfd_gettime"}, /* 287 */ - { 6, TN, printargs, "paccept" }, /* 288 */ + { 4, TN, sys_accept4, "accept4" }, /* 288 */ { 4, TD|TS, sys_signalfd4, "signalfd4" }, /* 289 */ { 2, TD, sys_eventfd2, "eventfd2" }, /* 290 */ { 1, 0, sys_epoll_create1, "epoll_create1" }, /* 291 */ diff --git a/net.c b/net.c index 97592681..9d2b9f9e 100644 --- a/net.c +++ b/net.c @@ -1303,13 +1303,14 @@ struct tcb *tcp; return 0; } -int -sys_accept(tcp) -struct tcb *tcp; +static int +do_accept(struct tcb *tcp, int flags_arg) { if (entering(tcp)) { tprintf("%ld, ", tcp->u_arg[0]); - } else if (!tcp->u_arg[2]) + return 0; + } + if (!tcp->u_arg[2]) tprintf("%#lx, NULL", tcp->u_arg[1]); else { int len; @@ -1322,9 +1323,28 @@ struct tcb *tcp; tprintf(", "); printnum_int(tcp, tcp->u_arg[2], "%u"); } + if (flags_arg >= 0) { + tprintf(", "); + printflags(sock_type_flags, tcp->u_arg[flags_arg], + "SOCK_???"); + } return 0; } +int +sys_accept(struct tcb *tcp) +{ + return do_accept(tcp, -1); +} + +#ifdef LINUX +int +sys_accept4(struct tcb *tcp) +{ + return do_accept(tcp, 3); +} +#endif + int sys_send(tcp) struct tcb *tcp; -- 2.50.1