diff options
author | Jeff Johnston <jjohnstn@redhat.com> | 2002-06-19 22:17:33 +0000 |
---|---|---|
committer | Jeff Johnston <jjohnstn@redhat.com> | 2002-06-19 22:17:33 +0000 |
commit | ef467338e4a290b0f8978a0701b404e17c5bb048 (patch) | |
tree | 94570e7616b92bab0db3acef31bcf53dd6ce7a24 /newlib/libc/sys/linux/ipc.c | |
parent | 676a64b87d76d8c0a518dbcb2e03d8ae4c59ced4 (diff) | |
download | cygnal-ef467338e4a290b0f8978a0701b404e17c5bb048.tar.gz cygnal-ef467338e4a290b0f8978a0701b404e17c5bb048.tar.bz2 cygnal-ef467338e4a290b0f8978a0701b404e17c5bb048.zip |
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.c | 87 |
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); +} + |