1 /** 2 * D header file for POSIX. 3 * 4 * Authors: Neven Miculinić 5 */ 6 7 module core.sys.posix.sys.msg; 8 9 import core.sys.posix.config; 10 import core.sys.posix.sys.ipc; 11 import core.sys.posix.sys.types; 12 import core.stdc.config; 13 14 version (CRuntime_Glibc): 15 // Some of these may be from linux kernel headers. 16 extern (C): 17 18 version (ARM) version = ARM_Any; 19 version (AArch64) version = ARM_Any; 20 version (HPPA) version = HPPA_Any; 21 version (HPPA64) version = HPPA_Any; 22 version (MIPS32) version = MIPS_Any; 23 version (MIPS64) version = MIPS_Any; 24 version (PPC) version = PPC_Any; 25 version (PPC64) version = PPC_Any; 26 version (RISCV32) version = RISCV_Any; 27 version (RISCV64) version = RISCV_Any; 28 version (S390) version = IBMZ_Any; 29 version (SPARC) version = SPARC_Any; 30 version (SPARC64) version = SPARC_Any; 31 version (SystemZ) version = IBMZ_Any; 32 33 version (linux) 34 { 35 enum MSG_STAT = 11; 36 enum MSG_INFO = 12; 37 38 enum MSG_NOERROR = 1 << 12; // octal!10000 39 enum MSG_EXCEPT = 2 << 12; // octal!20000 40 enum MSG_COPY = 4 << 12; // octal!40000 41 42 struct msginfo 43 { 44 int msgpool; 45 int msgmap; 46 int msgmax; 47 int msgmnb; 48 int msgmni; 49 int msgssz; 50 int msgtql; 51 ushort msgseg; 52 } 53 54 version (Alpha) version = GENERICMSQ; 55 version (ARM_Any) version = GENERICMSQ; 56 version (IA64) version = GENERICMSQ; 57 version (IBMZ_Any) version = GENERICMSQ; 58 version (RISCV_Any) version = GENERICMSQ; 59 version (LoongArch64) version = GENERICMSQ; 60 61 version (GENERICMSQ) 62 { 63 // https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/bits/msq-pad.h 64 private enum MSQ_PAD_AFTER_TIME = (__WORDSIZE == 32); 65 private enum MSQ_PAD_BEFORE_TIME = false; 66 } 67 else version (HPPA_Any) 68 { 69 // https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/hppa/bits/msq-pad.h 70 private enum MSQ_PAD_AFTER_TIME = false; 71 private enum MSQ_PAD_BEFORE_TIME = (__WORDSIZE == 32); 72 } 73 else version (MIPS_Any) 74 { 75 // https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/mips/bits/msq-pad.h 76 version (LittleEndian) 77 { 78 private enum MSQ_PAD_AFTER_TIME = (__WORDSIZE == 32); 79 private enum MSQ_PAD_BEFORE_TIME = false; 80 } 81 else 82 { 83 private enum MSQ_PAD_AFTER_TIME = false; 84 private enum MSQ_PAD_BEFORE_TIME = (__WORDSIZE == 32); 85 } 86 } 87 else version (PPC_Any) 88 { 89 // https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/powerpc/bits/msq-pad.h 90 private enum MSQ_PAD_AFTER_TIME = false; 91 private enum MSQ_PAD_BEFORE_TIME = (__WORDSIZE == 32); 92 } 93 else version (SPARC_Any) 94 { 95 // https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/sparc/bits/msq-pad.h 96 private enum MSQ_PAD_AFTER_TIME = false; 97 private enum MSQ_PAD_BEFORE_TIME = (__WORDSIZE == 32); 98 } 99 else version (X86) 100 { 101 // https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/x86/bits/msq-pad.h 102 private enum MSQ_PAD_AFTER_TIME = true; 103 private enum MSQ_PAD_BEFORE_TIME = false; 104 } 105 else version (X86_64) 106 { 107 // https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/x86/bits/msq-pad.h 108 private enum MSQ_PAD_AFTER_TIME = false; 109 private enum MSQ_PAD_BEFORE_TIME = false; 110 } 111 else 112 static assert(0, "unimplemented"); 113 114 // https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/bits/msq.h 115 alias msgqnum_t = ulong_t; 116 alias msglen_t = ulong_t; 117 118 static if (MSQ_PAD_BEFORE_TIME) 119 { 120 struct msqid_ds 121 { 122 ipc_perm msg_perm; 123 c_ulong __glibc_reserved1; 124 time_t msg_stime; 125 c_ulong __glibc_reserved2; 126 time_t msg_rtime; 127 c_ulong __glibc_reserved3; 128 time_t msg_ctime; 129 ulong_t __msg_cbytes; 130 msgqnum_t msg_qnum; 131 msglen_t msg_qbytes; 132 pid_t msg_lspid; 133 pid_t msg_lrpid; 134 ulong_t __glibc_reserved4; 135 ulong_t __glibc_reserved5; 136 } 137 } 138 else static if (MSQ_PAD_AFTER_TIME) 139 { 140 struct msqid_ds 141 { 142 ipc_perm msg_perm; 143 time_t msg_stime; 144 c_ulong __glibc_reserved1; 145 time_t msg_rtime; 146 c_ulong __glibc_reserved2; 147 time_t msg_ctime; 148 c_ulong __glibc_reserved3; 149 ulong_t __msg_cbytes; 150 msgqnum_t msg_qnum; 151 msglen_t msg_qbytes; 152 pid_t msg_lspid; 153 pid_t msg_lrpid; 154 ulong_t __glibc_reserved4; 155 ulong_t __glibc_reserved5; 156 } 157 } 158 else 159 { 160 struct msqid_ds 161 { 162 ipc_perm msg_perm; 163 time_t msg_stime; 164 time_t msg_rtime; 165 time_t msg_ctime; 166 ulong_t __msg_cbytes; 167 msgqnum_t msg_qnum; 168 msglen_t msg_qbytes; 169 pid_t msg_lspid; 170 pid_t msg_lrpid; 171 ulong_t __glibc_reserved4; 172 ulong_t __glibc_reserved5; 173 } 174 } 175 } 176 else 177 { 178 // https://sourceware.org/git/?p=glibc.git;a=blob;f=bits/msq.h 179 enum MSG_NOERROR = 1 << 12; // octal!10000 180 181 alias msgqnum_t = ushort; 182 alias msglen_t = ushort; 183 184 struct msqid_ds 185 { 186 ipc_perm msg_perm; 187 time_t msg_stime; 188 time_t msg_rtime; 189 time_t msg_ctime; 190 msgqnum_t msg_qnum; 191 msglen_t msg_qbytes; 192 pid_t msg_lspid; 193 pid_t msg_lrpid; 194 } 195 } 196 197 struct msgbuf 198 { 199 c_long mtype; 200 char[1] mtext = 0; 201 } 202 203 int msgctl(int msqid, int cmd, msqid_ds* __buf); 204 int msgget(key_t key, int msgflg); 205 ssize_t msgrcv(int msqid, void* msgp, size_t msgsz, c_long msgtyp, int msgflg); 206 int msgsnd(int msqid, msgbuf* msgp, int msgsz, int msgflg);