about summary refs log tree commit diff stats
path: root/src/wrapped32/wrappedlibc.c
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-12-09 13:06:50 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-12-09 13:06:50 +0100
commit3eeb10c0a60ea0106d6201dda80fd771f3d4e17a (patch)
treea6f39e7596c301e50a7f0baf95ca499f1d2a0080 /src/wrapped32/wrappedlibc.c
parentce3d2afad282195508f93c221fe3342a59846061 (diff)
downloadbox64-3eeb10c0a60ea0106d6201dda80fd771f3d4e17a.tar.gz
box64-3eeb10c0a60ea0106d6201dda80fd771f3d4e17a.zip
[BOX32][WRAPPER] Better wrapping for shmat
Diffstat (limited to 'src/wrapped32/wrappedlibc.c')
-rwxr-xr-xsrc/wrapped32/wrappedlibc.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/wrapped32/wrappedlibc.c b/src/wrapped32/wrappedlibc.c
index e4bfbaf8..49bd525c 100755
--- a/src/wrapped32/wrappedlibc.c
+++ b/src/wrapped32/wrappedlibc.c
@@ -40,6 +40,8 @@
 #include <sys/sysinfo.h>
 #include <sys/time.h>
 #include <regex.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
 
 #include "wrappedlibs.h"
 
@@ -3138,6 +3140,31 @@ EXPORT void my32_regfree(x64emu_t* emu, void* p)
     regfree(&p_l);
 }
 
+EXPORT void* my32_shmat(x64emu_t*emu, int shmid, void* shmaddr, int flags)
+{
+    size_t sz = 0;
+    {
+        // get the size of the shmmemory
+        struct shmid_ds ds = {0};
+        if(shmctl(shmid, IPC_STAT, &ds)>=0)
+            sz = ds.shm_segsz;
+    }
+    if(!shmaddr) {
+        shmaddr = find31bitBlockNearHint(shmaddr, sz, 0);
+    }
+    void* ret = shmat(shmid, shmaddr, flags);
+    /*if(ret!=MAP_FAILED) {
+        would need to keep size somewhere, there is no way to get it back when doing shmdt
+        setProtection_mmap(ret, sz, (flags&SHM_RDONLY)?PROT_READ:(PROT_READ|PROT_WRITE));
+    }*/
+    return ret;
+}
+
+EXPORT int my32_shmdt(x64emu_t* emu, void* addr)
+{
+    return shmdt(addr);
+}
+
 #if 0
 #ifndef __NR_memfd_create
 #define MFD_CLOEXEC		    0x0001U