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 */