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