*/
#include "defs.h"
-#include "ipc_defs.h"
-#include <sys/msg.h>
#include DEF_MPERS_TYPE(msqid_ds_t)
+
+#include "ipc_defs.h"
+
+#ifdef HAVE_SYS_MSG_H
+/* The C library generally exports the struct the current kernel expects. */
+# include <sys/msg.h>
typedef struct msqid_ds msqid_ds_t;
+#elif defined HAVE_LINUX_MSG_H
+/* The linux header might provide the right struct. */
+# include <linux/msg.h>
+typedef struct msqid64_ds msqid_ds_t;
+#endif
+
#include MPERS_DEFS
#include "xlat/msgctl_flags.h"
static void
-print_msqid_ds(struct tcb *tcp, const long addr, int cmd)
+print_msqid_ds(struct tcb *const tcp, const kernel_ureg_t addr, int cmd)
{
+ /* TODO: We don't properly decode old compat ipc calls. */
if (cmd & IPC_64)
cmd &= ~IPC_64;
msqid_ds_t msqid_ds;
printuid("uid=", msqid_ds.msg_perm.uid);
printuid(", gid=", msqid_ds.msg_perm.gid);
tprints(", mode=");
- tprints(sprintmode(msqid_ds.msg_perm.mode));
+ print_numeric_umode_t(msqid_ds.msg_perm.mode);
if (cmd != IPC_STAT) {
tprints("}, ...}");
SYS_FUNC(msgctl)
{
if (entering(tcp)) {
- tprintf("%lu, ", tcp->u_arg[0]);
+ tprintf("%d, ", (int) tcp->u_arg[0]);
PRINTCTL(msgctl_flags, tcp->u_arg[1], "MSG_???");
tprints(", ");
} else {
- const long addr = tcp->u_arg[indirect_ipccall(tcp) ? 3 : 2];
+ const kernel_ureg_t addr = tcp->u_arg[indirect_ipccall(tcp) ? 3 : 2];
print_msqid_ds(tcp, addr, tcp->u_arg[1]);
}
return 0;