112e24427845a1e97e6ffd65153a3752c6d02de7dDmitry V. Levin#include <stdio.h> 27230d0a38862a286776aedd2e8b6fe86f5891e59Dmitry V. Levin#include <errno.h> 312e24427845a1e97e6ffd65153a3752c6d02de7dDmitry V. Levin#include <sys/shm.h> 412e24427845a1e97e6ffd65153a3752c6d02de7dDmitry V. Levin 512e24427845a1e97e6ffd65153a3752c6d02de7dDmitry V. Levinint 612e24427845a1e97e6ffd65153a3752c6d02de7dDmitry V. Levinmain(void) 712e24427845a1e97e6ffd65153a3752c6d02de7dDmitry V. Levin{ 87230d0a38862a286776aedd2e8b6fe86f5891e59Dmitry V. Levin int rc, id; 97230d0a38862a286776aedd2e8b6fe86f5891e59Dmitry V. Levin struct shmid_ds ds; 107230d0a38862a286776aedd2e8b6fe86f5891e59Dmitry V. Levin 117230d0a38862a286776aedd2e8b6fe86f5891e59Dmitry V. Levin id = shmget(IPC_PRIVATE, 1, 0600); 1212e24427845a1e97e6ffd65153a3752c6d02de7dDmitry V. Levin if (id < 0) 1312e24427845a1e97e6ffd65153a3752c6d02de7dDmitry V. Levin return 77; 1412e24427845a1e97e6ffd65153a3752c6d02de7dDmitry V. Levin printf("shmget\\(IPC_PRIVATE, 1, 0600\\) += %d\n", id); 1512e24427845a1e97e6ffd65153a3752c6d02de7dDmitry V. Levin 167230d0a38862a286776aedd2e8b6fe86f5891e59Dmitry V. Levin if (shmctl(id, IPC_STAT, &ds)) 177230d0a38862a286776aedd2e8b6fe86f5891e59Dmitry V. Levin goto fail; 183aa45f3cc2103c7bf80c45452c29e7b7e7dda089Andreas Schwab printf("shmctl\\(%d, (IPC_64\\|)?IPC_STAT, %p\\) += 0\n", id, &ds); 1912e24427845a1e97e6ffd65153a3752c6d02de7dDmitry V. Levin 2012e24427845a1e97e6ffd65153a3752c6d02de7dDmitry V. Levin int max = shmctl(0, SHM_INFO, &ds); 2112e24427845a1e97e6ffd65153a3752c6d02de7dDmitry V. Levin if (max < 0) 2212e24427845a1e97e6ffd65153a3752c6d02de7dDmitry V. Levin goto fail; 233aa45f3cc2103c7bf80c45452c29e7b7e7dda089Andreas Schwab printf("shmctl\\(0, (IPC_64\\|)?SHM_INFO, %p\\) += %d\n", &ds, max); 2412e24427845a1e97e6ffd65153a3752c6d02de7dDmitry V. Levin 257230d0a38862a286776aedd2e8b6fe86f5891e59Dmitry V. Levin rc = shmctl(id, SHM_STAT, &ds); 267230d0a38862a286776aedd2e8b6fe86f5891e59Dmitry V. Levin if (rc != id) { 277230d0a38862a286776aedd2e8b6fe86f5891e59Dmitry V. Levin /* 287230d0a38862a286776aedd2e8b6fe86f5891e59Dmitry V. Levin * In linux < v2.6.24-rc1 the first argument must be 297230d0a38862a286776aedd2e8b6fe86f5891e59Dmitry V. Levin * an index in the kernel's internal array. 307230d0a38862a286776aedd2e8b6fe86f5891e59Dmitry V. Levin */ 317230d0a38862a286776aedd2e8b6fe86f5891e59Dmitry V. Levin if (-1 != rc || EINVAL != errno) 327230d0a38862a286776aedd2e8b6fe86f5891e59Dmitry V. Levin goto fail; 333aa45f3cc2103c7bf80c45452c29e7b7e7dda089Andreas Schwab printf("shmctl\\(%d, (IPC_64\\|)?SHM_STAT, %p\\) += -1 EINVAL \\(Invalid argument\\)\n", id, &ds); 347230d0a38862a286776aedd2e8b6fe86f5891e59Dmitry V. Levin } else { 353aa45f3cc2103c7bf80c45452c29e7b7e7dda089Andreas Schwab printf("shmctl\\(%d, (IPC_64\\|)?SHM_STAT, %p\\) += %d\n", id, &ds, id); 367230d0a38862a286776aedd2e8b6fe86f5891e59Dmitry V. Levin } 3712e24427845a1e97e6ffd65153a3752c6d02de7dDmitry V. Levin 3812e24427845a1e97e6ffd65153a3752c6d02de7dDmitry V. Levin rc = 0; 397230d0a38862a286776aedd2e8b6fe86f5891e59Dmitry V. Levindone: 4012e24427845a1e97e6ffd65153a3752c6d02de7dDmitry V. Levin if (shmctl(id, IPC_RMID, 0) < 0) 4112e24427845a1e97e6ffd65153a3752c6d02de7dDmitry V. Levin return 1; 423aa45f3cc2103c7bf80c45452c29e7b7e7dda089Andreas Schwab printf("shmctl\\(%d, (IPC_64\\|)?IPC_RMID, 0\\) += 0\n", id); 4312e24427845a1e97e6ffd65153a3752c6d02de7dDmitry V. Levin return rc; 447230d0a38862a286776aedd2e8b6fe86f5891e59Dmitry V. Levin 457230d0a38862a286776aedd2e8b6fe86f5891e59Dmitry V. Levinfail: 467230d0a38862a286776aedd2e8b6fe86f5891e59Dmitry V. Levin rc = 1; 477230d0a38862a286776aedd2e8b6fe86f5891e59Dmitry V. Levin goto done; 4812e24427845a1e97e6ffd65153a3752c6d02de7dDmitry V. Levin} 49