1/* 2 * Copyright (c) 1993 Ulrich Pegelow <pegelow@moorea.uni-muenster.de> 3 * Copyright (c) 1993 Branko Lankester <branko@hacktic.nl> 4 * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com> 5 * Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl> 6 * Copyright (c) 2003-2006 Roland McGrath <roland@redhat.com> 7 * Copyright (c) 2006-2015 Dmitry V. Levin <ldv@altlinux.org> 8 * Copyright (c) 2015-2017 The strace developers. 9 * All rights reserved. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 3. The name of the author may not be used to endorse or promote products 20 * derived from this software without specific prior written permission. 21 * 22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 23 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 24 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 25 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 27 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 31 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 */ 33 34#include "defs.h" 35#include "ipc_defs.h" 36 37#ifdef HAVE_SYS_MSG_H 38# include <sys/msg.h> 39#elif defined HAVE_LINUX_MSG_H 40# include <linux/msg.h> 41#endif 42 43#include "xlat/ipc_msg_flags.h" 44#include "xlat/resource_flags.h" 45 46SYS_FUNC(msgget) 47{ 48 const int key = (int) tcp->u_arg[0]; 49 if (key) 50 tprintf("%#x", key); 51 else 52 tprints("IPC_PRIVATE"); 53 tprints(", "); 54 if (printflags(resource_flags, tcp->u_arg[1] & ~0777, NULL) != 0) 55 tprints("|"); 56 print_numeric_umode_t(tcp->u_arg[1] & 0777); 57 return RVAL_DECODED; 58} 59 60static void 61tprint_msgsnd(struct tcb *const tcp, const kernel_ulong_t addr, 62 const kernel_ulong_t count, const unsigned int flags) 63{ 64 tprint_msgbuf(tcp, addr, count); 65 printflags(ipc_msg_flags, flags, "MSG_???"); 66} 67 68SYS_FUNC(msgsnd) 69{ 70 tprintf("%d, ", (int) tcp->u_arg[0]); 71 if (indirect_ipccall(tcp)) { 72 tprint_msgsnd(tcp, tcp->u_arg[3], tcp->u_arg[1], 73 tcp->u_arg[2]); 74 } else { 75 tprint_msgsnd(tcp, tcp->u_arg[1], tcp->u_arg[2], 76 tcp->u_arg[3]); 77 } 78 return RVAL_DECODED; 79} 80 81static void 82tprint_msgrcv(struct tcb *const tcp, const kernel_ulong_t addr, 83 const kernel_ulong_t count, const kernel_ulong_t msgtyp) 84{ 85 tprint_msgbuf(tcp, addr, count); 86 tprintf("%" PRI_kld ", ", msgtyp); 87} 88 89static int 90fetch_msgrcv_args(struct tcb *const tcp, const kernel_ulong_t addr, 91 kernel_ulong_t *const pair) 92{ 93 if (current_wordsize == sizeof(*pair)) { 94 if (umoven_or_printaddr(tcp, addr, 2 * sizeof(*pair), pair)) 95 return -1; 96 } else { 97 unsigned int tmp[2]; 98 99 if (umove_or_printaddr(tcp, addr, &tmp)) 100 return -1; 101 pair[0] = tmp[0]; 102 pair[1] = tmp[1]; 103 } 104 return 0; 105} 106 107SYS_FUNC(msgrcv) 108{ 109 if (entering(tcp)) { 110 tprintf("%d, ", (int) tcp->u_arg[0]); 111 } else { 112 if (indirect_ipccall(tcp)) { 113 const bool direct = 114#ifdef SPARC64 115 current_wordsize == 8 || 116#endif 117 get_tcb_priv_ulong(tcp) != 0; 118 if (direct) { 119 tprint_msgrcv(tcp, tcp->u_arg[3], 120 tcp->u_arg[1], tcp->u_arg[4]); 121 } else { 122 kernel_ulong_t pair[2]; 123 124 if (fetch_msgrcv_args(tcp, tcp->u_arg[3], pair)) 125 tprintf(", %" PRI_klu ", ", tcp->u_arg[1]); 126 else 127 tprint_msgrcv(tcp, pair[0], 128 tcp->u_arg[1], pair[1]); 129 } 130 printflags(ipc_msg_flags, tcp->u_arg[2], "MSG_???"); 131 } else { 132 tprint_msgrcv(tcp, tcp->u_arg[1], 133 tcp->u_arg[2], tcp->u_arg[3]); 134 printflags(ipc_msg_flags, tcp->u_arg[4], "MSG_???"); 135 } 136 } 137 return 0; 138} 139