xref: /haiku/src/system/libroot/posix/sys/xsi_sem.cpp (revision 47ca7595ca54e08dac7482950a35b045e6ad8801)
1*47ca7595SAxel Dörfler /*
2*47ca7595SAxel Dörfler  * Copyright 2008, Haiku Inc. All rights reserved.
3*47ca7595SAxel Dörfler  * Distributed under the terms of the MIT License.
4*47ca7595SAxel Dörfler  *
5*47ca7595SAxel Dörfler  * Authors:
6*47ca7595SAxel Dörfler  *		Salvatore Benedetto <salvatore.benedetto@gmail.com>
7*47ca7595SAxel Dörfler  */
8*47ca7595SAxel Dörfler 
9*47ca7595SAxel Dörfler #include <sys/sem.h>
10*47ca7595SAxel Dörfler 
11*47ca7595SAxel Dörfler #include <errno.h>
12*47ca7595SAxel Dörfler #include <fcntl.h>
13*47ca7595SAxel Dörfler #include <stdarg.h>
14*47ca7595SAxel Dörfler #include <stdlib.h>
15*47ca7595SAxel Dörfler 
16*47ca7595SAxel Dörfler #include <OS.h>
17*47ca7595SAxel Dörfler 
18*47ca7595SAxel Dörfler //#include <posix/xsi_semaphore_defs.h>
19*47ca7595SAxel Dörfler #include <syscall_utils.h>
20*47ca7595SAxel Dörfler #include <syscalls.h>
21*47ca7595SAxel Dörfler 
22*47ca7595SAxel Dörfler // TODO: this should be removed when the above commented header exists
23*47ca7595SAxel Dörfler #if 1
24*47ca7595SAxel Dörfler /*
25*47ca7595SAxel Dörfler  * For the semctl option argument, the user
26*47ca7595SAxel Dörfler  * should declare explicitly the following union
27*47ca7595SAxel Dörfler  */
28*47ca7595SAxel Dörfler union semun {
29*47ca7595SAxel Dörfler 	int				val;
30*47ca7595SAxel Dörfler 	struct semid_ds	*buf;
31*47ca7595SAxel Dörfler 	unsigned short	*array;
32*47ca7595SAxel Dörfler };
33*47ca7595SAxel Dörfler #endif
34*47ca7595SAxel Dörfler 
35*47ca7595SAxel Dörfler int
36*47ca7595SAxel Dörfler semget(key_t key, int numSems, int semFlags)
37*47ca7595SAxel Dörfler {
38*47ca7595SAxel Dörfler 	RETURN_AND_SET_ERRNO(_kern_xsi_semget(key, numSems, semFlags));
39*47ca7595SAxel Dörfler }
40*47ca7595SAxel Dörfler 
41*47ca7595SAxel Dörfler 
42*47ca7595SAxel Dörfler int
43*47ca7595SAxel Dörfler semctl(int semID, int semNum, int command, ...)
44*47ca7595SAxel Dörfler {
45*47ca7595SAxel Dörfler 	union semun arg;
46*47ca7595SAxel Dörfler 	va_list args;
47*47ca7595SAxel Dörfler 
48*47ca7595SAxel Dörfler 	switch (command) {
49*47ca7595SAxel Dörfler 		case GETVAL:
50*47ca7595SAxel Dörfler 		case GETPID:
51*47ca7595SAxel Dörfler 		case GETNCNT:
52*47ca7595SAxel Dörfler 		case GETZCNT:
53*47ca7595SAxel Dörfler 		case IPC_RMID:
54*47ca7595SAxel Dörfler 			RETURN_AND_SET_ERRNO(_kern_xsi_semctl(semID, semNum, command, 0));
55*47ca7595SAxel Dörfler 
56*47ca7595SAxel Dörfler 		case SETVAL:
57*47ca7595SAxel Dörfler 		case GETALL:
58*47ca7595SAxel Dörfler 		case SETALL:
59*47ca7595SAxel Dörfler 		case IPC_STAT:
60*47ca7595SAxel Dörfler 		case IPC_SET:
61*47ca7595SAxel Dörfler 			va_start(args, command);
62*47ca7595SAxel Dörfler 			arg = va_arg(args, union semun);
63*47ca7595SAxel Dörfler 			va_end(args);
64*47ca7595SAxel Dörfler 			RETURN_AND_SET_ERRNO(_kern_xsi_semctl(semID, semNum, command,
65*47ca7595SAxel Dörfler 				&arg));
66*47ca7595SAxel Dörfler 
67*47ca7595SAxel Dörfler 		default:
68*47ca7595SAxel Dörfler 			return EINVAL;
69*47ca7595SAxel Dörfler 	}
70*47ca7595SAxel Dörfler }
71*47ca7595SAxel Dörfler 
72*47ca7595SAxel Dörfler 
73*47ca7595SAxel Dörfler int
74*47ca7595SAxel Dörfler semop(int semID, struct sembuf *semOps, size_t numSemOps)
75*47ca7595SAxel Dörfler {
76*47ca7595SAxel Dörfler 	RETURN_AND_SET_ERRNO(_kern_xsi_semop(semID, semOps, numSemOps));
77*47ca7595SAxel Dörfler }
78