From: Dmitry V. Levin Date: Sat, 1 Aug 2015 22:58:17 +0000 (+0000) Subject: desc.c: move epoll parsers to a separate file X-Git-Tag: v4.11~298 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=aba868c6c40974ddbb097a45be2dbc1bbce7a67e;p=strace desc.c: move epoll parsers to a separate file * epoll.c: New file. * Makefile.am (strace_SOURCES): Add it. * desc.c (sys_epoll_create1, print_epoll_event, sys_epoll_ctl, print_epoll_event_array, epoll_wait_common, epoll_wait, epoll_pwait): Move to epoll.c. --- diff --git a/Makefile.am b/Makefile.am index 9ae16d21..5837782e 100644 --- a/Makefile.am +++ b/Makefile.am @@ -42,6 +42,7 @@ strace_SOURCES = \ count.c \ desc.c \ dirent.c \ + epoll.c \ evdev.c \ eventfd.c \ execve.c \ diff --git a/desc.c b/desc.c index e4e22bc5..91b2be93 100644 --- a/desc.c +++ b/desc.c @@ -31,9 +31,6 @@ #include "defs.h" #include #include -#ifdef HAVE_SYS_EPOLL_H -# include -#endif #include "xlat/fcntlcmds.h" #include "xlat/fdflags.h" @@ -435,113 +432,6 @@ SYS_FUNC(osf_select) } #endif -#include "xlat/epollctls.h" -#include "xlat/epollevents.h" -#include "xlat/epollflags.h" - -SYS_FUNC(epoll_create1) -{ - printflags(epollflags, tcp->u_arg[0], "EPOLL_???"); - - return RVAL_DECODED; -} - -#ifdef HAVE_SYS_EPOLL_H -static void -print_epoll_event(struct epoll_event *ev) -{ - tprints("{"); - printflags(epollevents, ev->events, "EPOLL???"); - /* We cannot know what format the program uses, so print u32 and u64 - which will cover every value. */ - tprintf(", {u32=%" PRIu32 ", u64=%" PRIu64 "}}", - ev->data.u32, ev->data.u64); -} -#endif - -SYS_FUNC(epoll_ctl) -{ - struct epoll_event ev; - - printfd(tcp, tcp->u_arg[0]); - tprints(", "); - printxval(epollctls, tcp->u_arg[1], "EPOLL_CTL_???"); - tprints(", "); - printfd(tcp, tcp->u_arg[2]); - tprints(", "); -#ifdef HAVE_SYS_EPOLL_H - if (EPOLL_CTL_DEL == tcp->u_arg[1]) - printaddr(tcp->u_arg[3]); - else if (!umove_or_printaddr(tcp, tcp->u_arg[3], &ev)) - print_epoll_event(&ev); -#else - printaddr(tcp->u_arg[3]); -#endif - - return RVAL_DECODED; -} - -static void -print_epoll_event_array(struct tcb *tcp, const long addr, const long len) -{ -#ifdef HAVE_SYS_EPOLL_H - struct epoll_event ev, *start, *cur, *end; - - if (!len) { - tprints("[]"); - return; - } - - if (umove_or_printaddr(tcp, addr, &ev)) - return; - - tprints("["); - print_epoll_event(&ev); - - start = (struct epoll_event *) addr; - end = start + len; - for (cur = start + 1; cur < end; ++cur) { - tprints(", "); - if (umove_or_printaddr(tcp, (long) cur, &ev)) - break; - print_epoll_event(&ev); - } - tprints("]"); -#else - printaddr(addr); -#endif -} - -static void -epoll_wait_common(struct tcb *tcp) -{ - if (entering(tcp)) { - printfd(tcp, tcp->u_arg[0]); - tprints(", "); - } else { - print_epoll_event_array(tcp, tcp->u_arg[1], tcp->u_rval); - tprintf(", %d, %d", (int) tcp->u_arg[2], (int) tcp->u_arg[3]); - } -} - -SYS_FUNC(epoll_wait) -{ - epoll_wait_common(tcp); - return 0; -} - -SYS_FUNC(epoll_pwait) -{ - epoll_wait_common(tcp); - if (exiting(tcp)) { - tprints(", "); - /* NB: kernel requires arg[5] == NSIG / 8 */ - print_sigset_addr_len(tcp, tcp->u_arg[4], tcp->u_arg[5]); - tprintf(", %lu", tcp->u_arg[5]); - } - return 0; -} - SYS_FUNC(select) { return decode_select(tcp, tcp->u_arg, BITNESS_CURRENT); diff --git a/epoll.c b/epoll.c new file mode 100644 index 00000000..28e3a5b6 --- /dev/null +++ b/epoll.c @@ -0,0 +1,114 @@ +#include "defs.h" +#include +#ifdef HAVE_SYS_EPOLL_H +# include +#endif + +#include "xlat/epollflags.h" + +SYS_FUNC(epoll_create1) +{ + printflags(epollflags, tcp->u_arg[0], "EPOLL_???"); + + return RVAL_DECODED; +} + +#ifdef HAVE_SYS_EPOLL_H +# include "xlat/epollevents.h" + +static void +print_epoll_event(struct epoll_event *ev) +{ + tprints("{"); + printflags(epollevents, ev->events, "EPOLL???"); + /* We cannot know what format the program uses, so print u32 and u64 + which will cover every value. */ + tprintf(", {u32=%" PRIu32 ", u64=%" PRIu64 "}}", + ev->data.u32, ev->data.u64); +} +#endif + +#include "xlat/epollctls.h" + +SYS_FUNC(epoll_ctl) +{ + struct epoll_event ev; + + printfd(tcp, tcp->u_arg[0]); + tprints(", "); + printxval(epollctls, tcp->u_arg[1], "EPOLL_CTL_???"); + tprints(", "); + printfd(tcp, tcp->u_arg[2]); + tprints(", "); +#ifdef HAVE_SYS_EPOLL_H + if (EPOLL_CTL_DEL == tcp->u_arg[1]) + printaddr(tcp->u_arg[3]); + else if (!umove_or_printaddr(tcp, tcp->u_arg[3], &ev)) + print_epoll_event(&ev); +#else + printaddr(tcp->u_arg[3]); +#endif + + return RVAL_DECODED; +} + +static void +print_epoll_event_array(struct tcb *tcp, const long addr, const long len) +{ +#ifdef HAVE_SYS_EPOLL_H + struct epoll_event ev, *start, *cur, *end; + + if (!len) { + tprints("[]"); + return; + } + + if (umove_or_printaddr(tcp, addr, &ev)) + return; + + tprints("["); + print_epoll_event(&ev); + + start = (struct epoll_event *) addr; + end = start + len; + for (cur = start + 1; cur < end; ++cur) { + tprints(", "); + if (umove_or_printaddr(tcp, (long) cur, &ev)) + break; + print_epoll_event(&ev); + } + tprints("]"); +#else + printaddr(addr); +#endif +} + +static void +epoll_wait_common(struct tcb *tcp) +{ + if (entering(tcp)) { + printfd(tcp, tcp->u_arg[0]); + tprints(", "); + } else { + print_epoll_event_array(tcp, tcp->u_arg[1], tcp->u_rval); + tprintf(", %d, %d", (int) tcp->u_arg[2], (int) tcp->u_arg[3]); + } +} + +SYS_FUNC(epoll_wait) +{ + epoll_wait_common(tcp); + return 0; +} + +SYS_FUNC(epoll_pwait) +{ + epoll_wait_common(tcp); + if (exiting(tcp)) { + tprints(", "); + /* NB: kernel requires arg[5] == NSIG / 8 */ + print_sigset_addr_len(tcp, tcp->u_arg[4], tcp->u_arg[5]); + tprintf(", %lu", tcp->u_arg[5]); + } + return 0; +}