1*cf84ac9aSAndroid Build Coastguard Worker #include "tests.h"
2*cf84ac9aSAndroid Build Coastguard Worker #include <stdio.h>
3*cf84ac9aSAndroid Build Coastguard Worker #include <stdlib.h>
4*cf84ac9aSAndroid Build Coastguard Worker #include <sys/shm.h>
5*cf84ac9aSAndroid Build Coastguard Worker
6*cf84ac9aSAndroid Build Coastguard Worker static int id = -1;
7*cf84ac9aSAndroid Build Coastguard Worker
8*cf84ac9aSAndroid Build Coastguard Worker static void
cleanup(void)9*cf84ac9aSAndroid Build Coastguard Worker cleanup(void)
10*cf84ac9aSAndroid Build Coastguard Worker {
11*cf84ac9aSAndroid Build Coastguard Worker shmctl(id, IPC_RMID, NULL);
12*cf84ac9aSAndroid Build Coastguard Worker id = -1;
13*cf84ac9aSAndroid Build Coastguard Worker }
14*cf84ac9aSAndroid Build Coastguard Worker
15*cf84ac9aSAndroid Build Coastguard Worker #ifdef __alpha__
16*cf84ac9aSAndroid Build Coastguard Worker # define SHMAT "osf_shmat"
17*cf84ac9aSAndroid Build Coastguard Worker #else
18*cf84ac9aSAndroid Build Coastguard Worker # define SHMAT "shmat"
19*cf84ac9aSAndroid Build Coastguard Worker #endif
20*cf84ac9aSAndroid Build Coastguard Worker
21*cf84ac9aSAndroid Build Coastguard Worker #ifndef SHM_EXEC
22*cf84ac9aSAndroid Build Coastguard Worker # define SHM_EXEC 0100000
23*cf84ac9aSAndroid Build Coastguard Worker #endif
24*cf84ac9aSAndroid Build Coastguard Worker
25*cf84ac9aSAndroid Build Coastguard Worker int
main(void)26*cf84ac9aSAndroid Build Coastguard Worker main(void)
27*cf84ac9aSAndroid Build Coastguard Worker {
28*cf84ac9aSAndroid Build Coastguard Worker static const int bogus_shmid = 0xfdb97531;
29*cf84ac9aSAndroid Build Coastguard Worker static const void * const bogus_shmaddr =
30*cf84ac9aSAndroid Build Coastguard Worker (void *) (unsigned long) 0xdec0ded1dec0ded2ULL;
31*cf84ac9aSAndroid Build Coastguard Worker static const int bogus_shmflg = 0xffffface;
32*cf84ac9aSAndroid Build Coastguard Worker
33*cf84ac9aSAndroid Build Coastguard Worker long rc;
34*cf84ac9aSAndroid Build Coastguard Worker
35*cf84ac9aSAndroid Build Coastguard Worker id = shmget(IPC_PRIVATE, 1, 0600);
36*cf84ac9aSAndroid Build Coastguard Worker if (id < 0)
37*cf84ac9aSAndroid Build Coastguard Worker perror_msg_and_skip("shmget");
38*cf84ac9aSAndroid Build Coastguard Worker atexit(cleanup);
39*cf84ac9aSAndroid Build Coastguard Worker
40*cf84ac9aSAndroid Build Coastguard Worker rc = (long) shmat(bogus_shmid, bogus_shmaddr, bogus_shmflg);
41*cf84ac9aSAndroid Build Coastguard Worker printf("%s(%d, %p, SHM_RDONLY|SHM_RND|SHM_REMAP|SHM_EXEC|%#x) = %s\n",
42*cf84ac9aSAndroid Build Coastguard Worker SHMAT, bogus_shmid, bogus_shmaddr, bogus_shmflg & ~0xf000,
43*cf84ac9aSAndroid Build Coastguard Worker sprintrc(rc));
44*cf84ac9aSAndroid Build Coastguard Worker
45*cf84ac9aSAndroid Build Coastguard Worker shmat(id, NULL, SHM_REMAP);
46*cf84ac9aSAndroid Build Coastguard Worker printf("%s(%d, NULL, SHM_REMAP) = -1 %s (%m)\n",
47*cf84ac9aSAndroid Build Coastguard Worker SHMAT, id, errno2name());
48*cf84ac9aSAndroid Build Coastguard Worker
49*cf84ac9aSAndroid Build Coastguard Worker void *shmaddr = shmat(id, NULL, SHM_RDONLY);
50*cf84ac9aSAndroid Build Coastguard Worker if (shmaddr == (void *)(-1))
51*cf84ac9aSAndroid Build Coastguard Worker perror_msg_and_skip("shmat SHM_RDONLY");
52*cf84ac9aSAndroid Build Coastguard Worker printf("%s(%d, NULL, SHM_RDONLY) = %p\n", SHMAT, id, shmaddr);
53*cf84ac9aSAndroid Build Coastguard Worker
54*cf84ac9aSAndroid Build Coastguard Worker rc = shmdt(NULL);
55*cf84ac9aSAndroid Build Coastguard Worker printf("shmdt(NULL) = %s\n", sprintrc(rc));
56*cf84ac9aSAndroid Build Coastguard Worker
57*cf84ac9aSAndroid Build Coastguard Worker rc = shmdt(shmaddr);
58*cf84ac9aSAndroid Build Coastguard Worker printf("shmdt(%p) = %s\n", shmaddr, sprintrc(rc));
59*cf84ac9aSAndroid Build Coastguard Worker
60*cf84ac9aSAndroid Build Coastguard Worker ++shmaddr;
61*cf84ac9aSAndroid Build Coastguard Worker void *shmaddr2 = shmat(id, shmaddr, SHM_RND);
62*cf84ac9aSAndroid Build Coastguard Worker if (shmaddr2 == (void *)(-1))
63*cf84ac9aSAndroid Build Coastguard Worker printf("%s(%d, %p, SHM_RND) = -1 %s (%m)\n",
64*cf84ac9aSAndroid Build Coastguard Worker SHMAT, id, shmaddr, errno2name());
65*cf84ac9aSAndroid Build Coastguard Worker else {
66*cf84ac9aSAndroid Build Coastguard Worker printf("%s(%d, %p, SHM_RND) = %p\n",
67*cf84ac9aSAndroid Build Coastguard Worker SHMAT, id, shmaddr, shmaddr2);
68*cf84ac9aSAndroid Build Coastguard Worker rc = shmdt(shmaddr2);
69*cf84ac9aSAndroid Build Coastguard Worker printf("shmdt(%p) = %s\n", shmaddr2, sprintrc(rc));
70*cf84ac9aSAndroid Build Coastguard Worker }
71*cf84ac9aSAndroid Build Coastguard Worker
72*cf84ac9aSAndroid Build Coastguard Worker shmaddr = shmat(id, NULL, SHM_RDONLY|SHM_EXEC);
73*cf84ac9aSAndroid Build Coastguard Worker if (shmaddr == (void *)(-1))
74*cf84ac9aSAndroid Build Coastguard Worker printf("%s(%d, NULL, SHM_RDONLY|SHM_EXEC) = %s\n",
75*cf84ac9aSAndroid Build Coastguard Worker SHMAT, id, sprintrc(-1));
76*cf84ac9aSAndroid Build Coastguard Worker else {
77*cf84ac9aSAndroid Build Coastguard Worker printf("%s(%d, NULL, SHM_RDONLY|SHM_EXEC) = %p\n",
78*cf84ac9aSAndroid Build Coastguard Worker SHMAT, id, shmaddr);
79*cf84ac9aSAndroid Build Coastguard Worker rc = shmdt(shmaddr);
80*cf84ac9aSAndroid Build Coastguard Worker printf("shmdt(%p) = %s\n", shmaddr, sprintrc(rc));
81*cf84ac9aSAndroid Build Coastguard Worker }
82*cf84ac9aSAndroid Build Coastguard Worker
83*cf84ac9aSAndroid Build Coastguard Worker puts("+++ exited with 0 +++");
84*cf84ac9aSAndroid Build Coastguard Worker return 0;
85*cf84ac9aSAndroid Build Coastguard Worker }
86