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
__semid_ds13_to_native(const struct semid_ds13 * osembuf,struct semid_ds * sembuf)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
__native_to_semid_ds13(const struct semid_ds * sembuf,struct semid_ds13 * osembuf)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
__semid_ds14_to_native(const struct semid_ds14 * osembuf,struct semid_ds * sembuf)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
__native_to_semid_ds14(const struct semid_ds * sembuf,struct semid_ds14 * osembuf)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