1 /* $NetBSD: shm.h,v 1.7 2009/04/01 21:15:23 christos Exp $ */ 2 3 /* 4 * Copyright (c) 1994 Adam Glass 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. All advertising materials mentioning features or use of this software 16 * must display the following acknowledgement: 17 * This product includes software developed by Adam Glass. 18 * 4. The name of the author may not be used to endorse or promote products 19 * derived from this software without specific prior written permission 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 22 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 23 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 24 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 26 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 30 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 /* 34 * As defined+described in "X/Open System Interfaces and Headers" 35 * Issue 4, p. XXX 36 */ 37 38 #ifndef _COMPAT_SYS_SHM_H_ 39 #define _COMPAT_SYS_SHM_H_ 40 41 #include <compat/sys/ipc.h> 42 43 struct shmid_ds14 { 44 struct ipc_perm14 shm_perm; /* operation permission structure */ 45 int shm_segsz; /* size of segment in bytes */ 46 pid_t shm_lpid; /* process ID of last shm op */ 47 pid_t shm_cpid; /* process ID of creator */ 48 short shm_nattch; /* number of current attaches */ 49 int32_t shm_atime; /* time of last shmat() */ 50 int32_t shm_dtime; /* time of last shmdt() */ 51 int32_t shm_ctime; /* time of last change by shmctl() */ 52 void *shm_internal; /* sysv stupidity */ 53 }; 54 55 struct shmid_ds13 { 56 struct ipc_perm shm_perm; /* operation permission structure */ 57 size_t shm_segsz; /* size of segment in bytes */ 58 pid_t shm_lpid; /* process ID of last shm operation */ 59 pid_t shm_cpid; /* process ID of creator */ 60 shmatt_t shm_nattch; /* number of current attaches */ 61 int32_t shm_atime; /* time of last shmat() */ 62 int32_t shm_dtime; /* time of last shmdt() */ 63 int32_t shm_ctime; /* time of last change by shmctl() */ 64 65 /* 66 * These members are private and used only in the internal 67 * implementation of this interface. 68 */ 69 void *_shm_internal; 70 }; 71 72 /* Warning: 64-bit structure padding is needed here */ 73 struct shmid_ds_sysctl50 { 74 struct ipc_perm_sysctl shm_perm; 75 uint64_t shm_segsz; 76 pid_t shm_lpid; 77 pid_t shm_cpid; 78 int32_t shm_atime; 79 int32_t shm_dtime; 80 int32_t shm_ctime; 81 uint32_t shm_nattch; 82 }; 83 struct shm_sysctl_info50 { 84 struct shminfo shminfo; 85 struct shmid_ds_sysctl50 shmids[1]; 86 }; 87 88 __BEGIN_DECLS 89 static __inline void __shmid_ds14_to_native(const struct shmid_ds14 *, struct shmid_ds *); 90 static __inline void __native_to_shmid_ds14(const struct shmid_ds *, struct shmid_ds14 *); 91 static __inline void __shmid_ds13_to_native(const struct shmid_ds13 *, struct shmid_ds *); 92 static __inline void __native_to_shmid_ds13(const struct shmid_ds *, struct shmid_ds13 *); 93 static __inline void 94 __shmid_ds14_to_native(const struct shmid_ds14 *oshmbuf, struct shmid_ds *shmbuf) 95 { 96 97 __ipc_perm14_to_native(&oshmbuf->shm_perm, &shmbuf->shm_perm); 98 99 #define CVT(x) shmbuf->x = oshmbuf->x 100 CVT(shm_segsz); 101 CVT(shm_lpid); 102 CVT(shm_cpid); 103 CVT(shm_nattch); 104 CVT(shm_atime); 105 CVT(shm_dtime); 106 CVT(shm_ctime); 107 #undef CVT 108 } 109 110 static __inline void 111 __native_to_shmid_ds14(const struct shmid_ds *shmbuf, struct shmid_ds14 *oshmbuf) 112 { 113 114 __native_to_ipc_perm14(&shmbuf->shm_perm, &oshmbuf->shm_perm); 115 116 #define CVT(x) oshmbuf->x = shmbuf->x 117 #define CVTI(x) oshmbuf->x = (int)shmbuf->x 118 CVTI(shm_segsz); 119 CVT(shm_lpid); 120 CVT(shm_cpid); 121 CVT(shm_nattch); 122 CVTI(shm_atime); 123 CVTI(shm_dtime); 124 CVTI(shm_ctime); 125 #undef CVT 126 #undef CVTI 127 } 128 129 static __inline void 130 __shmid_ds13_to_native(const struct shmid_ds13 *oshmbuf, struct shmid_ds *shmbuf) 131 { 132 133 shmbuf->shm_perm = oshmbuf->shm_perm; 134 135 #define CVT(x) shmbuf->x = oshmbuf->x 136 CVT(shm_segsz); 137 CVT(shm_lpid); 138 CVT(shm_cpid); 139 CVT(shm_nattch); 140 CVT(shm_atime); 141 CVT(shm_dtime); 142 CVT(shm_ctime); 143 #undef CVT 144 } 145 146 static __inline void 147 __native_to_shmid_ds13(const struct shmid_ds *shmbuf, struct shmid_ds13 *oshmbuf) 148 { 149 150 oshmbuf->shm_perm = shmbuf->shm_perm; 151 152 #define CVT(x) oshmbuf->x = shmbuf->x 153 #define CVTI(x) oshmbuf->x = (int)shmbuf->x 154 CVT(shm_segsz); 155 CVT(shm_lpid); 156 CVT(shm_cpid); 157 CVT(shm_nattch); 158 CVTI(shm_atime); 159 CVTI(shm_dtime); 160 CVTI(shm_ctime); 161 #undef CVT 162 #undef CVTI 163 } 164 165 int __shmctl13(int, int, struct shmid_ds13 *); 166 int __shmctl14(int, int, struct shmid_ds14 *); 167 int __shmctl50(int, int, struct shmid_ds *); 168 __END_DECLS 169 170 #endif /* !_COMPAT_SYS_SHM_H_ */ 171