ipc_shm.c revision 0a6af9b0a45553587954ef306d56e78ac1f4f363
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_64\\|)?IPC_STAT, \\{shm_perm=\\{uid=%u, gid=%u, "
19		"mode=%#o, key=%u, cuid=%u, cgid=%u\\}, shm_segsz=%u, shm_cpid=%u, "
20		"shm_lpid=%u, shm_nattch=%u, shm_atime=%u, shm_dtime=%u, "
21		"shm_ctime=%u\\}\\) += 0\n",
22		id, (unsigned) ds.shm_perm.uid, (unsigned) ds.shm_perm.gid,
23		(unsigned) ds.shm_perm.mode, (unsigned) ds.shm_perm.__key,
24		(unsigned) ds.shm_perm.cuid, (unsigned) ds.shm_perm.cgid,
25		(unsigned) ds.shm_segsz, (unsigned) ds.shm_cpid,
26		(unsigned) ds.shm_lpid, (unsigned) ds.shm_nattch,
27		(unsigned) ds.shm_atime, (unsigned) ds.shm_dtime,
28		(unsigned) ds. shm_ctime);
29
30	int max = shmctl(0, SHM_INFO, &ds);
31	if (max < 0)
32		goto fail;
33	printf("shmctl\\(0, (IPC_64\\|)?SHM_INFO, %p\\) += %d\n", &ds, max);
34
35	rc = shmctl(id, SHM_STAT, &ds);
36	if (rc != id) {
37		/*
38		 * In linux < v2.6.24-rc1 the first argument must be
39		 * an index in the kernel's internal array.
40		 */
41		if (-1 != rc || EINVAL != errno)
42			goto fail;
43		printf("shmctl\\(%d, (IPC_64\\|)?SHM_STAT, %p\\) += -1 EINVAL \\(Invalid argument\\)\n", id, &ds);
44	} else {
45		printf("shmctl\\(%d, (IPC_64\\|)?SHM_STAT, %p\\) += %d\n", id, &ds, id);
46	}
47
48	rc = 0;
49done:
50	if (shmctl(id, IPC_RMID, NULL) < 0)
51		return 1;
52	printf("shmctl\\(%d, (IPC_64\\|)?IPC_RMID, NULL\\) += 0\n", id);
53	return rc;
54
55fail:
56	rc = 1;
57	goto done;
58}
59