1 /* 2 * Copyright (c) 2004-2007 Ulrich Drepper <drepper (at) redhat.com> 3 * Copyright (c) 2004 Roland McGrath <roland (at) redhat.com> 4 * Copyright (c) 2005-2015 Dmitry V. Levin <ldv (at) altlinux.org> 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. The name of the author may not be used to endorse or promote products 16 * derived from this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 */ 29 30 #include "defs.h" 31 #include <fcntl.h> 32 #include <sys/epoll.h> 33 34 SYS_FUNC(epoll_create) 35 { 36 tprintf("%d", (int) tcp->u_arg[0]); 37 38 return RVAL_DECODED | RVAL_FD; 39 } 40 41 #include "xlat/epollflags.h" 42 43 SYS_FUNC(epoll_create1) 44 { 45 printflags(epollflags, tcp->u_arg[0], "EPOLL_???"); 46 47 return RVAL_DECODED | RVAL_FD; 48 } 49 50 #include "xlat/epollevents.h" 51 52 static bool 53 print_epoll_event(struct tcb *tcp, void *elem_buf, size_t elem_size, void *data) 54 { 55 const struct epoll_event *ev = elem_buf; 56 57 tprints("{"); 58 printflags(epollevents, ev->events, "EPOLL???"); 59 /* We cannot know what format the program uses, so print u32 and u64 60 which will cover every value. */ 61 tprintf(", {u32=%" PRIu32 ", u64=%" PRIu64 "}}", 62 ev->data.u32, ev->data.u64); 63 64 return true; 65 } 66 67 #include "xlat/epollctls.h" 68 69 SYS_FUNC(epoll_ctl) 70 { 71 printfd(tcp, tcp->u_arg[0]); 72 tprints(", "); 73 const unsigned int op = tcp->u_arg[1]; 74 printxval(epollctls, op, "EPOLL_CTL_???"); 75 tprints(", "); 76 printfd(tcp, tcp->u_arg[2]); 77 tprints(", "); 78 struct epoll_event ev; 79 if (EPOLL_CTL_DEL == op) 80 printaddr(tcp->u_arg[3]); 81 else if (!umove_or_printaddr(tcp, tcp->u_arg[3], &ev)) 82 print_epoll_event(tcp, &ev, sizeof(ev), 0); 83 84 return RVAL_DECODED; 85 } 86 87 static void 88 epoll_wait_common(struct tcb *tcp) 89 { 90 if (entering(tcp)) { 91 printfd(tcp, tcp->u_arg[0]); 92 tprints(", "); 93 } else { 94 struct epoll_event ev; 95 print_array(tcp, tcp->u_arg[1], tcp->u_rval, &ev, sizeof(ev), 96 umoven_or_printaddr, print_epoll_event, 0); 97 tprintf(", %d, %d", (int) tcp->u_arg[2], (int) tcp->u_arg[3]); 98 } 99 } 100 101 SYS_FUNC(epoll_wait) 102 { 103 epoll_wait_common(tcp); 104 return 0; 105 } 106 107 SYS_FUNC(epoll_pwait) 108 { 109 epoll_wait_common(tcp); 110 if (exiting(tcp)) { 111 tprints(", "); 112 /* NB: kernel requires arg[5] == NSIG_BYTES */ 113 print_sigset_addr_len(tcp, tcp->u_arg[4], tcp->u_arg[5]); 114 tprintf(", %" PRI_klu, tcp->u_arg[5]); 115 } 116 return 0; 117 } 118