[BACK]Return to msg.h CVS log [TXT][DIR] Up to [local] / sys / sys

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