xref: /minix/sys/compat/sys/msg.h (revision 84d9c625)
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
__msqid_ds13_to_native(const struct msqid_ds13 * omsqbuf,struct msqid_ds * msqbuf)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
__native_to_msqid_ds13(const struct msqid_ds * msqbuf,struct msqid_ds13 * omsqbuf)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
__msqid_ds14_to_native(const struct msqid_ds14 * omsqbuf,struct msqid_ds * msqbuf)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
__native_to_msqid_ds14(const struct msqid_ds * msqbuf,struct msqid_ds14 * omsqbuf)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