1 | /* $NetBSD: msg.h,v 1.4 2009/01/19 19:39:41 christos 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 strucure */ |
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 | msqbuf->msg_perm = omsqbuf->msg_perm; |
95 | |
96 | #define CVT(x) msqbuf->x = omsqbuf->x |
97 | CVT(msg_qnum); |
98 | CVT(msg_qbytes); |
99 | CVT(msg_lspid); |
100 | CVT(msg_lrpid); |
101 | CVT(msg_stime); |
102 | CVT(msg_rtime); |
103 | CVT(msg_ctime); |
104 | #undef CVT |
105 | } |
106 | |
107 | static __inline void |
108 | __native_to_msqid_ds13(const struct msqid_ds *msqbuf, struct msqid_ds13 *omsqbuf) |
109 | { |
110 | |
111 | omsqbuf->msg_perm = msqbuf->msg_perm; |
112 | |
113 | #define CVT(x) omsqbuf->x = msqbuf->x |
114 | #define CVTI(x) omsqbuf->x = (int)msqbuf->x |
115 | CVT(msg_qnum); |
116 | CVT(msg_qbytes); |
117 | CVT(msg_lspid); |
118 | CVT(msg_lrpid); |
119 | CVTI(msg_stime); |
120 | CVTI(msg_rtime); |
121 | CVTI(msg_ctime); |
122 | #undef CVT |
123 | #undef CVTI |
124 | |
125 | /* |
126 | * Not part of the API, but some programs might look at it. |
127 | */ |
128 | omsqbuf->_msg_cbytes = msqbuf->_msg_cbytes; |
129 | } |
130 | |
131 | static __inline void |
132 | __msqid_ds14_to_native(const struct msqid_ds14 *omsqbuf, struct msqid_ds *msqbuf) |
133 | { |
134 | |
135 | __ipc_perm14_to_native(&omsqbuf->msg_perm, &msqbuf->msg_perm); |
136 | |
137 | #define CVT(x) msqbuf->x = omsqbuf->x |
138 | CVT(msg_qnum); |
139 | CVT(msg_qbytes); |
140 | CVT(msg_lspid); |
141 | CVT(msg_lrpid); |
142 | CVT(msg_stime); |
143 | CVT(msg_rtime); |
144 | CVT(msg_ctime); |
145 | #undef CVT |
146 | } |
147 | |
148 | static __inline void |
149 | __native_to_msqid_ds14(const struct msqid_ds *msqbuf, struct msqid_ds14 *omsqbuf) |
150 | { |
151 | |
152 | __native_to_ipc_perm14(&msqbuf->msg_perm, &omsqbuf->msg_perm); |
153 | |
154 | #define CVT(x) omsqbuf->x = msqbuf->x |
155 | #define CVTI(x) omsqbuf->x = (int)msqbuf->x |
156 | CVT(msg_qnum); |
157 | CVT(msg_qbytes); |
158 | CVT(msg_lspid); |
159 | CVT(msg_lrpid); |
160 | CVTI(msg_stime); |
161 | CVTI(msg_rtime); |
162 | CVTI(msg_ctime); |
163 | #undef CVT |
164 | #undef CVTI |
165 | } |
166 | |
167 | int __msgctl13(int, int, struct msqid_ds13 *); |
168 | int __msgctl14(int, int, struct msqid_ds14 *); |
169 | int __msgctl50(int, int, struct msqid_ds *); |
170 | __END_DECLS |
171 | |
172 | #endif /* !_COMPAT_SYS_MSG_H_ */ |
173 | |