]> granicus.if.org Git - strace/blobdiff - ipc_shm.c
Update NEWS
[strace] / ipc_shm.c
index 4a41690a4f75c64c3c10d2dfef2544fb70026c6d..f9a053744d4083ff1777fc5df99e75b7b87906c3 100644 (file)
--- a/ipc_shm.c
+++ b/ipc_shm.c
 
 #include "defs.h"
 
-#include <sys/shm.h>
+#ifdef HAVE_SYS_SHM_H
+# include <sys/shm.h>
+#elif defined HAVE_LINUX_SHM_H
+# include <linux/shm.h>
+#endif
 
 #include "xlat/shm_resource_flags.h"
 #include "xlat/shm_flags.h"
 
 SYS_FUNC(shmget)
 {
-       if (tcp->u_arg[0])
-               tprintf("%#lx", tcp->u_arg[0]);
+       const int key = (int) tcp->u_arg[0];
+       if (key)
+               tprintf("%#x", key);
        else
                tprints("IPC_PRIVATE");
        tprintf(", %lu, ", tcp->u_arg[1]);
        if (printflags(shm_resource_flags, tcp->u_arg[2] & ~0777, NULL) != 0)
                tprints("|");
-       tprintf("%#lo", tcp->u_arg[2] & 0777);
+       print_numeric_umode_t(tcp->u_arg[2] & 0777);
        return RVAL_DECODED;
 }
 
 SYS_FUNC(shmat)
 {
        if (entering(tcp)) {
-               tprintf("%lu, ", tcp->u_arg[0]);
+               tprintf("%d, ", (int) tcp->u_arg[0]);
                if (indirect_ipccall(tcp)) {
                        printaddr(tcp->u_arg[3]);
                        tprints(", ");
@@ -68,10 +73,14 @@ SYS_FUNC(shmat)
                if (syserror(tcp))
                        return 0;
                if (indirect_ipccall(tcp)) {
-                       unsigned long raddr;
-                       if (umove(tcp, tcp->u_arg[2], &raddr) < 0)
+                       union {
+                               uint64_t r64;
+                               uint32_t r32;
+                       } u;
+                       if (umoven(tcp, tcp->u_arg[2], current_wordsize, &u) < 0)
                                return RVAL_NONE;
-                       tcp->u_rval = raddr;
+                       tcp->u_rval = (sizeof(u.r32) == current_wordsize)
+                                     ? u.r32 : u.r64;
                }
                return RVAL_HEX;
        }