Annotation of sys/sys/msg.h, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: msg.h,v 1.13 2004/07/15 11:24:46 millert Exp $ */
2: /* $NetBSD: msg.h,v 1.9 1996/02/09 18:25:18 christos Exp $ */
3:
4: /*
5: * SVID compatible msg.h file
6: *
7: * Author: Daniel Boulet
8: *
9: * Copyright 1993 Daniel Boulet and RTMX Inc.
10: *
11: * This system call was implemented by Daniel Boulet under contract from RTMX.
12: *
13: * Redistribution and use in source forms, with and without modification,
14: * are permitted provided that this entire comment appears intact.
15: *
16: * Redistribution in binary form may occur without any restrictions.
17: * Obviously, it would be nice if you gave credit where credit is due
18: * but requiring it would be too onerous.
19: *
20: * This software is provided ``AS IS'' without any warranties of any kind.
21: */
22:
23: #ifndef _SYS_MSG_H_
24: #define _SYS_MSG_H_
25:
26: #include <sys/ipc.h>
27:
28: /*
29: * The MSG_NOERROR identifier value, the msqid_ds struct and the msg struct
30: * are as defined by the SV API Intel 386 Processor Supplement.
31: */
32:
33: #define MSG_NOERROR 010000 /* don't complain about too long msgs */
34:
35: struct msqid_ds {
36: struct ipc_perm msg_perm; /* msg queue permission bits */
37: struct msg *msg_first; /* first message in the queue */
38: struct msg *msg_last; /* last message in the queue */
39: unsigned long msg_cbytes; /* number of bytes in use on the queue */
40: unsigned long msg_qnum; /* number of msgs in the queue */
41: unsigned long msg_qbytes; /* max # of bytes on the queue */
42: pid_t msg_lspid; /* pid of last msgsnd() */
43: pid_t msg_lrpid; /* pid of last msgrcv() */
44: time_t msg_stime; /* time of last msgsnd() */
45: long msg_pad1;
46: time_t msg_rtime; /* time of last msgrcv() */
47: long msg_pad2;
48: time_t msg_ctime; /* time of last msgctl() */
49: long msg_pad3;
50: long msg_pad4[4];
51: };
52:
53: #ifdef _KERNEL
54: struct msqid_ds23 {
55: struct ipc_perm23 msg_perm; /* msg queue permission bits */
56: struct msg *msg_first; /* first message in the queue */
57: struct msg *msg_last; /* last message in the queue */
58: unsigned long msg_cbytes; /* number of bytes in use on the queue */
59: unsigned long msg_qnum; /* number of msgs in the queue */
60: unsigned long msg_qbytes; /* max # of bytes on the queue */
61: pid_t msg_lspid; /* pid of last msgsnd() */
62: pid_t msg_lrpid; /* pid of last msgrcv() */
63: time_t msg_stime; /* time of last msgsnd() */
64: long msg_pad1;
65: time_t msg_rtime; /* time of last msgrcv() */
66: long msg_pad2;
67: time_t msg_ctime; /* time of last msgctl() */
68: long msg_pad3;
69: long msg_pad4[4];
70: };
71:
72: struct msqid_ds35 {
73: struct ipc_perm35 msg_perm; /* msg queue permission bits */
74: struct msg *msg_first; /* first message in the queue */
75: struct msg *msg_last; /* last message in the queue */
76: unsigned long msg_cbytes; /* number of bytes in use on queue */
77: unsigned long msg_qnum; /* number of msgs in the queue */
78: unsigned long msg_qbytes; /* max # of bytes on the queue */
79: pid_t msg_lspid; /* pid of last msgsnd() */
80: pid_t msg_lrpid; /* pid of last msgrcv() */
81: time_t msg_stime; /* time of last msgsnd() */
82: long msg_pad1;
83: time_t msg_rtime; /* time of last msgrcv() */
84: long msg_pad2;
85: time_t msg_ctime; /* time of last msgctl() */
86: long msg_pad3;
87: long msg_pad4[4];
88: };
89: #endif
90:
91: struct msg {
92: struct msg *msg_next; /* next msg in the chain */
93: long msg_type; /* type of this message */
94: /* >0 -> type of this message */
95: /* 0 -> free header */
96: unsigned short msg_ts; /* size of this message */
97: short msg_spot; /* location of start of msg in buffer */
98: };
99:
100: /*
101: * Structure describing a message. The SVID doesn't suggest any
102: * particular name for this structure. There is a reference in the
103: * msgop man page that reads "The structure mymsg is an example of what
104: * this user defined buffer might look like, and includes the following
105: * members:". This sentence is followed by two lines equivalent
106: * to the mtype and mtext field declarations below. It isn't clear
107: * if "mymsg" refers to the naem of the structure type or the name of an
108: * instance of the structure...
109: */
110: struct mymsg {
111: long mtype; /* message type (+ve integer) */
112: char mtext[1]; /* message body */
113: };
114:
115:
116: #ifdef _KERNEL
117: /*
118: * Based on the configuration parameters described in an SVR2 (yes, two)
119: * config(1m) man page.
120: *
121: * Each message is broken up and stored in segments that are msgssz bytes
122: * long. For efficiency reasons, this should be a power of two. Also,
123: * it doesn't make sense if it is less than 8 or greater than about 256.
124: * Consequently, msginit in kern/sysv_msg.c checks that msgssz is a power of
125: * two between 8 and 1024 inclusive (and panic's if it isn't).
126: */
127: struct msginfo {
128: int msgmax, /* max chars in a message */
129: msgmni, /* max message queue identifiers */
130: msgmnb, /* max chars in a queue */
131: msgtql, /* max messages in system */
132: msgssz, /* size of a message segment (see notes above) */
133: msgseg; /* number of message segments */
134: };
135: #ifdef SYSVMSG
136: extern struct msginfo msginfo;
137: #endif
138:
139: struct msg_sysctl_info {
140: struct msginfo msginfo;
141: struct msqid_ds msgids[1];
142: };
143:
144: #ifndef MSGSSZ
145: #define MSGSSZ 8 /* Each segment must be 2^N long */
146: #endif
147: #ifndef MSGSEG
148: #define MSGSEG 2048 /* must be less than 32767 */
149: #endif
150: #undef MSGMAX /* ALWAYS compute MSGMAX! */
151: #define MSGMAX (MSGSSZ*MSGSEG)
152: #ifndef MSGMNB
153: #define MSGMNB 2048 /* max # of bytes in a queue */
154: #endif
155: #ifndef MSGMNI
156: #define MSGMNI 40
157: #endif
158: #ifndef MSGTQL
159: #define MSGTQL 40
160: #endif
161:
162: /*
163: * macros to convert between msqid_ds's and msqid's.
164: * (specific to this implementation)
165: */
166: #define MSQID(ix,ds) ((ix) & 0xffff | (((ds).msg_perm.seq << 16) & 0xffff0000))
167: #define MSQID_IX(id) ((id) & 0xffff)
168: #define MSQID_SEQ(id) (((id) >> 16) & 0xffff)
169: #endif
170:
171: /*
172: * The rest of this file is specific to this particular implementation.
173: */
174:
175: #ifdef _KERNEL
176:
177: /*
178: * Stuff allocated in machdep.h
179: */
180: struct msgmap {
181: short next; /* next segment in buffer */
182: /* -1 -> available */
183: /* 0..(MSGSEG-1) -> index of next segment */
184: };
185:
186: extern char *msgpool; /* MSGMAX byte long msg buffer pool */
187: extern struct msgmap *msgmaps; /* MSGSEG msgmap structures */
188: extern struct msg *msghdrs; /* MSGTQL msg headers */
189: extern struct msqid_ds *msqids; /* MSGMNI msqid_ds struct's */
190:
191: #define MSG_LOCKED 01000 /* Is this msqid_ds locked? */
192:
193: #endif
194:
195: #ifndef _KERNEL
196: #include <sys/cdefs.h>
197:
198: __BEGIN_DECLS
199: int msgctl(int, int, struct msqid_ds *);
200: int msgget(key_t, int);
201: int msgsnd(int, const void *, size_t, int);
202: int msgrcv(int, void *, size_t, long, int);
203: __END_DECLS
204: #else
205: struct proc;
206:
207: void msginit(void);
208: int msgctl1(struct proc *, int, int, caddr_t,
209: int (*)(const void *, void *, size_t),
210: int (*)(const void *, void *, size_t));
211: #endif /* !_KERNEL */
212:
213: #endif /* !_SYS_MSG_H_ */
CVSweb