From ef467338e4a290b0f8978a0701b404e17c5bb048 Mon Sep 17 00:00:00 2001 From: Jeff Johnston Date: Wed, 19 Jun 2002 22:17:33 +0000 Subject: 2002-06-19 Jeff Johnston * libc/sys/linux/Makefile.am: Add support for message queue routines, ipc routines, and ftok. * libc/sys/linux/Makefile.in: Regenerated. * libc/sys/linux/ftok.c: New file. * libc/sys/linux/ipc.c: Ditto. * libc/sys/linux/mq_close.c: Ditto. * libc/sys/linux/mq_getattr.c: Ditto. * libc/sys/linux/mq_notify.c: Ditto. * libc/sys/linux/mq_open.c: Ditto. * libc/sys/linux/mq_receive.c: Ditto. * libc/sys/linux/mq_send.c: Ditto. * libc/sys/linux/mq_setattr.c: Ditto. * libc/sys/linux/mq_unlink.c: Ditto. * libc/sys/linux/mqlocal.h: Ditto. * libc/sys/linux/include/mqueue.h: Ditto. * libc/sys/linux/sys/types.h: Define __gid_t_defined and __uid_t_defined. --- newlib/libc/sys/linux/ipc.c | 87 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 newlib/libc/sys/linux/ipc.c (limited to 'newlib/libc/sys/linux/ipc.c') diff --git a/newlib/libc/sys/linux/ipc.c b/newlib/libc/sys/linux/ipc.c new file mode 100644 index 000000000..31e225255 --- /dev/null +++ b/newlib/libc/sys/linux/ipc.c @@ -0,0 +1,87 @@ +/* libc/sys/linux/ipc.c - IPC semaphore and message queue functions */ + +/* Copyright 2002, Red Hat Inc. */ + +#include +#include +#include +#include + +#include + +#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); +} + -- cgit v1.2.3