dec21140A ethernet driver for virtualpc, contributed by nicolas tittley.
[minix.git] / lib / sysvipc / sem.c
blobb0e87722f5968a0984d7a7cbc903285d665cbc44
1 #define __USE_MISC
2 #define _SYSTEM 1
3 #define _MINIX 1
5 #include <minix/com.h>
6 #include <minix/config.h>
7 #include <minix/ipc.h>
8 #include <minix/endpoint.h>
9 #include <minix/sysutil.h>
10 #include <minix/const.h>
11 #include <minix/type.h>
12 #include <minix/rs.h>
14 #include <lib.h>
15 #include <sys/types.h>
16 #include <sys/ipc.h>
17 #include <sys/sem.h>
18 #include <time.h>
19 #include <stdio.h>
20 #include <stdlib.h>
21 #include <stdarg.h>
22 #include <errno.h>
24 PRIVATE int get_ipc_endpt(endpoint_t *pt)
26 return minix_rs_lookup("ipc", pt);
29 /* Get semaphore. */
30 PUBLIC int semget(key_t key, int nsems, int semflag)
32 message m;
33 endpoint_t ipc_pt;
34 int r;
36 if (get_ipc_endpt(&ipc_pt) != OK) {
37 errno = ENOSYS;
38 return -1;
41 m.SEMGET_KEY = key;
42 m.SEMGET_NR = nsems;
43 m.SEMGET_FLAG = semflag;
45 r = _syscall(ipc_pt, IPC_SEMGET, &m);
46 if (r != OK)
47 return r;
49 return m.SEMGET_RETID;
52 /* Semaphore control operation. */
53 PUBLIC int semctl(int semid, int semnum, int cmd, ...)
55 message m;
56 endpoint_t ipc_pt;
57 va_list ap;
58 int r;
60 if (get_ipc_endpt(&ipc_pt) != OK) {
61 errno = ENOSYS;
62 return -1;
65 m.SEMCTL_ID = semid;
66 m.SEMCTL_NUM = semnum;
67 m.SEMCTL_CMD = cmd;
68 va_start(ap, cmd);
69 if (cmd == IPC_STAT || cmd == IPC_SET || cmd == IPC_INFO ||
70 cmd == SEM_INFO || cmd == SEM_STAT || cmd == GETALL ||
71 cmd == SETALL || cmd == SETVAL)
72 m.SEMCTL_OPT = (long) va_arg(ap, long);
73 va_end(ap);
75 r = _syscall(ipc_pt, IPC_SEMCTL, &m);
76 if ((r != -1) && (cmd == GETNCNT || cmd == GETZCNT || cmd == GETPID ||
77 cmd == GETVAL || cmd == IPC_INFO || cmd == SEM_INFO ||
78 cmd == SEM_STAT))
79 return m.SHMCTL_RET;
80 return r;
83 /* Operate on semaphore. */
84 PUBLIC int semop(int semid, struct sembuf *sops, size_t nsops)
86 message m;
87 endpoint_t ipc_pt;
89 if (get_ipc_endpt(&ipc_pt) != OK) {
90 errno = ENOSYS;
91 return -1;
94 m.SEMOP_ID = semid;
95 m.SEMOP_OPS = (long) sops;
96 m.SEMOP_SIZE = nsops;
98 return _syscall(ipc_pt, IPC_SEMOP, &m);