1 /* $NetBSD: msg.h,v 1.7 2023/02/12 16:28:32 andvar Exp $ */ 2 3 /* 4 * SVID compatible msg.h file 5 * 6 * Author: Daniel Boulet 7 * 8 * Copyright 1993 Daniel Boulet and RTMX Inc. 9 * 10 * This system call was implemented by Daniel Boulet under contract from RTMX. 11 * 12 * Redistribution and use in source forms, with and without modification, 13 * are permitted provided that this entire comment appears intact. 14 * 15 * Redistribution in binary form may occur without any restrictions. 16 * Obviously, it would be nice if you gave credit where credit is due 17 * but requiring it would be too onerous. 18 * 19 * This software is provided ``AS IS'' without any warranties of any kind. 20 */ 21 22 #ifndef _COMPAT_SYS_MSG_H_ 23 #define _COMPAT_SYS_MSG_H_ 24 25 #include <compat/sys/ipc.h> 26 /* 27 * Old message queue data structure used before NetBSD 1.5. 28 */ 29 struct msqid_ds14 { 30 struct ipc_perm14 msg_perm; /* msg queue permission bits */ 31 struct __msg *msg_first; /* first message in the queue */ 32 struct __msg *msg_last; /* last message in the queue */ 33 u_long msg_cbytes; /* number of bytes in use on the queue */ 34 u_long msg_qnum; /* number of msgs in the queue */ 35 u_long msg_qbytes; /* max # of bytes on the queue */ 36 pid_t msg_lspid; /* pid of last msgsnd() */ 37 pid_t msg_lrpid; /* pid of last msgrcv() */ 38 int32_t msg_stime; /* time of last msgsnd() */ 39 long msg_pad1; 40 int32_t msg_rtime; /* time of last msgrcv() */ 41 long msg_pad2; 42 int32_t msg_ctime; /* time of last msgctl() */ 43 long msg_pad3; 44 long msg_pad4[4]; 45 }; 46 47 struct msqid_ds13 { 48 struct ipc_perm msg_perm; /* operation permission structure */ 49 msgqnum_t msg_qnum; /* number of messages in the queue */ 50 msglen_t msg_qbytes; /* max # of bytes in the queue */ 51 pid_t msg_lspid; /* process ID of last msgsend() */ 52 pid_t msg_lrpid; /* process ID of last msgrcv() */ 53 int32_t msg_stime; /* time of last msgsend() */ 54 int32_t msg_rtime; /* time of last msgrcv() */ 55 int32_t msg_ctime; /* time of last change */ 56 57 /* 58 * These members are private and used only in the internal 59 * implementation of this interface. 60 */ 61 struct __msg *_msg_first; /* first message in the queue */ 62 struct __msg *_msg_last; /* last message in the queue */ 63 msglen_t _msg_cbytes; /* # of bytes currently in queue */ 64 }; 65 66 /* Warning: 64-bit structure padding is needed here */ 67 struct msgid_ds_sysctl50 { 68 struct ipc_perm_sysctl msg_perm; 69 uint64_t msg_qnum; 70 uint64_t msg_qbytes; 71 uint64_t _msg_cbytes; 72 pid_t msg_lspid; 73 pid_t msg_lrpid; 74 int32_t msg_stime; 75 int32_t msg_rtime; 76 int32_t msg_ctime; 77 int32_t pad; 78 }; 79 struct msg_sysctl_info50 { 80 struct msginfo msginfo; 81 struct msgid_ds_sysctl50 msgids[1]; 82 }; 83 84 __BEGIN_DECLS 85 static __inline void __msqid_ds14_to_native(const struct msqid_ds14 *, struct msqid_ds *); 86 static __inline void __native_to_msqid_ds14(const struct msqid_ds *, struct msqid_ds14 *); 87 static __inline void __msqid_ds13_to_native(const struct msqid_ds13 *, struct msqid_ds *); 88 static __inline void __native_to_msqid_ds13(const struct msqid_ds *, struct msqid_ds13 *); 89 90 static __inline void 91 __msqid_ds13_to_native(const struct msqid_ds13 *omsqbuf, struct msqid_ds *msqbuf) 92 { 93 94 memset(msqbuf, 0, sizeof *msqbuf); 95 msqbuf->msg_perm = omsqbuf->msg_perm; 96 97 #define CVT(x) msqbuf->x = omsqbuf->x 98 CVT(msg_qnum); 99 CVT(msg_qbytes); 100 CVT(msg_lspid); 101 CVT(msg_lrpid); 102 CVT(msg_stime); 103 CVT(msg_rtime); 104 CVT(msg_ctime); 105 #undef CVT 106 } 107 108 static __inline void 109 __native_to_msqid_ds13(const struct msqid_ds *msqbuf, struct msqid_ds13 *omsqbuf) 110 { 111 112 memset(omsqbuf, 0, sizeof(*omsqbuf)); 113 omsqbuf->msg_perm = msqbuf->msg_perm; 114 115 #define CVT(x) omsqbuf->x = msqbuf->x 116 #define CVTI(x) omsqbuf->x = (int)msqbuf->x 117 CVT(msg_qnum); 118 CVT(msg_qbytes); 119 CVT(msg_lspid); 120 CVT(msg_lrpid); 121 CVTI(msg_stime); 122 CVTI(msg_rtime); 123 CVTI(msg_ctime); 124 #undef CVT 125 #undef CVTI 126 127 /* 128 * Not part of the API, but some programs might look at it. 129 */ 130 omsqbuf->_msg_cbytes = msqbuf->_msg_cbytes; 131 } 132 133 static __inline void 134 __msqid_ds14_to_native(const struct msqid_ds14 *omsqbuf, struct msqid_ds *msqbuf) 135 { 136 137 memset(msqbuf, 0, sizeof *msqbuf); 138 __ipc_perm14_to_native(&omsqbuf->msg_perm, &msqbuf->msg_perm); 139 140 #define CVT(x) msqbuf->x = omsqbuf->x 141 CVT(msg_qnum); 142 CVT(msg_qbytes); 143 CVT(msg_lspid); 144 CVT(msg_lrpid); 145 CVT(msg_stime); 146 CVT(msg_rtime); 147 CVT(msg_ctime); 148 #undef CVT 149 } 150 151 static __inline void 152 __native_to_msqid_ds14(const struct msqid_ds *msqbuf, struct msqid_ds14 *omsqbuf) 153 { 154 155 memset(omsqbuf, 0, sizeof *omsqbuf); 156 __native_to_ipc_perm14(&msqbuf->msg_perm, &omsqbuf->msg_perm); 157 158 #define CVT(x) omsqbuf->x = msqbuf->x 159 #define CVTI(x) omsqbuf->x = (int)msqbuf->x 160 CVT(msg_qnum); 161 CVT(msg_qbytes); 162 CVT(msg_lspid); 163 CVT(msg_lrpid); 164 CVTI(msg_stime); 165 CVTI(msg_rtime); 166 CVTI(msg_ctime); 167 #undef CVT 168 #undef CVTI 169 } 170 171 int __msgctl13(int, int, struct msqid_ds13 *); 172 int __msgctl14(int, int, struct msqid_ds14 *); 173 int __msgctl50(int, int, struct msqid_ds *); 174 __END_DECLS 175 176 #endif /* !_COMPAT_SYS_MSG_H_ */ 177