ipc.h 3.4 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
#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. */

A
Adrian Bunk 已提交
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
/*
 * These are used to wrap system calls.
 *
 * See architecture code for ugly details..
 */
struct ipc_kludge {
	struct msgbuf __user *msgp;
	long msgtyp;
};

#define SEMOP		 1
#define SEMGET		 2
#define SEMCTL		 3
#define SEMTIMEDOP	 4
#define MSGSND		11
#define MSGRCV		12
#define MSGGET		13
#define MSGCTL		14
#define SHMAT		21
#define SHMDT		22
#define SHMGET		23
#define SHMCTL		24

/* Used by the DIPC package, try and avoid reusing it */
#define DIPC            25

#define IPCCALL(version,op)	((version)<<16 | (op))

L
Linus Torvalds 已提交
80 81
#ifdef __KERNEL__

C
Cedric Le Goater 已提交
82
#include <linux/kref.h>
83
#include <linux/spinlock.h>
C
Cedric Le Goater 已提交
84

L
Linus Torvalds 已提交
85 86 87 88 89 90 91
#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;
N
Nadia Derbey 已提交
92
	int		id;
L
Linus Torvalds 已提交
93 94 95 96 97 98 99 100 101 102
	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 已提交
103 104 105 106 107 108 109 110 111 112 113
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;
114 115
	atomic_t	msg_bytes;
	atomic_t	msg_hdrs;
K
Kirill Korotaev 已提交
116 117 118 119 120 121 122 123

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

extern struct ipc_namespace init_ipc_ns;
K
Kirill Korotaev 已提交
124 125 126

#ifdef CONFIG_SYSVIPC
#define INIT_IPC_NS(ns)		.ns		= &init_ipc_ns,
127
extern void free_ipc_ns(struct kref *kref);
128 129
extern struct ipc_namespace *copy_ipcs(unsigned long flags,
						struct ipc_namespace *ns);
K
Kirill Korotaev 已提交
130 131
#else
#define INIT_IPC_NS(ns)
132 133 134 135 136
static inline struct ipc_namespace *copy_ipcs(unsigned long flags,
						struct ipc_namespace *ns)
{
	return ns;
}
K
Kirill Korotaev 已提交
137 138
#endif

K
Kirill Korotaev 已提交
139 140
static inline struct ipc_namespace *get_ipc_ns(struct ipc_namespace *ns)
{
141
#ifdef CONFIG_SYSVIPC
K
Kirill Korotaev 已提交
142 143
	if (ns)
		kref_get(&ns->kref);
K
Kirill Korotaev 已提交
144
#endif
K
Kirill Korotaev 已提交
145 146 147 148 149
	return ns;
}

static inline void put_ipc_ns(struct ipc_namespace *ns)
{
150
#ifdef CONFIG_SYSVIPC
K
Kirill Korotaev 已提交
151
	kref_put(&ns->kref, free_ipc_ns);
K
Kirill Korotaev 已提交
152
#endif
K
Kirill Korotaev 已提交
153 154
}

L
Linus Torvalds 已提交
155 156 157
#endif /* __KERNEL__ */

#endif /* _LINUX_IPC_H */