msg.h revision 108048
150477Speter/* $FreeBSD: head/sys/sys/msg.h 108048 2002-12-18 18:22:06Z mike $ */
22729Sdfr/*	$NetBSD: msg.h,v 1.4 1994/06/29 06:44:43 cgd Exp $	*/
32729Sdfr
42729Sdfr/*
52729Sdfr * SVID compatible msg.h file
62729Sdfr *
72729Sdfr * Author:  Daniel Boulet
82729Sdfr *
92729Sdfr * Copyright 1993 Daniel Boulet and RTMX Inc.
102729Sdfr *
112729Sdfr * This system call was implemented by Daniel Boulet under contract from RTMX.
122729Sdfr *
132729Sdfr * Redistribution and use in source forms, with and without modification,
142729Sdfr * are permitted provided that this entire comment appears intact.
152729Sdfr *
162729Sdfr * Redistribution in binary form may occur without any restrictions.
172729Sdfr * Obviously, it would be nice if you gave credit where credit is due
182729Sdfr * but requiring it would be too onerous.
192729Sdfr *
202729Sdfr * This software is provided ``AS IS'' without any warranties of any kind.
212729Sdfr */
222729Sdfr
232729Sdfr#ifndef _SYS_MSG_H_
242729Sdfr#define _SYS_MSG_H_
252729Sdfr
26108048Smike#include <sys/cdefs.h>
27108048Smike#include <sys/_types.h>
282729Sdfr#include <sys/ipc.h>
292729Sdfr
302729Sdfr/*
312729Sdfr * The MSG_NOERROR identifier value, the msqid_ds struct and the msg struct
322729Sdfr * are as defined by the SV API Intel 386 Processor Supplement.
332729Sdfr */
342729Sdfr
352729Sdfr#define MSG_NOERROR	010000		/* don't complain about too long msgs */
362729Sdfr
37108048Smiketypedef	unsigned long	msglen_t;
38108048Smiketypedef	unsigned long	msgqnum_t;
39108048Smike
40108048Smike#ifndef _PID_T_DECLARED
41108048Smiketypedef	__pid_t		pid_t;
42108048Smike#define	_PID_T_DECLARED
43108048Smike#endif
44108048Smike
45108048Smike#ifndef _TIME_T_DECLARED
46108048Smiketypedef	__time_t	time_t;
47108048Smike#define	_TIME_T_DECLARED
48108048Smike#endif
49108048Smike
50108048Smike#ifndef _SIZE_T_DECLARED
51108048Smiketypedef	__size_t	size_t;
52108048Smike#define	_SIZE_T_DECLARED
53108048Smike#endif
54108048Smike
55108048Smike#ifndef _SSIZE_T_DECLARED
56108048Smiketypedef	__ssize_t	ssize_t;
57108048Smike#define	_SSIZE_T_DECLARED
58108048Smike#endif
59108048Smike
60108048Smike/* XXX namespace pollution. */
6159839Speterstruct msg;
6259839Speter
632729Sdfrstruct msqid_ds {
642729Sdfr	struct	ipc_perm msg_perm;	/* msg queue permission bits */
652729Sdfr	struct	msg *msg_first;	/* first message in the queue */
662729Sdfr	struct	msg *msg_last;	/* last message in the queue */
67108048Smike	msglen_t msg_cbytes;	/* number of bytes in use on the queue */
68108048Smike	msgqnum_t msg_qnum;	/* number of msgs in the queue */
69108048Smike	msglen_t msg_qbytes;	/* max # of bytes on the queue */
702729Sdfr	pid_t	msg_lspid;	/* pid of last msgsnd() */
712729Sdfr	pid_t	msg_lrpid;	/* pid of last msgrcv() */
722729Sdfr	time_t	msg_stime;	/* time of last msgsnd() */
732729Sdfr	long	msg_pad1;
742729Sdfr	time_t	msg_rtime;	/* time of last msgrcv() */
752729Sdfr	long	msg_pad2;
762729Sdfr	time_t	msg_ctime;	/* time of last msgctl() */
772729Sdfr	long	msg_pad3;
782729Sdfr	long	msg_pad4[4];
792729Sdfr};
802729Sdfr
81108048Smike#if __BSD_VISIBLE
822729Sdfr/*
832729Sdfr * Structure describing a message.  The SVID doesn't suggest any
842729Sdfr * particular name for this structure.  There is a reference in the
852729Sdfr * msgop man page that reads "The structure mymsg is an example of what
862729Sdfr * this user defined buffer might look like, and includes the following
872729Sdfr * members:".  This sentence is followed by two lines equivalent
882729Sdfr * to the mtype and mtext field declarations below.  It isn't clear
89101971Salfred * if "mymsg" refers to the name of the structure type or the name of an
902729Sdfr * instance of the structure...
912729Sdfr */
922729Sdfrstruct mymsg {
932729Sdfr	long	mtype;		/* message type (+ve integer) */
942729Sdfr	char	mtext[1];	/* message body */
952729Sdfr};
96108048Smike#endif
972729Sdfr
9859839Speter#ifdef _KERNEL
9959839Speter
1002729Sdfr/*
1012729Sdfr * Based on the configuration parameters described in an SVR2 (yes, two)
1022729Sdfr * config(1m) man page.
1032729Sdfr *
1042729Sdfr * Each message is broken up and stored in segments that are msgssz bytes
1052729Sdfr * long.  For efficiency reasons, this should be a power of two.  Also,
1062729Sdfr * it doesn't make sense if it is less than 8 or greater than about 256.
1072729Sdfr * Consequently, msginit in kern/sysv_msg.c checks that msgssz is a power of
1082729Sdfr * two between 8 and 1024 inclusive (and panic's if it isn't).
1092729Sdfr */
1102729Sdfrstruct msginfo {
1112729Sdfr	int	msgmax,		/* max chars in a message */
1122729Sdfr		msgmni,		/* max message queue identifiers */
1132729Sdfr		msgmnb,		/* max chars in a queue */
1142729Sdfr		msgtql,		/* max messages in system */
1152729Sdfr		msgssz,		/* size of a message segment (see notes above) */
1162729Sdfr		msgseg;		/* number of message segments */
1172729Sdfr};
1182836Sdgextern struct msginfo	msginfo;
1192729Sdfr#endif
1202729Sdfr
12159839Speter#ifndef _KERNEL
1222729Sdfr
1232729Sdfr__BEGIN_DECLS
12492719Salfredint msgctl(int, int, struct msqid_ds *);
12592719Salfredint msgget(key_t, int);
126108048Smike/* XXX return value should be ssize_t. */
127108048Smikeint msgrcv(int, void *, size_t, long, int);
128108048Smike/* XXX second parameter missing const type-qualifier. */
12992719Salfredint msgsnd(int, void *, size_t, int);
130108048Smike#if __BSD_VISIBLE
131108048Smikeint msgsys(int, ...);
132108048Smike#endif
1332729Sdfr__END_DECLS
134108048Smike
13555205Speter#endif
1362729Sdfr
1372729Sdfr#endif /* !_SYS_MSG_H_ */
138