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