13d903220SDoug Rabson /* $NetBSD: sem.h,v 1.5 1994/06/29 06:45:15 cgd Exp $ */ 23d903220SDoug Rabson 33d903220SDoug Rabson /* 43d903220SDoug Rabson * SVID compatible sem.h file 53d903220SDoug Rabson * 63d903220SDoug Rabson * Author: Daniel Boulet 73d903220SDoug Rabson */ 83d903220SDoug Rabson 93d903220SDoug Rabson #ifndef _SYS_SEM_H_ 103d903220SDoug Rabson #define _SYS_SEM_H_ 113d903220SDoug Rabson 1227b95863SBrooks Davis #ifdef _WANT_SYSVSEM_INTERNALS 1327b95863SBrooks Davis #define _WANT_SYSVIPC_INTERNALS 1427b95863SBrooks Davis #endif 153d903220SDoug Rabson #include <sys/ipc.h> 163d903220SDoug Rabson 178a512df5SJohn Baldwin #ifndef _PID_T_DECLARED 188a512df5SJohn Baldwin typedef __pid_t pid_t; 198a512df5SJohn Baldwin #define _PID_T_DECLARED 208a512df5SJohn Baldwin #endif 218a512df5SJohn Baldwin 228a512df5SJohn Baldwin #ifndef _SIZE_T_DECLARED 238a512df5SJohn Baldwin typedef __size_t size_t; 248a512df5SJohn Baldwin #define _SIZE_T_DECLARED 258a512df5SJohn Baldwin #endif 268a512df5SJohn Baldwin 278a512df5SJohn Baldwin #ifndef _TIME_T_DECLARED 288a512df5SJohn Baldwin typedef __time_t time_t; 298a512df5SJohn Baldwin #define _TIME_T_DECLARED 308a512df5SJohn Baldwin #endif 318a512df5SJohn Baldwin 32b648d480SJohn Baldwin #if defined(COMPAT_FREEBSD4) || defined(COMPAT_FREEBSD5) || \ 33b648d480SJohn Baldwin defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD7) 34b648d480SJohn Baldwin struct semid_ds_old { 35b648d480SJohn Baldwin struct ipc_perm_old sem_perm; /* operation permission struct */ 3693e48a30SBrooks Davis struct sem *__sem_base; /* pointer to first semaphore in set */ 377b594d2aSJens Schweikhardt unsigned short sem_nsems; /* number of sems in set */ 383d903220SDoug Rabson time_t sem_otime; /* last operation time */ 393d903220SDoug Rabson long sem_pad1; /* SVABI/386 says I need this here */ 403d903220SDoug Rabson time_t sem_ctime; /* last change time */ 413d903220SDoug Rabson /* Times measured in secs since */ 4261f26caeSWarner Losh /* 00:00:00 UTC, Jan. 1, 1970, without leap seconds */ 433d903220SDoug Rabson long sem_pad2; /* SVABI/386 says I need this here */ 443d903220SDoug Rabson long sem_pad3[4]; /* SVABI/386 says I need this here */ 453d903220SDoug Rabson }; 46b648d480SJohn Baldwin #endif 47b648d480SJohn Baldwin 48b648d480SJohn Baldwin struct semid_ds { 49b648d480SJohn Baldwin struct ipc_perm sem_perm; /* operation permission struct */ 5093e48a30SBrooks Davis struct sem *__sem_base; /* pointer to first semaphore in set */ 51b648d480SJohn Baldwin unsigned short sem_nsems; /* number of sems in set */ 52b648d480SJohn Baldwin time_t sem_otime; /* last operation time */ 53b648d480SJohn Baldwin time_t sem_ctime; /* last change time */ 54b648d480SJohn Baldwin /* Times measured in secs since */ 5561f26caeSWarner Losh /* 00:00:00 UTC, Jan. 1, 1970, without leap seconds */ 56b648d480SJohn Baldwin }; 573d903220SDoug Rabson 583d903220SDoug Rabson /* 593d903220SDoug Rabson * semop's sops parameter structure 603d903220SDoug Rabson */ 613d903220SDoug Rabson struct sembuf { 627b594d2aSJens Schweikhardt unsigned short sem_num; /* semaphore # */ 633d903220SDoug Rabson short sem_op; /* semaphore operation */ 643d903220SDoug Rabson short sem_flg; /* operation flags */ 653d903220SDoug Rabson }; 663d903220SDoug Rabson #define SEM_UNDO 010000 673d903220SDoug Rabson 68b648d480SJohn Baldwin #if defined(COMPAT_FREEBSD4) || defined(COMPAT_FREEBSD5) || \ 69b648d480SJohn Baldwin defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD7) || \ 70b648d480SJohn Baldwin defined(_WANT_SEMUN_OLD) 71b648d480SJohn Baldwin union semun_old { 72b648d480SJohn Baldwin int val; /* value for SETVAL */ 73b648d480SJohn Baldwin struct semid_ds_old *buf; /* buffer for IPC_STAT & IPC_SET */ 74b648d480SJohn Baldwin unsigned short *array; /* array for GETALL & SETALL */ 75b648d480SJohn Baldwin }; 76b648d480SJohn Baldwin #endif 77b648d480SJohn Baldwin 786d0fe480SBrooks Davis #if defined(_KERNEL) || defined(_WANT_SEMUN) 793d903220SDoug Rabson /* 803d903220SDoug Rabson * semctl's arg parameter structure 813d903220SDoug Rabson */ 823d903220SDoug Rabson union semun { 833d903220SDoug Rabson int val; /* value for SETVAL */ 843d903220SDoug Rabson struct semid_ds *buf; /* buffer for IPC_STAT & IPC_SET */ 857b594d2aSJens Schweikhardt unsigned short *array; /* array for GETALL & SETALL */ 863d903220SDoug Rabson }; 876d0fe480SBrooks Davis #endif 883d903220SDoug Rabson 893d903220SDoug Rabson /* 903d903220SDoug Rabson * commands for semctl 913d903220SDoug Rabson */ 923d903220SDoug Rabson #define GETNCNT 3 /* Return the value of semncnt {READ} */ 933d903220SDoug Rabson #define GETPID 4 /* Return the value of sempid {READ} */ 943d903220SDoug Rabson #define GETVAL 5 /* Return the value of semval {READ} */ 953d903220SDoug Rabson #define GETALL 6 /* Return semvals into arg.array {READ} */ 963d903220SDoug Rabson #define GETZCNT 7 /* Return the value of semzcnt {READ} */ 973d903220SDoug Rabson #define SETVAL 8 /* Set the value of semval to arg.val {ALTER} */ 983d903220SDoug Rabson #define SETALL 9 /* Set semvals from arg.array {ALTER} */ 99d528be2bSMichael Reifenberger #define SEM_STAT 10 /* Like IPC_STAT but treats semid as sema-index */ 100d528be2bSMichael Reifenberger #define SEM_INFO 11 /* Like IPC_INFO but treats semid as sema-index */ 1013d903220SDoug Rabson 102aed5ecb7SJoerg Wunsch /* 103aed5ecb7SJoerg Wunsch * Permissions 104aed5ecb7SJoerg Wunsch */ 10591a701cdSMichael Reifenberger #define SEM_A IPC_W /* alter permission */ 10691a701cdSMichael Reifenberger #define SEM_R IPC_R /* read permission */ 107aed5ecb7SJoerg Wunsch 10827b95863SBrooks Davis #if defined(_KERNEL) || defined(_WANT_SYSVSEM_INTERNALS) 1093d903220SDoug Rabson /* 1103d903220SDoug Rabson * semaphore info struct 1113d903220SDoug Rabson */ 1123d903220SDoug Rabson struct seminfo { 113f849badfSBrooks Davis int semmni; /* # of semaphore identifiers */ 114f849badfSBrooks Davis int semmns; /* # of semaphores in system */ 115f849badfSBrooks Davis int semmnu; /* # of undo structures in system */ 116f849badfSBrooks Davis int semmsl; /* max # of semaphores per id */ 117f849badfSBrooks Davis int semopm; /* max # of operations per semop call */ 118f849badfSBrooks Davis int semume; /* max # of undo entries per process */ 119f849badfSBrooks Davis int semusz; /* size in bytes of undo structure */ 120f849badfSBrooks Davis int semvmx; /* semaphore maximum value */ 121f849badfSBrooks Davis int semaem; /* adjust on exit max value */ 1223d903220SDoug Rabson }; 1233d903220SDoug Rabson 124b37d625cSRobert Watson /* 125b37d625cSRobert Watson * Kernel wrapper for the user-level structure 126b37d625cSRobert Watson */ 127b37d625cSRobert Watson struct semid_kernel { 128b37d625cSRobert Watson struct semid_ds u; 12921335a5eSRobert Watson struct label *label; /* MAC framework label */ 1308caddd81SEdward Tomasz Napierala struct ucred *cred; /* creator's credentials */ 131b37d625cSRobert Watson }; 132b37d625cSRobert Watson 1333d903220SDoug Rabson /* internal "mode" bits */ 1343d903220SDoug Rabson #define SEM_ALLOC 01000 /* semaphore is allocated */ 1353d903220SDoug Rabson #define SEM_DEST 02000 /* semaphore will be destroyed on last detach */ 13627b95863SBrooks Davis #endif 1373d903220SDoug Rabson 13827b95863SBrooks Davis #ifdef _KERNEL 13927b95863SBrooks Davis extern struct seminfo seminfo; 1403d903220SDoug Rabson /* 141a353d785SJoerg Wunsch * Process sem_undo vectors at proc exit. 142a353d785SJoerg Wunsch */ 143789f12feSAlfred Perlstein void semexit(struct proc *p); 1443d903220SDoug Rabson 14527b95863SBrooks Davis #else /* !_KERNEL */ 1463d903220SDoug Rabson 1473d903220SDoug Rabson __BEGIN_DECLS 1487e005f01SDavid Schultz #if __BSD_VISIBLE 149789f12feSAlfred Perlstein int semsys(int, ...); 1507e005f01SDavid Schultz #endif 151789f12feSAlfred Perlstein int semctl(int, int, int, ...); 152789f12feSAlfred Perlstein int semget(key_t, int, int); 1533beb3270SAlfred Perlstein int semop(int, struct sembuf *, size_t); 1543d903220SDoug Rabson __END_DECLS 1558a512df5SJohn Baldwin 15627b95863SBrooks Davis #endif /* !_KERNEL */ 1573d903220SDoug Rabson 1587b594d2aSJens Schweikhardt #endif /* !_SYS_SEM_H_ */ 159