|  | #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; | 
|  | } |