3 * Copyright (C) 1992 Krishna Balasubramanian
5 * Sep 1997 - Call suser() last after "normal" permission checks so we
6 * get BSD style process accounting right.
7 * Occurs in several places in the IPC code.
8 * Chris Evans, <chris@ferret.lmh.ox.ac.uk>
11 #include <linux/config.h>
13 #include <linux/shm.h>
14 #include <linux/init.h>
15 #include <linux/msg.h>
17 #if defined(CONFIG_SYSVIPC)
19 extern void sem_init (void), msg_init (void), shm_init (void);
21 void __init
ipc_init (void)
30 * Check user, group, other permissions for access
31 * to ipc resources. return 0 if allowed
33 int ipcperms (struct ipc_perm
*ipcp
, short flag
)
34 { /* flag will most probably be 0 or S_...UGO from <linux/stat.h> */
35 int requested_mode
, granted_mode
;
37 requested_mode
= (flag
>> 6) | (flag
>> 3) | flag
;
38 granted_mode
= ipcp
->mode
;
39 if (current
->euid
== ipcp
->cuid
|| current
->euid
== ipcp
->uid
)
41 else if (in_group_p(ipcp
->cgid
) || in_group_p(ipcp
->gid
))
43 /* is there some bit set in requested_mode but not in granted_mode? */
44 if ((requested_mode
& ~granted_mode
& 0007) &&
45 !capable(CAP_IPC_OWNER
))
53 * Dummy functions when SYSV IPC isn't configured
61 int shm_swap (int prio
, int gfp_mask
)
66 asmlinkage
int sys_semget (key_t key
, int nsems
, int semflg
)
71 asmlinkage
int sys_semop (int semid
, struct sembuf
*sops
, unsigned nsops
)
76 asmlinkage
int sys_semctl (int semid
, int semnum
, int cmd
, union semun arg
)
81 asmlinkage
int sys_msgget (key_t key
, int msgflg
)
86 asmlinkage
int sys_msgsnd (int msqid
, struct msgbuf
*msgp
, size_t msgsz
, int msgflg
)
91 asmlinkage
int sys_msgrcv (int msqid
, struct msgbuf
*msgp
, size_t msgsz
, long msgtyp
,
97 asmlinkage
int sys_msgctl (int msqid
, int cmd
, struct msqid_ds
*buf
)
102 asmlinkage
int sys_shmget (key_t key
, int size
, int flag
)
107 asmlinkage
int sys_shmat (int shmid
, char *shmaddr
, int shmflg
, ulong
*addr
)
112 asmlinkage
int sys_shmdt (char *shmaddr
)
117 asmlinkage
int sys_shmctl (int shmid
, int cmd
, struct shmid_ds
*buf
)
122 void shm_unuse(unsigned long entry
, unsigned long page
)
126 #endif /* CONFIG_SYSVIPC */