ipc_shm.c revision 7230d0a38862a286776aedd2e8b6fe86f5891e59
1#include <stdio.h>
2#include <errno.h>
3#include <sys/shm.h>
4
5int
6main(void)
7{
8	int rc, id;
9	struct shmid_ds ds;
10
11	id = shmget(IPC_PRIVATE, 1, 0600);
12	if (id < 0)
13		return 77;
14	printf("shmget\\(IPC_PRIVATE, 1, 0600\\) += %d\n", id);
15
16	if (shmctl(id, IPC_STAT, &ds))
17		goto fail;
18	printf("shmctl\\(%d, IPC_STAT, %p\\) += 0\n", id, &ds);
19
20	int max = shmctl(0, SHM_INFO, &ds);
21	if (max < 0)
22		goto fail;
23	printf("shmctl\\(0, SHM_INFO, %p\\) += %d\n", &ds, max);
24
25	rc = shmctl(id, SHM_STAT, &ds);
26	if (rc != id) {
27		/*
28		 * In linux < v2.6.24-rc1 the first argument must be
29		 * an index in the kernel's internal array.
30		 */
31		if (-1 != rc || EINVAL != errno)
32			goto fail;
33		printf("shmctl\\(%d, SHM_STAT, %p\\) += -1 EINVAL \\(Invalid argument\\)\n", id, &ds);
34	} else {
35		printf("shmctl\\(%d, SHM_STAT, %p\\) += %d\n", id, &ds, id);
36	}
37
38	rc = 0;
39done:
40	if (shmctl(id, IPC_RMID, 0) < 0)
41		return 1;
42	printf("shmctl\\(%d, IPC_RMID, 0\\) += 0\n", id);
43	return rc;
44
45fail:
46	rc = 1;
47	goto done;
48}
49