1#ifndef _LINUX_IPC_H
2#define _LINUX_IPC_H
3
4#include <linux/types.h>
5
6#define IPC_PRIVATE ((__kernel_key_t) 0)
7
8/* Obsolete, used only for backwards compatibility and libc5 compiles */
9struct ipc_perm
10{
11	__kernel_key_t	key;
12	__kernel_uid_t	uid;
13	__kernel_gid_t	gid;
14	__kernel_uid_t	cuid;
15	__kernel_gid_t	cgid;
16	__kernel_mode_t	mode;
17	unsigned short	seq;
18};
19
20/* Include the definition of ipc64_perm */
21#include <asm/ipcbuf.h>
22
23/* resource get request flags */
24#define IPC_CREAT  00001000   /* create if key is nonexistent */
25#define IPC_EXCL   00002000   /* fail if key exists */
26#define IPC_NOWAIT 00004000   /* return error on wait */
27
28/* these fields are used by the DIPC package so the kernel as standard
29   should avoid using them if possible */
30
31#define IPC_DIPC 00010000  /* make it distributed */
32#define IPC_OWN  00020000  /* this machine is the DIPC owner */
33
34/*
35 * Control commands used with semctl, msgctl and shmctl
36 * see also specific commands in sem.h, msg.h and shm.h
37 */
38#define IPC_RMID 0     /* remove resource */
39#define IPC_SET  1     /* set ipc_perm options */
40#define IPC_STAT 2     /* get ipc_perm options */
41#define IPC_INFO 3     /* see ipcs */
42
43/*
44 * Version flags for semctl, msgctl, and shmctl commands
45 * These are passed as bitflags or-ed with the actual command
46 */
47#define IPC_OLD 0	/* Old version (no 32-bit UID support on many
48			   architectures) */
49#define IPC_64  0x0100  /* New version (support 32-bit UIDs, bigger
50			   message sizes, etc. */
51
52#ifdef __KERNEL__
53
54#include <linux/kref.h>
55
56#define IPCMNI 32768  /* <= MAX_INT limit for ipc arrays (including sysctl changes) */
57
58/* used by in-kernel data structures */
59struct kern_ipc_perm
60{
61	spinlock_t	lock;
62	int		deleted;
63	key_t		key;
64	uid_t		uid;
65	gid_t		gid;
66	uid_t		cuid;
67	gid_t		cgid;
68	mode_t		mode;
69	unsigned long	seq;
70	void		*security;
71};
72
73struct ipc_ids;
74struct ipc_namespace {
75	struct kref	kref;
76	struct ipc_ids	*ids[3];
77
78	int		sem_ctls[4];
79	int		used_sems;
80
81	int		msg_ctlmax;
82	int		msg_ctlmnb;
83	int		msg_ctlmni;
84
85	size_t		shm_ctlmax;
86	size_t		shm_ctlall;
87	int		shm_ctlmni;
88	int		shm_tot;
89};
90
91extern struct ipc_namespace init_ipc_ns;
92
93#ifdef CONFIG_SYSVIPC
94#define INIT_IPC_NS(ns)		.ns		= &init_ipc_ns,
95extern struct ipc_namespace *copy_ipcs(unsigned long flags,
96						struct ipc_namespace *ns);
97#else
98#define INIT_IPC_NS(ns)
99static inline struct ipc_namespace *copy_ipcs(unsigned long flags,
100						struct ipc_namespace *ns)
101{
102	return ns;
103}
104#endif
105
106#ifdef CONFIG_IPC_NS
107extern void free_ipc_ns(struct kref *kref);
108#endif
109
110static inline struct ipc_namespace *get_ipc_ns(struct ipc_namespace *ns)
111{
112#ifdef CONFIG_IPC_NS
113	if (ns)
114		kref_get(&ns->kref);
115#endif
116	return ns;
117}
118
119static inline void put_ipc_ns(struct ipc_namespace *ns)
120{
121#ifdef CONFIG_IPC_NS
122	kref_put(&ns->kref, free_ipc_ns);
123#endif
124}
125
126#endif /* __KERNEL__ */
127
128#endif /* _LINUX_IPC_H */
129