1a9643ea8Slogwang /* $FreeBSD$ */ 2a9643ea8Slogwang /* $NetBSD: sem.h,v 1.5 1994/06/29 06:45:15 cgd Exp $ */ 3a9643ea8Slogwang 4a9643ea8Slogwang /* 5a9643ea8Slogwang * SVID compatible sem.h file 6a9643ea8Slogwang * 7a9643ea8Slogwang * Author: Daniel Boulet 8a9643ea8Slogwang */ 9a9643ea8Slogwang 10a9643ea8Slogwang #ifndef _SYS_SEM_H_ 11a9643ea8Slogwang #define _SYS_SEM_H_ 12a9643ea8Slogwang 13*22ce4affSfengbojiang #ifdef _WANT_SYSVSEM_INTERNALS 14*22ce4affSfengbojiang #define _WANT_SYSVIPC_INTERNALS 15*22ce4affSfengbojiang #endif 16a9643ea8Slogwang #include <sys/ipc.h> 17a9643ea8Slogwang 18a9643ea8Slogwang #ifndef _PID_T_DECLARED 19a9643ea8Slogwang typedef __pid_t pid_t; 20a9643ea8Slogwang #define _PID_T_DECLARED 21a9643ea8Slogwang #endif 22a9643ea8Slogwang 23a9643ea8Slogwang #ifndef _SIZE_T_DECLARED 24a9643ea8Slogwang typedef __size_t size_t; 25a9643ea8Slogwang #define _SIZE_T_DECLARED 26a9643ea8Slogwang #endif 27a9643ea8Slogwang 28a9643ea8Slogwang #ifndef _TIME_T_DECLARED 29a9643ea8Slogwang typedef __time_t time_t; 30a9643ea8Slogwang #define _TIME_T_DECLARED 31a9643ea8Slogwang #endif 32a9643ea8Slogwang 33a9643ea8Slogwang #if defined(COMPAT_FREEBSD4) || defined(COMPAT_FREEBSD5) || \ 34a9643ea8Slogwang defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD7) 35a9643ea8Slogwang struct semid_ds_old { 36a9643ea8Slogwang struct ipc_perm_old sem_perm; /* operation permission struct */ 37*22ce4affSfengbojiang struct sem *__sem_base; /* pointer to first semaphore in set */ 38a9643ea8Slogwang unsigned short sem_nsems; /* number of sems in set */ 39a9643ea8Slogwang time_t sem_otime; /* last operation time */ 40a9643ea8Slogwang long sem_pad1; /* SVABI/386 says I need this here */ 41a9643ea8Slogwang time_t sem_ctime; /* last change time */ 42a9643ea8Slogwang /* Times measured in secs since */ 43a9643ea8Slogwang /* 00:00:00 UTC, Jan. 1, 1970, without leap seconds */ 44a9643ea8Slogwang long sem_pad2; /* SVABI/386 says I need this here */ 45a9643ea8Slogwang long sem_pad3[4]; /* SVABI/386 says I need this here */ 46a9643ea8Slogwang }; 47a9643ea8Slogwang #endif 48a9643ea8Slogwang 49a9643ea8Slogwang struct semid_ds { 50a9643ea8Slogwang struct ipc_perm sem_perm; /* operation permission struct */ 51*22ce4affSfengbojiang struct sem *__sem_base; /* pointer to first semaphore in set */ 52a9643ea8Slogwang unsigned short sem_nsems; /* number of sems in set */ 53a9643ea8Slogwang time_t sem_otime; /* last operation time */ 54a9643ea8Slogwang time_t sem_ctime; /* last change time */ 55a9643ea8Slogwang /* Times measured in secs since */ 56a9643ea8Slogwang /* 00:00:00 UTC, Jan. 1, 1970, without leap seconds */ 57a9643ea8Slogwang }; 58a9643ea8Slogwang 59a9643ea8Slogwang /* 60a9643ea8Slogwang * semop's sops parameter structure 61a9643ea8Slogwang */ 62a9643ea8Slogwang struct sembuf { 63a9643ea8Slogwang unsigned short sem_num; /* semaphore # */ 64a9643ea8Slogwang short sem_op; /* semaphore operation */ 65a9643ea8Slogwang short sem_flg; /* operation flags */ 66a9643ea8Slogwang }; 67a9643ea8Slogwang #define SEM_UNDO 010000 68a9643ea8Slogwang 69a9643ea8Slogwang #if defined(COMPAT_FREEBSD4) || defined(COMPAT_FREEBSD5) || \ 70a9643ea8Slogwang defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD7) || \ 71a9643ea8Slogwang defined(_WANT_SEMUN_OLD) 72a9643ea8Slogwang union semun_old { 73a9643ea8Slogwang int val; /* value for SETVAL */ 74a9643ea8Slogwang struct semid_ds_old *buf; /* buffer for IPC_STAT & IPC_SET */ 75a9643ea8Slogwang unsigned short *array; /* array for GETALL & SETALL */ 76a9643ea8Slogwang }; 77a9643ea8Slogwang #endif 78a9643ea8Slogwang 79*22ce4affSfengbojiang #if defined(_KERNEL) || defined(_WANT_SEMUN) 80a9643ea8Slogwang /* 81a9643ea8Slogwang * semctl's arg parameter structure 82a9643ea8Slogwang */ 83a9643ea8Slogwang union semun { 84a9643ea8Slogwang int val; /* value for SETVAL */ 85a9643ea8Slogwang struct semid_ds *buf; /* buffer for IPC_STAT & IPC_SET */ 86a9643ea8Slogwang unsigned short *array; /* array for GETALL & SETALL */ 87a9643ea8Slogwang }; 88*22ce4affSfengbojiang #endif 89a9643ea8Slogwang 90a9643ea8Slogwang /* 91a9643ea8Slogwang * commands for semctl 92a9643ea8Slogwang */ 93a9643ea8Slogwang #define GETNCNT 3 /* Return the value of semncnt {READ} */ 94a9643ea8Slogwang #define GETPID 4 /* Return the value of sempid {READ} */ 95a9643ea8Slogwang #define GETVAL 5 /* Return the value of semval {READ} */ 96a9643ea8Slogwang #define GETALL 6 /* Return semvals into arg.array {READ} */ 97a9643ea8Slogwang #define GETZCNT 7 /* Return the value of semzcnt {READ} */ 98a9643ea8Slogwang #define SETVAL 8 /* Set the value of semval to arg.val {ALTER} */ 99a9643ea8Slogwang #define SETALL 9 /* Set semvals from arg.array {ALTER} */ 100a9643ea8Slogwang #define SEM_STAT 10 /* Like IPC_STAT but treats semid as sema-index */ 101a9643ea8Slogwang #define SEM_INFO 11 /* Like IPC_INFO but treats semid as sema-index */ 102a9643ea8Slogwang 103a9643ea8Slogwang /* 104a9643ea8Slogwang * Permissions 105a9643ea8Slogwang */ 106a9643ea8Slogwang #define SEM_A IPC_W /* alter permission */ 107a9643ea8Slogwang #define SEM_R IPC_R /* read permission */ 108a9643ea8Slogwang 109*22ce4affSfengbojiang #if defined(_KERNEL) || defined(_WANT_SYSVSEM_INTERNALS) 110a9643ea8Slogwang /* 111a9643ea8Slogwang * semaphore info struct 112a9643ea8Slogwang */ 113a9643ea8Slogwang struct seminfo { 114*22ce4affSfengbojiang int semmni; /* # of semaphore identifiers */ 115*22ce4affSfengbojiang int semmns; /* # of semaphores in system */ 116*22ce4affSfengbojiang int semmnu; /* # of undo structures in system */ 117*22ce4affSfengbojiang int semmsl; /* max # of semaphores per id */ 118*22ce4affSfengbojiang int semopm; /* max # of operations per semop call */ 119*22ce4affSfengbojiang int semume; /* max # of undo entries per process */ 120*22ce4affSfengbojiang int semusz; /* size in bytes of undo structure */ 121*22ce4affSfengbojiang int semvmx; /* semaphore maximum value */ 122*22ce4affSfengbojiang int semaem; /* adjust on exit max value */ 123a9643ea8Slogwang }; 124a9643ea8Slogwang 125a9643ea8Slogwang /* 126a9643ea8Slogwang * Kernel wrapper for the user-level structure 127a9643ea8Slogwang */ 128a9643ea8Slogwang struct semid_kernel { 129a9643ea8Slogwang struct semid_ds u; 130a9643ea8Slogwang struct label *label; /* MAC framework label */ 131a9643ea8Slogwang struct ucred *cred; /* creator's credentials */ 132a9643ea8Slogwang }; 133a9643ea8Slogwang 134a9643ea8Slogwang /* internal "mode" bits */ 135a9643ea8Slogwang #define SEM_ALLOC 01000 /* semaphore is allocated */ 136a9643ea8Slogwang #define SEM_DEST 02000 /* semaphore will be destroyed on last detach */ 137*22ce4affSfengbojiang #endif 138a9643ea8Slogwang 139*22ce4affSfengbojiang #ifdef _KERNEL 140*22ce4affSfengbojiang extern struct seminfo seminfo; 141a9643ea8Slogwang /* 142a9643ea8Slogwang * Process sem_undo vectors at proc exit. 143a9643ea8Slogwang */ 144a9643ea8Slogwang void semexit(struct proc *p); 145a9643ea8Slogwang 146*22ce4affSfengbojiang #else /* !_KERNEL */ 147a9643ea8Slogwang 148a9643ea8Slogwang __BEGIN_DECLS 149a9643ea8Slogwang #if __BSD_VISIBLE 150a9643ea8Slogwang int semsys(int, ...); 151a9643ea8Slogwang #endif 152a9643ea8Slogwang int semctl(int, int, int, ...); 153a9643ea8Slogwang int semget(key_t, int, int); 154a9643ea8Slogwang int semop(int, struct sembuf *, size_t); 155a9643ea8Slogwang __END_DECLS 156a9643ea8Slogwang 157*22ce4affSfengbojiang #endif /* !_KERNEL */ 158a9643ea8Slogwang 159a9643ea8Slogwang #endif /* !_SYS_SEM_H_ */ 160