Home | History | Annotate | Line # | Download | only in sys
      1 /*	$NetBSD: sem.h,v 1.7 2019/02/21 03:37:19 mrg Exp $	*/
      2 
      3 /*
      4  * SVID compatible sem.h file
      5  *
      6  * Author: Daniel Boulet
      7  */
      8 
      9 #ifndef _COMPAT_SYS_SEM_H_
     10 #define _COMPAT_SYS_SEM_H_
     11 
     12 #include <compat/sys/ipc.h>
     13 
     14 struct semid_ds14 {
     15 	struct ipc_perm14 sem_perm;	/* operation permission struct */
     16 	struct __sem	*sem_base;	/* pointer to first semaphore in set */
     17 	unsigned short	sem_nsems;	/* number of sems in set */
     18 	int32_t		sem_otime;	/* last operation time */
     19 	long		sem_pad1;	/* SVABI/386 says I need this here */
     20 	int32_t		sem_ctime;	/* last change time */
     21     					/* Times measured in secs since */
     22     					/* 00:00:00 GMT, Jan. 1, 1970 */
     23 	long		sem_pad2;	/* SVABI/386 says I need this here */
     24 	long		sem_pad3[4];	/* SVABI/386 says I need this here */
     25 };
     26 
     27 struct semid_ds13 {
     28 	struct ipc_perm	sem_perm;	/* operation permission structure */
     29 	unsigned short	sem_nsems;	/* number of semaphores in set */
     30 	int32_t		sem_otime;	/* last semop() time */
     31 	int32_t		sem_ctime;	/* last time changed by semctl() */
     32 
     33 	/*
     34 	 * These members are private and used only in the internal
     35 	 * implementation of this interface.
     36 	 */
     37 	struct __sem	*_sem_base;	/* pointer to first semaphore in set */
     38 };
     39 
     40 /* Warning: 64-bit structure padding is needed here */
     41 struct semid_ds_sysctl50 {
     42 	struct	ipc_perm_sysctl sem_perm;
     43 	int16_t	sem_nsems;
     44 	int16_t	pad2;
     45 	int32_t	pad3;
     46 	int32_t	sem_otime;
     47 	int32_t	sem_ctime;
     48 };
     49 
     50 struct sem_sysctl_info50 {
     51 	struct	seminfo seminfo;
     52 	struct	semid_ds_sysctl50 semids[1];
     53 };
     54 
     55 __BEGIN_DECLS
     56 static __inline void	__semid_ds14_to_native(const struct semid_ds14 *, struct semid_ds *);
     57 static __inline void	__native_to_semid_ds14(const struct semid_ds *, struct semid_ds14 *);
     58 static __inline void	__semid_ds13_to_native(const struct semid_ds13 *, struct semid_ds *);
     59 static __inline void	__native_to_semid_ds13(const struct semid_ds *, struct semid_ds13 *);
     60 
     61 static __inline void
     62 __semid_ds13_to_native(const struct semid_ds13  *osembuf, struct semid_ds *sembuf)
     63 {
     64 
     65 	sembuf->sem_perm = osembuf->sem_perm;
     66 
     67 #define	CVT(x)	sembuf->x = osembuf->x
     68 	CVT(sem_nsems);
     69 	CVT(sem_otime);
     70 	CVT(sem_ctime);
     71 #undef CVT
     72 }
     73 
     74 static __inline void
     75 __native_to_semid_ds13(const struct semid_ds *sembuf, struct semid_ds13 *osembuf)
     76 {
     77 
     78 	memset(osembuf, 0, sizeof *osembuf);
     79 	osembuf->sem_perm = sembuf->sem_perm;
     80 
     81 #define	CVT(x)	osembuf->x = sembuf->x
     82 #define	CVTI(x)	osembuf->x = (int)sembuf->x
     83 	CVT(sem_nsems);
     84 	CVTI(sem_otime);
     85 	CVTI(sem_ctime);
     86 #undef CVT
     87 #undef CVTI
     88 }
     89 
     90 static __inline void
     91 __semid_ds14_to_native(const struct semid_ds14  *osembuf, struct semid_ds *sembuf)
     92 {
     93 
     94 	__ipc_perm14_to_native(&osembuf->sem_perm, &sembuf->sem_perm);
     95 
     96 #define	CVT(x)	sembuf->x = osembuf->x
     97 	CVT(sem_nsems);
     98 	CVT(sem_otime);
     99 	CVT(sem_ctime);
    100 #undef CVT
    101 }
    102 
    103 static __inline void
    104 __native_to_semid_ds14(const struct semid_ds *sembuf, struct semid_ds14 *osembuf)
    105 {
    106 
    107 	memset(osembuf, 0, sizeof *osembuf);
    108 	__native_to_ipc_perm14(&sembuf->sem_perm, &osembuf->sem_perm);
    109 
    110 #define	CVT(x)	osembuf->x = sembuf->x
    111 #define	CVTI(x)	osembuf->x = (int)sembuf->x
    112 	CVT(sem_nsems);
    113 	CVTI(sem_otime);
    114 	CVTI(sem_ctime);
    115 #undef CVT
    116 #undef CVTI
    117 }
    118 
    119 int	semctl(int, int, int, ...);
    120 int	__semctl(int, int, int, union __semun *);
    121 int	__semctl13(int, int, int, ...);
    122 int	__semctl14(int, int, int, ...);
    123 int	__semctl50(int, int, int, ...);
    124 int	____semctl50(int, int, int, ...);
    125 __END_DECLS
    126 
    127 #endif /* !_COMPAT_SYS_SEM_H_ */
    128