xref: /aosp_15_r20/external/AFLplusplus/include/android-ashmem.h (revision 08b48e0b10e97b33e7b60c5b6e2243bd915777f2)
1*08b48e0bSAndroid Build Coastguard Worker #ifdef __ANDROID__
2*08b48e0bSAndroid Build Coastguard Worker   #ifndef _ANDROID_ASHMEM_H
3*08b48e0bSAndroid Build Coastguard Worker     #define _ANDROID_ASHMEM_H
4*08b48e0bSAndroid Build Coastguard Worker 
5*08b48e0bSAndroid Build Coastguard Worker     #ifndef _GNU_SOURCE
6*08b48e0bSAndroid Build Coastguard Worker       #define _GNU_SOURCE
7*08b48e0bSAndroid Build Coastguard Worker     #endif
8*08b48e0bSAndroid Build Coastguard Worker     #include <sys/syscall.h>
9*08b48e0bSAndroid Build Coastguard Worker     #include <unistd.h>
10*08b48e0bSAndroid Build Coastguard Worker     #include <fcntl.h>
11*08b48e0bSAndroid Build Coastguard Worker     #include <linux/ashmem.h>
12*08b48e0bSAndroid Build Coastguard Worker     #include <sys/ioctl.h>
13*08b48e0bSAndroid Build Coastguard Worker     #include <sys/mman.h>
14*08b48e0bSAndroid Build Coastguard Worker     #include <sys/shm.h>
15*08b48e0bSAndroid Build Coastguard Worker     #include <stdio.h>
16*08b48e0bSAndroid Build Coastguard Worker     #define ASHMEM_DEVICE "/dev/ashmem"
17*08b48e0bSAndroid Build Coastguard Worker 
shmdt(const void * address)18*08b48e0bSAndroid Build Coastguard Worker int shmdt(const void *address) {
19*08b48e0bSAndroid Build Coastguard Worker 
20*08b48e0bSAndroid Build Coastguard Worker     #if defined(SYS_shmdt)
21*08b48e0bSAndroid Build Coastguard Worker   return syscall(SYS_shmdt, address);
22*08b48e0bSAndroid Build Coastguard Worker     #else
23*08b48e0bSAndroid Build Coastguard Worker   return syscall(SYS_ipc, SHMDT, 0, 0, 0, address, 0);
24*08b48e0bSAndroid Build Coastguard Worker     #endif
25*08b48e0bSAndroid Build Coastguard Worker 
26*08b48e0bSAndroid Build Coastguard Worker }
27*08b48e0bSAndroid Build Coastguard Worker 
shmctl(int __shmid,int __cmd,struct shmid_ds * __buf)28*08b48e0bSAndroid Build Coastguard Worker int shmctl(int __shmid, int __cmd, struct shmid_ds *__buf) {
29*08b48e0bSAndroid Build Coastguard Worker 
30*08b48e0bSAndroid Build Coastguard Worker   int ret = 0;
31*08b48e0bSAndroid Build Coastguard Worker   if (__cmd == IPC_RMID) {
32*08b48e0bSAndroid Build Coastguard Worker 
33*08b48e0bSAndroid Build Coastguard Worker     int               length = ioctl(__shmid, ASHMEM_GET_SIZE, NULL);
34*08b48e0bSAndroid Build Coastguard Worker     struct ashmem_pin pin = {0, length};
35*08b48e0bSAndroid Build Coastguard Worker     ret = ioctl(__shmid, ASHMEM_UNPIN, &pin);
36*08b48e0bSAndroid Build Coastguard Worker     close(__shmid);
37*08b48e0bSAndroid Build Coastguard Worker 
38*08b48e0bSAndroid Build Coastguard Worker   }
39*08b48e0bSAndroid Build Coastguard Worker 
40*08b48e0bSAndroid Build Coastguard Worker   return ret;
41*08b48e0bSAndroid Build Coastguard Worker 
42*08b48e0bSAndroid Build Coastguard Worker }
43*08b48e0bSAndroid Build Coastguard Worker 
shmget(key_t __key,size_t __size,int __shmflg)44*08b48e0bSAndroid Build Coastguard Worker int shmget(key_t __key, size_t __size, int __shmflg) {
45*08b48e0bSAndroid Build Coastguard Worker 
46*08b48e0bSAndroid Build Coastguard Worker   (void)__shmflg;
47*08b48e0bSAndroid Build Coastguard Worker   int  fd, ret;
48*08b48e0bSAndroid Build Coastguard Worker   char ourkey[11];
49*08b48e0bSAndroid Build Coastguard Worker 
50*08b48e0bSAndroid Build Coastguard Worker   fd = open(ASHMEM_DEVICE, O_RDWR);
51*08b48e0bSAndroid Build Coastguard Worker   if (fd < 0) return fd;
52*08b48e0bSAndroid Build Coastguard Worker 
53*08b48e0bSAndroid Build Coastguard Worker   sprintf(ourkey, "%d", __key);
54*08b48e0bSAndroid Build Coastguard Worker   ret = ioctl(fd, ASHMEM_SET_NAME, ourkey);
55*08b48e0bSAndroid Build Coastguard Worker   if (ret < 0) goto error;
56*08b48e0bSAndroid Build Coastguard Worker 
57*08b48e0bSAndroid Build Coastguard Worker   ret = ioctl(fd, ASHMEM_SET_SIZE, __size);
58*08b48e0bSAndroid Build Coastguard Worker   if (ret < 0) goto error;
59*08b48e0bSAndroid Build Coastguard Worker 
60*08b48e0bSAndroid Build Coastguard Worker   return fd;
61*08b48e0bSAndroid Build Coastguard Worker 
62*08b48e0bSAndroid Build Coastguard Worker error:
63*08b48e0bSAndroid Build Coastguard Worker   close(fd);
64*08b48e0bSAndroid Build Coastguard Worker   return ret;
65*08b48e0bSAndroid Build Coastguard Worker 
66*08b48e0bSAndroid Build Coastguard Worker }
67*08b48e0bSAndroid Build Coastguard Worker 
shmat(int __shmid,const void * __shmaddr,int __shmflg)68*08b48e0bSAndroid Build Coastguard Worker void *shmat(int __shmid, const void *__shmaddr, int __shmflg) {
69*08b48e0bSAndroid Build Coastguard Worker 
70*08b48e0bSAndroid Build Coastguard Worker   (void)__shmflg;
71*08b48e0bSAndroid Build Coastguard Worker   int   size;
72*08b48e0bSAndroid Build Coastguard Worker   void *ptr;
73*08b48e0bSAndroid Build Coastguard Worker 
74*08b48e0bSAndroid Build Coastguard Worker   size = ioctl(__shmid, ASHMEM_GET_SIZE, NULL);
75*08b48e0bSAndroid Build Coastguard Worker   if (size < 0) { return NULL; }
76*08b48e0bSAndroid Build Coastguard Worker 
77*08b48e0bSAndroid Build Coastguard Worker   ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, __shmid, 0);
78*08b48e0bSAndroid Build Coastguard Worker   if (ptr == MAP_FAILED) { return NULL; }
79*08b48e0bSAndroid Build Coastguard Worker 
80*08b48e0bSAndroid Build Coastguard Worker   return ptr;
81*08b48e0bSAndroid Build Coastguard Worker 
82*08b48e0bSAndroid Build Coastguard Worker }
83*08b48e0bSAndroid Build Coastguard Worker 
84*08b48e0bSAndroid Build Coastguard Worker   #endif                                              /* !_ANDROID_ASHMEM_H */
85*08b48e0bSAndroid Build Coastguard Worker #endif                                                      /* !__ANDROID__ */
86*08b48e0bSAndroid Build Coastguard Worker 
87