#include "tests.h" #include <stdio.h> #include <stdlib.h> #include <sys/shm.h> static int id = -1; static void cleanup(void) { shmctl(id, IPC_RMID, NULL); id = -1; } #ifdef __alpha__ # define SHMAT "osf_shmat" #else # define SHMAT "shmat" #endif #ifndef SHM_EXEC # define SHM_EXEC 0100000 #endif int main(void) { static const int bogus_shmid = 0xfdb97531; static const void * const bogus_shmaddr = (void *) (unsigned long) 0xdec0ded1dec0ded2ULL; static const int bogus_shmflg = 0xffffface; long rc; id = shmget(IPC_PRIVATE, 1, 0600); if (id < 0) perror_msg_and_skip("shmget"); atexit(cleanup); rc = (long) shmat(bogus_shmid, bogus_shmaddr, bogus_shmflg); printf("%s(%d, %p, SHM_RDONLY|SHM_RND|SHM_REMAP|SHM_EXEC|%#x) = %s\n", SHMAT, bogus_shmid, bogus_shmaddr, bogus_shmflg & ~0xf000, sprintrc(rc)); shmat(id, NULL, SHM_REMAP); printf("%s(%d, NULL, SHM_REMAP) = -1 %s (%m)\n", SHMAT, id, errno2name()); void *shmaddr = shmat(id, NULL, SHM_RDONLY); if (shmaddr == (void *)(-1)) perror_msg_and_skip("shmat SHM_RDONLY"); printf("%s(%d, NULL, SHM_RDONLY) = %p\n", SHMAT, id, shmaddr); rc = shmdt(NULL); printf("shmdt(NULL) = %s\n", sprintrc(rc)); rc = shmdt(shmaddr); printf("shmdt(%p) = %s\n", shmaddr, sprintrc(rc)); ++shmaddr; void *shmaddr2 = shmat(id, shmaddr, SHM_RND); if (shmaddr2 == (void *)(-1)) printf("%s(%d, %p, SHM_RND) = -1 %s (%m)\n", SHMAT, id, shmaddr, errno2name()); else { printf("%s(%d, %p, SHM_RND) = %p\n", SHMAT, id, shmaddr, shmaddr2); rc = shmdt(shmaddr2); printf("shmdt(%p) = %s\n", shmaddr2, sprintrc(rc)); } shmaddr = shmat(id, NULL, SHM_RDONLY|SHM_EXEC); if (shmaddr == (void *)(-1)) printf("%s(%d, NULL, SHM_RDONLY|SHM_EXEC) = %s\n", SHMAT, id, sprintrc(-1)); else { printf("%s(%d, NULL, SHM_RDONLY|SHM_EXEC) = %p\n", SHMAT, id, shmaddr); rc = shmdt(shmaddr); printf("shmdt(%p) = %s\n", shmaddr, sprintrc(rc)); } puts("+++ exited with 0 +++"); return 0; }