Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Johnston <jjohnstn@redhat.com>2002-06-20 02:17:33 +0400
committerJeff Johnston <jjohnstn@redhat.com>2002-06-20 02:17:33 +0400
commitef467338e4a290b0f8978a0701b404e17c5bb048 (patch)
tree94570e7616b92bab0db3acef31bcf53dd6ce7a24 /newlib/libc/sys/linux/ipc.c
parent676a64b87d76d8c0a518dbcb2e03d8ae4c59ced4 (diff)
2002-06-19 Jeff Johnston <jjohnstn@redhat.com>
* 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.
Diffstat (limited to 'newlib/libc/sys/linux/ipc.c')
-rw-r--r--newlib/libc/sys/linux/ipc.c87
1 files changed, 87 insertions, 0 deletions
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 <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);
+}
+