88 lines
1.7 KiB
C
88 lines
1.7 KiB
C
/* libc/sys/linux/ipc.c - IPC semaphore and message queue functions */
|
|
|
|
/* Copyright 2002, Red Hat Inc. */
|
|
|
|
#include <sys/types.h>
|
|
#include <sys/sem.h>
|
|
#include <sys/msg.h>
|
|
#include <stdarg.h>
|
|
|
|
#include <machine/syscall.h>
|
|
|
|
#define IPC_64 0x100
|
|
|
|
#define IPCOP_semop 1
|
|
#define IPCOP_semget 2
|
|
#define IPCOP_semctl 3
|
|
#define IPCOP_msgsnd 11
|
|
#define IPCOP_msgrcv 12
|
|
#define IPCOP_msgget 13
|
|
#define IPCOP_msgctl 14
|
|
|
|
static _syscall5(int,ipc,int,op,int,arg1,int,arg2,int,arg3,void *,arg4);
|
|
|
|
int
|
|
semget (key_t key, int nsems, int semflgs)
|
|
{
|
|
return __libc_ipc(IPCOP_semget, (int)key, nsems, semflgs, NULL);
|
|
}
|
|
|
|
int
|
|
semctl (int semid, int semnum, int cmd, ...)
|
|
{
|
|
va_list va;
|
|
union semun {
|
|
int val;
|
|
struct semid_ds *buf;
|
|
unsigned short *array;
|
|
} arg;
|
|
|
|
va_start (va, cmd);
|
|
|
|
arg = va_arg (va, union semun);
|
|
|
|
va_end (va);
|
|
|
|
return __libc_ipc(IPCOP_semctl, semid, semnum, cmd | IPC_64, &arg);
|
|
}
|
|
|
|
int
|
|
semop (int semid, struct sembuf *sops, size_t nsems)
|
|
{
|
|
return __libc_ipc(IPCOP_semop, semid, (int)nsems, 0, sops);
|
|
}
|
|
|
|
int
|
|
msgget (key_t key, int msgflg)
|
|
{
|
|
return __libc_ipc(IPCOP_msgget, (int)key, msgflg, 0, NULL);
|
|
}
|
|
|
|
int
|
|
msgctl (int msqid, int cmd, struct msqid_ds *buf)
|
|
{
|
|
return __libc_ipc(IPCOP_msgctl, msqid, cmd | IPC_64, 0, buf);
|
|
}
|
|
|
|
int
|
|
msgsnd (int msqid, const void *msgp, size_t msgsz, int msgflg)
|
|
{
|
|
return __libc_ipc(IPCOP_msgsnd, msqid, (int)msgsz, msgflg, (void *)msgp);
|
|
}
|
|
|
|
int
|
|
msgrcv (int msqid, void *msgp, size_t msgsz, long int msgtyp, int msgflg)
|
|
{
|
|
/* last argument must contain multiple args */
|
|
struct {
|
|
void *msgp;
|
|
long int msgtyp;
|
|
} args;
|
|
|
|
args.msgp = msgp;
|
|
args.msgtyp = msgtyp;
|
|
|
|
return (ssize_t)__libc_ipc(IPCOP_msgrcv, msqid, (int)msgsz, msgflg, &args);
|
|
}
|
|
|