xref: /illumos-gate/usr/src/uts/common/sys/msg.h (revision 9ee48d48fcedfa1c02bcd16d6abbbfd28b9726c1)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 2014 Garrett D'Amore <garrett@damore.org>
24  *
25  * Copyright 1999-2003 Sun Microsystems, Inc.  All rights reserved.
26  * Use is subject to license terms.
27  */
28 
29 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
30 /*	  All Rights Reserved	*/
31 
32 
33 #ifndef _SYS_MSG_H
34 #define	_SYS_MSG_H
35 
36 #include <sys/ipc.h>
37 
38 #ifdef	__cplusplus
39 extern "C" {
40 #endif
41 
42 /*
43  * IPC Message Facility.
44  */
45 
46 /*
47  * Implementation Constants.
48  */
49 
50 /*
51  * Permission Definitions.
52  */
53 #define	MSG_R	0400	/* read permission */
54 #define	MSG_W	0200	/* write permission */
55 
56 /*
57  * ipc_perm Mode Definitions.
58  */
59 #define	MSG_RWAIT	01000	/* a reader is waiting for a message */
60 #define	MSG_WWAIT	02000	/* a writer is waiting to send */
61 
62 /*
63  * Message Operation Flags.
64  */
65 #define	MSG_NOERROR	010000	/* no error if big message */
66 
67 typedef unsigned long msgqnum_t;
68 typedef unsigned long msglen_t;
69 
70 struct msg;
71 struct msqid_ds {
72 	struct ipc_perm	msg_perm;	/* operation permission struct */
73 	struct msg	*msg_first;	/* ptr to first message on q */
74 	struct msg	*msg_last;	/* ptr to last message on q */
75 	msglen_t	msg_cbytes;	/* current # bytes on q */
76 	msgqnum_t	msg_qnum;	/* # of messages on q */
77 	msglen_t	msg_qbytes;	/* max # of bytes on q */
78 	pid_t		msg_lspid;	/* pid of last msgsnd */
79 	pid_t		msg_lrpid;	/* pid of last msgrcv */
80 #if defined(_LP64)
81 	time_t		msg_stime;	/* last msgsnd time */
82 	time_t		msg_rtime;	/* last msgrcv time */
83 	time_t		msg_ctime;	/* last change time */
84 #else
85 	time_t		msg_stime;	/* last msgsnd time */
86 	int32_t		msg_pad1;	/* reserved for time_t expansion */
87 	time_t		msg_rtime;	/* last msgrcv time */
88 	int32_t		msg_pad2;	/* time_t expansion */
89 	time_t		msg_ctime;	/* last change time */
90 	int32_t		msg_pad3;	/* time_t expansion */
91 #endif
92 	short		msg_cv;
93 	short		msg_qnum_cv;
94 	long		msg_pad4[3];	/* reserve area */
95 };
96 
97 /*
98  * User message buffer template for msgsnd and msgrecv system calls.
99  */
100 
101 #ifdef _KERNEL
102 struct ipcmsgbuf {
103 #else
104 struct msgbuf {
105 #endif /* _KERNEL */
106 #if defined(_XOPEN_SOURCE)
107 	long	_mtype;		/* message type */
108 	char	_mtext[1];	/* message text */
109 #else
110 	long	mtype;		/* message type */
111 	char	mtext[1];	/* message text */
112 #endif
113 };
114 
115 /*
116  * Header and message header structures for msgsnap() system call.
117  */
118 struct msgsnap_head {
119 	size_t	msgsnap_size;	/* bytes consumed/required in the buffer */
120 	size_t	msgsnap_nmsg;	/* number of messages in the buffer */
121 };
122 
123 struct msgsnap_mhead {
124 	size_t	msgsnap_mlen;	/* number of bytes in message that follows */
125 	long	msgsnap_mtype;	/* message type */
126 };
127 
128 #if !defined(_KERNEL)
129 int msgctl(int, int, struct msqid_ds *);
130 int msgget(key_t, int);
131 int msgids(int *, uint_t, uint_t *);
132 int msgsnap(int, void *, size_t, long);
133 ssize_t msgrcv(int, void *, size_t, long, int);
134 int msgsnd(int, const void *, size_t, int);
135 #endif /* ! _KERNEL */
136 
137 #ifdef	__cplusplus
138 }
139 #endif
140 
141 #endif	/* _SYS_MSG_H */
142