ipc.h 2.8 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
#ifndef _LINUX_IPC_H
#define _LINUX_IPC_H

#include <linux/types.h>

#define IPC_PRIVATE ((__kernel_key_t) 0)  

/* Obsolete, used only for backwards compatibility and libc5 compiles */
struct ipc_perm
{
	__kernel_key_t	key;
	__kernel_uid_t	uid;
	__kernel_gid_t	gid;
	__kernel_uid_t	cuid;
	__kernel_gid_t	cgid;
	__kernel_mode_t	mode; 
	unsigned short	seq;
};

/* Include the definition of ipc64_perm */
#include <asm/ipcbuf.h>

/* resource get request flags */
#define IPC_CREAT  00001000   /* create if key is nonexistent */
#define IPC_EXCL   00002000   /* fail if key exists */
#define IPC_NOWAIT 00004000   /* return error on wait */

/* these fields are used by the DIPC package so the kernel as standard
   should avoid using them if possible */
   
#define IPC_DIPC 00010000  /* make it distributed */
#define IPC_OWN  00020000  /* this machine is the DIPC owner */

/* 
 * Control commands used with semctl, msgctl and shmctl 
 * see also specific commands in sem.h, msg.h and shm.h
 */
#define IPC_RMID 0     /* remove resource */
#define IPC_SET  1     /* set ipc_perm options */
#define IPC_STAT 2     /* get ipc_perm options */
#define IPC_INFO 3     /* see ipcs */

/*
 * Version flags for semctl, msgctl, and shmctl commands
 * These are passed as bitflags or-ed with the actual command
 */
#define IPC_OLD 0	/* Old version (no 32-bit UID support on many
			   architectures) */
#define IPC_64  0x0100  /* New version (support 32-bit UIDs, bigger
			   message sizes, etc. */

#ifdef __KERNEL__

C
Cedric Le Goater 已提交
54
#include <linux/kref.h>
55
#include <linux/spinlock.h>
C
Cedric Le Goater 已提交
56

L
Linus Torvalds 已提交
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
#define IPCMNI 32768  /* <= MAX_INT limit for ipc arrays (including sysctl changes) */

/* used by in-kernel data structures */
struct kern_ipc_perm
{
	spinlock_t	lock;
	int		deleted;
	key_t		key;
	uid_t		uid;
	gid_t		gid;
	uid_t		cuid;
	gid_t		cgid;
	mode_t		mode; 
	unsigned long	seq;
	void		*security;
};

K
Kirill Korotaev 已提交
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
struct ipc_ids;
struct ipc_namespace {
	struct kref	kref;
	struct ipc_ids	*ids[3];

	int		sem_ctls[4];
	int		used_sems;

	int		msg_ctlmax;
	int		msg_ctlmnb;
	int		msg_ctlmni;

	size_t		shm_ctlmax;
	size_t		shm_ctlall;
	int		shm_ctlmni;
	int		shm_tot;
};

extern struct ipc_namespace init_ipc_ns;
K
Kirill Korotaev 已提交
93 94 95

#ifdef CONFIG_SYSVIPC
#define INIT_IPC_NS(ns)		.ns		= &init_ipc_ns,
96
extern void free_ipc_ns(struct kref *kref);
97 98
extern struct ipc_namespace *copy_ipcs(unsigned long flags,
						struct ipc_namespace *ns);
K
Kirill Korotaev 已提交
99 100
#else
#define INIT_IPC_NS(ns)
101 102 103 104 105
static inline struct ipc_namespace *copy_ipcs(unsigned long flags,
						struct ipc_namespace *ns)
{
	return ns;
}
K
Kirill Korotaev 已提交
106 107
#endif

K
Kirill Korotaev 已提交
108 109
static inline struct ipc_namespace *get_ipc_ns(struct ipc_namespace *ns)
{
110
#ifdef CONFIG_SYSVIPC
K
Kirill Korotaev 已提交
111 112
	if (ns)
		kref_get(&ns->kref);
K
Kirill Korotaev 已提交
113
#endif
K
Kirill Korotaev 已提交
114 115 116 117 118
	return ns;
}

static inline void put_ipc_ns(struct ipc_namespace *ns)
{
119
#ifdef CONFIG_SYSVIPC
K
Kirill Korotaev 已提交
120
	kref_put(&ns->kref, free_ipc_ns);
K
Kirill Korotaev 已提交
121
#endif
K
Kirill Korotaev 已提交
122 123
}

L
Linus Torvalds 已提交
124 125 126
#endif /* __KERNEL__ */

#endif /* _LINUX_IPC_H */