xref: /aosp_15_r20/external/strace/tests-m32/shmxt.c (revision cf84ac9a129d8ea9952db616b4e9b904c4bdde56)
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