6 #include <minix/config.h>
8 #include <minix/endpoint.h>
9 #include <minix/sysutil.h>
10 #include <minix/const.h>
11 #include <minix/type.h>
15 #include <sys/types.h>
24 PRIVATE
int get_ipc_endpt(endpoint_t
*pt
)
26 return minix_rs_lookup("ipc", pt
);
30 PUBLIC
int semget(key_t key
, int nsems
, int semflag
)
36 if (get_ipc_endpt(&ipc_pt
) != OK
) {
43 m
.SEMGET_FLAG
= semflag
;
45 r
= _syscall(ipc_pt
, IPC_SEMGET
, &m
);
49 return m
.SEMGET_RETID
;
52 /* Semaphore control operation. */
53 PUBLIC
int semctl(int semid
, int semnum
, int cmd
, ...)
60 if (get_ipc_endpt(&ipc_pt
) != OK
) {
66 m
.SEMCTL_NUM
= semnum
;
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);
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
||
83 /* Operate on semaphore. */
84 PUBLIC
int semop(int semid
, struct sembuf
*sops
, size_t nsops
)
89 if (get_ipc_endpt(&ipc_pt
) != OK
) {
95 m
.SEMOP_OPS
= (long) sops
;
98 return _syscall(ipc_pt
, IPC_SEMOP
, &m
);