/*
|
/*
|
* linux/ipc/util.c
|
* linux/ipc/util.c
|
* Copyright (C) 1992 Krishna Balasubramanian
|
* Copyright (C) 1992 Krishna Balasubramanian
|
*/
|
*/
|
|
|
#include <linux/config.h>
|
#include <linux/config.h>
|
#include <linux/errno.h>
|
#include <linux/errno.h>
|
#include <asm/segment.h>
|
#include <asm/segment.h>
|
#include <linux/sched.h>
|
#include <linux/sched.h>
|
#include <linux/mm.h>
|
#include <linux/mm.h>
|
#include <linux/sem.h>
|
#include <linux/sem.h>
|
#include <linux/msg.h>
|
#include <linux/msg.h>
|
#include <linux/shm.h>
|
#include <linux/shm.h>
|
#include <linux/stat.h>
|
#include <linux/stat.h>
|
|
|
#if defined(CONFIG_SYSVIPC) || defined(CONFIG_KERNELD)
|
#if defined(CONFIG_SYSVIPC) || defined(CONFIG_KERNELD)
|
|
|
extern void sem_init (void), msg_init (void), shm_init (void);
|
extern void sem_init (void), msg_init (void), shm_init (void);
|
|
|
void ipc_init (void)
|
void ipc_init (void)
|
{
|
{
|
sem_init();
|
sem_init();
|
msg_init();
|
msg_init();
|
shm_init();
|
shm_init();
|
return;
|
return;
|
}
|
}
|
|
|
/*
|
/*
|
* Check user, group, other permissions for access
|
* Check user, group, other permissions for access
|
* to ipc resources. return 0 if allowed
|
* to ipc resources. return 0 if allowed
|
*/
|
*/
|
int ipcperms (struct ipc_perm *ipcp, short flag)
|
int ipcperms (struct ipc_perm *ipcp, short flag)
|
{ /* flag will most probably be 0 or S_...UGO from <linux/stat.h> */
|
{ /* flag will most probably be 0 or S_...UGO from <linux/stat.h> */
|
int requested_mode, granted_mode;
|
int requested_mode, granted_mode;
|
|
|
if (suser())
|
if (suser())
|
return 0;
|
return 0;
|
requested_mode = (flag >> 6) | (flag >> 3) | flag;
|
requested_mode = (flag >> 6) | (flag >> 3) | flag;
|
granted_mode = ipcp->mode;
|
granted_mode = ipcp->mode;
|
if (current->euid == ipcp->cuid || current->euid == ipcp->uid)
|
if (current->euid == ipcp->cuid || current->euid == ipcp->uid)
|
granted_mode >>= 6;
|
granted_mode >>= 6;
|
else if (in_group_p(ipcp->cgid) || in_group_p(ipcp->gid))
|
else if (in_group_p(ipcp->cgid) || in_group_p(ipcp->gid))
|
granted_mode >>= 3;
|
granted_mode >>= 3;
|
/* is there some bit set in requested_mode but not in granted_mode? */
|
/* is there some bit set in requested_mode but not in granted_mode? */
|
if (requested_mode & ~granted_mode & 0007)
|
if (requested_mode & ~granted_mode & 0007)
|
return -1;
|
return -1;
|
return 0;
|
return 0;
|
}
|
}
|
|
|
#else
|
#else
|
/*
|
/*
|
* Dummy functions when SYSV IPC isn't configured
|
* Dummy functions when SYSV IPC isn't configured
|
*/
|
*/
|
|
|
void sem_exit (void)
|
void sem_exit (void)
|
{
|
{
|
return;
|
return;
|
}
|
}
|
|
|
int shm_swap (int prio, unsigned long limit)
|
int shm_swap (int prio, unsigned long limit)
|
{
|
{
|
return 0;
|
return 0;
|
}
|
}
|
|
|
asmlinkage int sys_semget (key_t key, int nsems, int semflg)
|
asmlinkage int sys_semget (key_t key, int nsems, int semflg)
|
{
|
{
|
return -ENOSYS;
|
return -ENOSYS;
|
}
|
}
|
|
|
asmlinkage int sys_semop (int semid, struct sembuf *sops, unsigned nsops)
|
asmlinkage int sys_semop (int semid, struct sembuf *sops, unsigned nsops)
|
{
|
{
|
return -ENOSYS;
|
return -ENOSYS;
|
}
|
}
|
|
|
asmlinkage int sys_semctl (int semid, int semnum, int cmd, union semun arg)
|
asmlinkage int sys_semctl (int semid, int semnum, int cmd, union semun arg)
|
{
|
{
|
return -ENOSYS;
|
return -ENOSYS;
|
}
|
}
|
|
|
asmlinkage int sys_msgget (key_t key, int msgflg)
|
asmlinkage int sys_msgget (key_t key, int msgflg)
|
{
|
{
|
return -ENOSYS;
|
return -ENOSYS;
|
}
|
}
|
|
|
asmlinkage int sys_msgsnd (int msqid, struct msgbuf *msgp, size_t msgsz, int msgflg)
|
asmlinkage int sys_msgsnd (int msqid, struct msgbuf *msgp, size_t msgsz, int msgflg)
|
{
|
{
|
return -ENOSYS;
|
return -ENOSYS;
|
}
|
}
|
|
|
asmlinkage int sys_msgrcv (int msqid, struct msgbuf *msgp, size_t msgsz, long msgtyp,
|
asmlinkage int sys_msgrcv (int msqid, struct msgbuf *msgp, size_t msgsz, long msgtyp,
|
int msgflg)
|
int msgflg)
|
{
|
{
|
return -ENOSYS;
|
return -ENOSYS;
|
}
|
}
|
|
|
asmlinkage int sys_msgctl (int msqid, int cmd, struct msqid_ds *buf)
|
asmlinkage int sys_msgctl (int msqid, int cmd, struct msqid_ds *buf)
|
{
|
{
|
return -ENOSYS;
|
return -ENOSYS;
|
}
|
}
|
|
|
asmlinkage int sys_shmget (key_t key, int size, int flag)
|
asmlinkage int sys_shmget (key_t key, int size, int flag)
|
{
|
{
|
return -ENOSYS;
|
return -ENOSYS;
|
}
|
}
|
|
|
asmlinkage int sys_shmat (int shmid, char *shmaddr, int shmflg, ulong *addr)
|
asmlinkage int sys_shmat (int shmid, char *shmaddr, int shmflg, ulong *addr)
|
{
|
{
|
return -ENOSYS;
|
return -ENOSYS;
|
}
|
}
|
|
|
asmlinkage int sys_shmdt (char *shmaddr)
|
asmlinkage int sys_shmdt (char *shmaddr)
|
{
|
{
|
return -ENOSYS;
|
return -ENOSYS;
|
}
|
}
|
|
|
asmlinkage int sys_shmctl (int shmid, int cmd, struct shmid_ds *buf)
|
asmlinkage int sys_shmctl (int shmid, int cmd, struct shmid_ds *buf)
|
{
|
{
|
return -ENOSYS;
|
return -ENOSYS;
|
}
|
}
|
|
|
void kerneld_exit(void)
|
void kerneld_exit(void)
|
{
|
{
|
}
|
}
|
#endif /* CONFIG_SYSVIPC */
|
#endif /* CONFIG_SYSVIPC */
|
|
|