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