150477Speter/* $FreeBSD$ */ 22729Sdfr/* $NetBSD: sem.h,v 1.5 1994/06/29 06:45:15 cgd Exp $ */ 32729Sdfr 42729Sdfr/* 52729Sdfr * SVID compatible sem.h file 62729Sdfr * 72729Sdfr * Author: Daniel Boulet 82729Sdfr */ 92729Sdfr 102729Sdfr#ifndef _SYS_SEM_H_ 112729Sdfr#define _SYS_SEM_H_ 122729Sdfr 132729Sdfr#include <sys/ipc.h> 142729Sdfr 15163506Sjhb#ifndef _PID_T_DECLARED 16163506Sjhbtypedef __pid_t pid_t; 17163506Sjhb#define _PID_T_DECLARED 18163506Sjhb#endif 19163506Sjhb 20163506Sjhb#ifndef _SIZE_T_DECLARED 21163506Sjhbtypedef __size_t size_t; 22163506Sjhb#define _SIZE_T_DECLARED 23163506Sjhb#endif 24163506Sjhb 25163506Sjhb#ifndef _TIME_T_DECLARED 26163506Sjhbtypedef __time_t time_t; 27163506Sjhb#define _TIME_T_DECLARED 28163506Sjhb#endif 29163506Sjhb 30194910Sjhb#if defined(COMPAT_FREEBSD4) || defined(COMPAT_FREEBSD5) || \ 31194910Sjhb defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD7) 32194910Sjhbstruct semid_ds_old { 33194910Sjhb struct ipc_perm_old sem_perm; /* operation permission struct */ 34115708Sschweikh struct sem *sem_base; /* pointer to first semaphore in set */ 35115708Sschweikh unsigned short sem_nsems; /* number of sems in set */ 36115708Sschweikh time_t sem_otime; /* last operation time */ 37115708Sschweikh long sem_pad1; /* SVABI/386 says I need this here */ 38115708Sschweikh time_t sem_ctime; /* last change time */ 39115708Sschweikh /* Times measured in secs since */ 40115708Sschweikh /* 00:00:00 GMT, Jan. 1, 1970 */ 41115708Sschweikh long sem_pad2; /* SVABI/386 says I need this here */ 42115708Sschweikh long sem_pad3[4]; /* SVABI/386 says I need this here */ 432729Sdfr}; 44194910Sjhb#endif 452729Sdfr 46194910Sjhbstruct semid_ds { 47194910Sjhb struct ipc_perm sem_perm; /* operation permission struct */ 48194910Sjhb struct sem *sem_base; /* pointer to first semaphore in set */ 49194910Sjhb unsigned short sem_nsems; /* number of sems in set */ 50194910Sjhb time_t sem_otime; /* last operation time */ 51194910Sjhb time_t sem_ctime; /* last change time */ 52194910Sjhb /* Times measured in secs since */ 53194910Sjhb /* 00:00:00 GMT, Jan. 1, 1970 */ 54194910Sjhb}; 55194910Sjhb 562729Sdfr/* 572729Sdfr * semop's sops parameter structure 582729Sdfr */ 592729Sdfrstruct sembuf { 60115708Sschweikh unsigned short sem_num; /* semaphore # */ 61115708Sschweikh short sem_op; /* semaphore operation */ 62115708Sschweikh short sem_flg; /* operation flags */ 632729Sdfr}; 642729Sdfr#define SEM_UNDO 010000 652729Sdfr 66194910Sjhb#if defined(COMPAT_FREEBSD4) || defined(COMPAT_FREEBSD5) || \ 67194910Sjhb defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD7) || \ 68194910Sjhb defined(_WANT_SEMUN_OLD) 69194910Sjhbunion semun_old { 70194910Sjhb int val; /* value for SETVAL */ 71194910Sjhb struct semid_ds_old *buf; /* buffer for IPC_STAT & IPC_SET */ 72194910Sjhb unsigned short *array; /* array for GETALL & SETALL */ 73194910Sjhb}; 74194910Sjhb#endif 75194910Sjhb 762729Sdfr/* 772729Sdfr * semctl's arg parameter structure 782729Sdfr */ 792729Sdfrunion semun { 80115708Sschweikh int val; /* value for SETVAL */ 81115708Sschweikh struct semid_ds *buf; /* buffer for IPC_STAT & IPC_SET */ 82115708Sschweikh unsigned short *array; /* array for GETALL & SETALL */ 832729Sdfr}; 842729Sdfr 852729Sdfr/* 862729Sdfr * commands for semctl 872729Sdfr */ 882729Sdfr#define GETNCNT 3 /* Return the value of semncnt {READ} */ 892729Sdfr#define GETPID 4 /* Return the value of sempid {READ} */ 902729Sdfr#define GETVAL 5 /* Return the value of semval {READ} */ 912729Sdfr#define GETALL 6 /* Return semvals into arg.array {READ} */ 922729Sdfr#define GETZCNT 7 /* Return the value of semzcnt {READ} */ 932729Sdfr#define SETVAL 8 /* Set the value of semval to arg.val {ALTER} */ 942729Sdfr#define SETALL 9 /* Set semvals from arg.array {ALTER} */ 9583414Smr#define SEM_STAT 10 /* Like IPC_STAT but treats semid as sema-index */ 96115708Sschweikh#define SEM_INFO 11 /* Like IPC_INFO but treats semid as sema-index */ 972729Sdfr 989444Sjoerg/* 999444Sjoerg * Permissions 1009444Sjoerg */ 10184789Smr#define SEM_A IPC_W /* alter permission */ 10284789Smr#define SEM_R IPC_R /* read permission */ 1039444Sjoerg 10455205Speter#ifdef _KERNEL 1052729Sdfr 1062729Sdfr/* 1072729Sdfr * semaphore info struct 1082729Sdfr */ 1092729Sdfrstruct seminfo { 110224016Sbz int semmni, /* # of semaphore identifiers */ 1112729Sdfr semmns, /* # of semaphores in system */ 1122729Sdfr semmnu, /* # of undo structures in system */ 1132729Sdfr semmsl, /* max # of semaphores per id */ 1142729Sdfr semopm, /* max # of operations per semop call */ 1152729Sdfr semume, /* max # of undo entries per process */ 1162729Sdfr semusz, /* size in bytes of undo structure */ 1172729Sdfr semvmx, /* semaphore maximum value */ 1182729Sdfr semaem; /* adjust on exit max value */ 1192729Sdfr}; 1202836Sdgextern struct seminfo seminfo; 1212729Sdfr 122137611Srwatson/* 123137611Srwatson * Kernel wrapper for the user-level structure 124137611Srwatson */ 125137611Srwatsonstruct semid_kernel { 126137611Srwatson struct semid_ds u; 127137816Srwatson struct label *label; /* MAC framework label */ 128220388Strasz struct ucred *cred; /* creator's credentials */ 129137611Srwatson}; 130137611Srwatson 1312729Sdfr/* internal "mode" bits */ 1322729Sdfr#define SEM_ALLOC 01000 /* semaphore is allocated */ 1332729Sdfr#define SEM_DEST 02000 /* semaphore will be destroyed on last detach */ 1342729Sdfr 1352729Sdfr/* 13613060Sjoerg * Process sem_undo vectors at proc exit. 13713060Sjoerg */ 13892719Salfredvoid semexit(struct proc *p); 1392729Sdfr 140163506Sjhb#else /* ! _KERNEL */ 1412729Sdfr 1422729Sdfr__BEGIN_DECLS 143189814Sdas#if __BSD_VISIBLE 14492719Salfredint semsys(int, ...); 145189814Sdas#endif 14692719Salfredint semctl(int, int, int, ...); 14792719Salfredint semget(key_t, int, int); 148115708Sschweikhint semop(int, struct sembuf *, size_t); 1492729Sdfr__END_DECLS 150163506Sjhb 15155205Speter#endif /* !_KERNEL */ 1522729Sdfr 153115708Sschweikh#endif /* !_SYS_SEM_H_ */ 154