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