Annotation of coherent/f/usr/include/sys/stream.h, revision 1.1

1.1     ! root        1: #ifndef __SYS_STREAM_H__
        !             2: #define __SYS_STREAM_H__
        !             3: 
        !             4: /*
        !             5:  * This ^^^^^^^^^^^^^^^^ symbol is used in the DDI/DKI header <sys/ddi.h> to
        !             6:  * determine which #undef directives it is required to perform, on the basis
        !             7:  * that it should avoid touching namespaces unless they have been reserved
        !             8:  * by the inclusion of a header which reserves such classes of names.
        !             9:  */
        !            10: 
        !            11: /*
        !            12:  *-IMPORTS:
        !            13:  *     <common/ccompat.h>
        !            14:  *             __PROTO ()
        !            15:  *             __EXTERN_C_BEGIN__
        !            16:  *             __EXTERN_C_END__
        !            17:  *             __VOID__
        !            18:  *     <common/_cred.h>
        !            19:  *             cred_t
        !            20:  *     <kernel/_toid.h>
        !            21:  *             toid_t
        !            22:  *     <kernel/x86lock.h>
        !            23:  *             atomic_uchar_t
        !            24:  *     <sys/types.h>
        !            25:  *             caddr_t
        !            26:  */
        !            27: 
        !            28: #include <common/ccompat.h>
        !            29: #include <common/_cred.h>
        !            30: #include <kernel/_toid.h>
        !            31: #include <kernel/x86lock.h>
        !            32: #include <sys/types.h>
        !            33: 
        !            34: #include <common/_stream.h>
        !            35: 
        !            36: /*
        !            37:  * Public section of the <sys/stream.h> file, for consumption by user
        !            38:  * application code using access to the STREAMS messaging system, and
        !            39:  * by STREAMS drivers.
        !            40:  *
        !            41:  * The information in this header is directly related to the information
        !            42:  * published in the System V, Release 4 STREAMS Programmer's Guide,
        !            43:  * Appendices A and B.
        !            44:  */
        !            45: 
        !            46: 
        !            47: /*
        !            48:  * Message types. The particular values here may have some significance
        !            49:  * to some macros defined later, particularly datamsg ().
        !            50:  */
        !            51: 
        !            52: #define M_PRI           0x80
        !            53: #define QPCTL           M_PRI
        !            54: 
        !            55: /* regular messages */
        !            56: 
        !            57: #define M_DATA          0
        !            58: #define M_PROTO         1
        !            59: #define M_DELAY         2
        !            60: 
        !            61: #define M_IOCTL         3
        !            62: #define M_SETOPTS       4
        !            63: #define M_SIG           5
        !            64: #define M_CTL           6
        !            65: #define M_BREAK         7
        !            66: #define M_PASSFP        8
        !            67: #define        M_RSE           9
        !            68: 
        !            69: /* priority messages */
        !            70: 
        !            71: #define M_PCPROTO       (1 + M_PRI)
        !            72: #define M_IOCACK        (3 + M_PRI)
        !            73: #define M_IOCNAK        (4 + M_PRI)
        !            74: #define M_PCSIG         (5 + M_PRI)
        !            75: #define M_ERROR         (6 + M_PRI)
        !            76: #define M_FLUSH         (7 + M_PRI)
        !            77: #define M_HANGUP        (8 + M_PRI)
        !            78: #define M_START         (9 + M_PRI)
        !            79: #define M_STOP          (10 + M_PRI)
        !            80: #define        M_COPYIN        (11 + M_PRI)
        !            81: #define        M_COPYOUT       (12 + M_PRI)
        !            82: #define        M_IOCDATA       (13 + M_PRI)
        !            83: #define        M_PCRSE         (14 + M_PRI)
        !            84: #define        M_READ          (15 + M_PRI)
        !            85: #define        M_STARTI        (16 + M_PRI)
        !            86: #define        M_STOPI         (17 + M_PRI)
        !            87: 
        !            88: 
        !            89: struct streamtab {
        !            90:        struct qinit  * st_rdinit;      /* defines read QUEUE */
        !            91:        struct qinit  * st_wrinit;      /* defines write QUEUE */
        !            92:        struct qinit  * st_muxrinit;    /* for multiplexing drivers only */
        !            93:        struct qinit  * st_muxwinit;    /* for multiplexing drivers only */
        !            94: };
        !            95: 
        !            96: 
        !            97: /*
        !            98:  * Private type definitions.
        !            99:  */
        !           100: 
        !           101: typedef        atomic_uchar_t  __str_lock_t;
        !           102: 
        !           103: 
        !           104: /*
        !           105:  * QUEUE structures - these structures are used to build streams.
        !           106:  *
        !           107:  * Note that "queue_t" structures occur in pairs, first the write queue, then
        !           108:  * the read queue. The QREADR flag distinguishes them for the RD (q), WR (q)
        !           109:  * and OTHERQ (q) macros.
        !           110:  *
        !           111:  * The System V DDI/DKI adds multiprocessor support to STREAMS via the notion
        !           112:  * of "freezing" a stream, something mostly analagous to a basic lock. We can
        !           113:  * implement this facility either in terms of the primitive machine-specific
        !           114:  * atomic operations, or in terms of the DDI/DKI high-level lock operations.
        !           115:  *
        !           116:  * For now, we choose the latter.
        !           117:  */
        !           118: 
        !           119: struct queue {
        !           120:        struct qinit  * q_qinfo;        /* procedures and limits for queue */
        !           121:        mblk_t        * q_first;        /* head of message queue for QUEUE */
        !           122:        mblk_t        * q_last;         /* tail of message queue for QUEUE */
        !           123:        queue_t       * q_next;         /* next QUEUE in stream */
        !           124:        queue_t       * q_link;         /* next on STEAMS scheduling list */
        !           125:        __VOID__      * q_ptr;          /* to private data structure */
        !           126:        unsigned long   q_count;        /* number of characters in queue */
        !           127:        unsigned long   q_flag;         /* QUEUE state */
        !           128:        long            q_minpsz;       /* minimum packet size accepted */
        !           129:        long            q_maxpsz;       /* maximum packet size accepted */
        !           130:        unsigned long   q_hiwat;        /* message queue high water mark */
        !           131:        unsigned long   q_lowat;        /* message queue low water mark */
        !           132:        qband_t       * q_bandp;        /* separate flow information */
        !           133:        unsigned char   q_nband;        /* number of priority bands */
        !           134:        unsigned char   q_pad1 [3];     /* reserved for future use */
        !           135:        long            q_pad2 [2];     /* reserved for future use */
        !           136: 
        !           137:        /*
        !           138:         * Data from this point are MWC extensions for multiprocessing. The
        !           139:         * DDI/DKI revokes user's right to know about the size of the
        !           140:         * structure, among other things.
        !           141:         */
        !           142: 
        !           143:        unsigned char   q_active;       /* count of active put/srv routines */
        !           144:        unsigned char   q_lastband;     /* band of last retrieved message */
        !           145:        __str_lock_t    q_locked;       /* hack implementation of freezing */
        !           146: };
        !           147: 
        !           148: /*
        !           149:  * Hack around the union above. This field should only be referred to by some
        !           150:  * layering macros in <sys/strmlib.h> anyway, but we try and keep it clean.
        !           151:  */
        !           152: 
        !           153: #define        q_lock  x.q_lock
        !           154: 
        !           155: 
        !           156: /*
        !           157:  * Queue flag definitions : these are internal to the system, and the values
        !           158:  * bear no relation to any definitions in System V. Drivers use these flags at
        !           159:  * their own risk...
        !           160:  */
        !           161: 
        !           162: #define QENAB          0x0001          /* queue is on qenable () schedule */
        !           163: #define        QWANTR          0x0002          /* someone wants to read from the queue */
        !           164: #define        QWANTW          0x0004          /* someone wants to write to the queue */
        !           165: #define        QFULL           0x0008          /* queue is full */
        !           166: #define        QREADR          0x0010          /* set for read queues */
        !           167: #define QNOENB         0x0020          /* prevent queue from being enabled */
        !           168: #define        QBACK           0x0040          /* queue has been back-enabled */
        !           169: #define        QOLD            0x0080          /* pre-SVR4 open/close interface */
        !           170: #define        QPROCSOFF       0x0100          /* put/service routines disabled */
        !           171: #define        QDRAIN          0x0200          /* waiting for queue to drain */
        !           172: #define        QSRVACTIVE      0x0400          /* service routine is active */
        !           173: 
        !           174: /* #define     QUSE            ?????            queue has been allocated */
        !           175: /* #define     QHLIST          ?????            SVR4, not used by this implementation */
        !           176: 
        !           177: 
        !           178: /*
        !           179:  * queue priority-band information.
        !           180:  */
        !           181: 
        !           182: struct qband {
        !           183:        struct qband  * qb_next;        /* next band's info */
        !           184:        unsigned long   qb_count;       /* count of bytes in band */
        !           185:        struct msgb   * qb_first;       /* beginning of band's data */
        !           186:        struct msgb   * qb_last;        /* end of band's data */
        !           187:        unsigned long   qb_hiwat;       /* high water mark for band */
        !           188:        unsigned long   qb_lowat;       /* low water mark for band */
        !           189:        unsigned long   qb_flag;        /* flags, see below */
        !           190:        unsigned long   qb_pad1;        /* reserved for future use */
        !           191: };
        !           192: 
        !           193: 
        !           194: 
        !           195: /* Flags used in band structure */
        !           196: 
        !           197: #define        QB_FULL         0x0001          /* band is considered full */
        !           198: #define        QB_WANTW        0x0002          /* someone wants to write to band */
        !           199: #define        QB_BACK         0x0004          /* queue has been back-enabled */
        !           200: 
        !           201: /* non-SVR4 flag */
        !           202: #define        QB_FIRST        0x0100          /* first entry in allocation unit */
        !           203: 
        !           204: 
        !           205: /*
        !           206:  * Message structures - the format of STREAMS messages and message data
        !           207:  * blocks.
        !           208:  */
        !           209: 
        !           210: struct msgb {
        !           211:        struct msgb   * b_next;         /* next message on queue */
        !           212:        struct msgb   * b_prev;         /* previous message on queue */
        !           213:        struct msgb   * b_cont;         /* next message block of message */
        !           214:        unsigned char * b_rptr;         /* first unread data byte in buffer */
        !           215:        unsigned char * b_wptr;         /* first unwritten data byte in buffer */
        !           216:        struct datab  * b_datap;        /* data block */
        !           217: 
        !           218:        unsigned char   b_band;         /* message priority */
        !           219:        unsigned char   b_pad1;
        !           220:        unsigned short  b_flag;         /* message flags */
        !           221:        long            b_pad2;
        !           222: };
        !           223: 
        !           224: 
        !           225: /* Flag definitions for message blocks */
        !           226: 
        !           227: #define        MSGMARK         0x0001          /* last byte of message is "marked" */
        !           228: #define        MSGNOLOOP       0x0002          /* don't loop message to write-side of stream */
        !           229: #define        MSGDELIM        0x0004          /* message is delimited */
        !           230: 
        !           231: /* Extra flag definitions, for STREAMS private use only */
        !           232: 
        !           233: #define        MSGTRIPLE       0x0100          /* message block is part of triple */
        !           234: #define        MSGFREE         0x0200          /* message block is free */
        !           235: 
        !           236: #define        MSGMASK_SYSTEM  0x0300          /* system-private flags */
        !           237: 
        !           238: 
        !           239: /*
        !           240:  * Data structure used to control freeing of user-defined STREAMS buffer
        !           241:  * memory (such as user memory that is temporarily mapped to kernel space
        !           242:  * to avoid copying, or driver-dependent shared memory from an I/O space).
        !           243:  */
        !           244: 
        !           245: struct free_rtn {
        !           246:        void         (* free_func)              /* driver-dependent free routine */
        !           247:                        __PROTO ((__VOID__ * _arg));
        !           248:        __VOID__      * free_arg;       /* argument for free_rtn */
        !           249: };
        !           250: 
        !           251: typedef struct free_rtn frtn_t;
        !           252: 
        !           253: 
        !           254: /*
        !           255:  * Data block descriptors - several mblk_t's may refer to the same section
        !           256:  * of STREAMS buffer memory to avoid copying.
        !           257:  *
        !           258:  * Note that this data structure is NOT identical to it's System V
        !           259:  * counterpart.
        !           260:  */
        !           261: 
        !           262: struct datab {
        !           263:        frtn_t        * db_frtnp;       /* internal use */
        !           264:        unsigned char * db_base;        /* first byte of buffer */
        !           265:        unsigned char * db_lim;         /* last+1 byte of buffer */
        !           266:        unsigned char   db_ref;         /* count of messages pointing here */
        !           267:        unsigned char   db_type;        /* message type */
        !           268:        short           db_pad1;        /* reserved for future use */
        !           269:        long            db_pad2;        /* reserved for future use */
        !           270: };
        !           271: 
        !           272: 
        !           273: /*
        !           274:  * Define one of these structures with external visibility to publish the
        !           275:  * entry points to your STREAMS driver.
        !           276:  */
        !           277: 
        !           278: typedef        void (* __putp_t)               /* put procedure */
        !           279:                        __PROTO ((queue_t * _q, mblk_t * _mp));
        !           280: typedef        void (* __srvp_t)               /* service procedure */
        !           281:                        __PROTO ((queue_t * _q));
        !           282: typedef        int  (* __qopen_t)              /* open procedure */
        !           283:                        __PROTO ((queue_t * _q, n_dev_t * _devp, int _flag,
        !           284:                                  int _sflag, cred_t * _credp));
        !           285: typedef        int  (* __qclose_t)             /* called on last close/pop */
        !           286:                        __PROTO ((queue_t * _q, int _flag, cred_t * _credp));
        !           287: typedef        int  (* __qadmin_t)             /* reserved for future use */
        !           288:                        __PROTO ((void));
        !           289: 
        !           290: struct qinit {
        !           291:        __putp_t        qi_putp;        /* put procedure */
        !           292:        __srvp_t        qi_srvp;        /* service procedure */
        !           293:        __qopen_t       qi_qopen;       /* called on each open */
        !           294:        __qclose_t      qi_qclose;      /* called on last close/pop */
        !           295:        __qadmin_t      qu_qadmin;      /* reserved for future use */
        !           296:        struct module_info
        !           297:                      * qi_minfo;       /* information structure */
        !           298:        struct module_stat
        !           299:                      * qi_mstat;       /* statistics - optional */
        !           300: };
        !           301: 
        !           302: 
        !           303: /*
        !           304:  * General STREAMS "module information", mainly used by SysV configuration
        !           305:  * utilities, although it also provides defaults for the queues at open time.
        !           306:  */
        !           307: 
        !           308: struct module_info {
        !           309:        unsigned short  mi_idnum;       /* module ID number */
        !           310:        char          * mi_idname;      /* module name */
        !           311:        long            mi_minpsz;      /* min packet size accepted */
        !           312:        long            mi_maxpsz;      /* max packet size accepted */
        !           313:        unsigned long   mi_hiwat;       /* hi-water mark, for flow control */
        !           314:        unsigned long   mi_lowat;       /* lo-water mark, for flow control */
        !           315: };
        !           316: 
        !           317: 
        !           318: /* Infinite message size, for use in module_info mi_minpsz/mi_maxpsz */
        !           319: 
        !           320: #define INFPSZ                 0x7FFFFFFF
        !           321: 
        !           322: 
        !           323: /*
        !           324:  * General statistics structure, useful for profiling module/driver
        !           325:  * activity.
        !           326:  */
        !           327: 
        !           328: struct module_stat {
        !           329:        long            ms_pcnt;        /* count of calls to put proc */
        !           330:        long            ms_scnt;        /* count of calls to service proc */
        !           331:        long            ms_ocnt;        /* count of calls to open proc */
        !           332:        long            ms_ccnt;        /* count of calls to close proc */
        !           333:        long            ms_acnt;        /* count of calls to admin proc */
        !           334:        char          * ms_xptr;        /* pointer to private statistics */
        !           335:        short           ms_xsize;       /* length of private stats buffer */
        !           336: };
        !           337: 
        !           338: 
        !           339: /*
        !           340:  * link block for multiplexed streams... this structure appears in the data
        !           341:  * portion of I_LINK and I_UNLINK M_IOCTL messages.
        !           342:  *
        !           343:  * Note that the STREAMS manual documents the type of "l_index" as an "int",
        !           344:  * but for our purposes an "n_dev_t" (which is a long) is more appropriate.
        !           345:  */
        !           346: 
        !           347: typedef        n_dev_t         __muxid_t;
        !           348: 
        !           349: struct linkblk {
        !           350:        queue_t       * l_qtop;         /* lowest write queue of upper stream */
        !           351:        queue_t       * l_qbot;         /* highest write queue of lower stream */
        !           352:        __muxid_t       l_index;        /* unique index for lower stream */
        !           353:        long            l_pad [5];      /* reserved for future use */
        !           354: };
        !           355: 
        !           356: 
        !           357: /*
        !           358:  * Stream head options control message format, used as the data part of an
        !           359:  * M_SETOPTS message set from a driver or module to the stream head. The
        !           360:  * values for the "so_readopt" member can be found in <stropts.h> as well
        !           361:  * as below.
        !           362:  */
        !           363: 
        !           364: struct stroptions {
        !           365:        unsigned long   so_flags;       /* options to set */
        !           366:        short           so_readopt;     /* read option */
        !           367:        unsigned short  so_wroff;       /* write offset */
        !           368:        long            so_minpsz;      /* min packet size */
        !           369:        long            so_maxpsz;      /* max packet size */
        !           370:        unsigned long   so_hiwat;       /* read queue high-water mark */
        !           371:        unsigned long   so_lowat;       /* read queue low-water mark */
        !           372:        unsigned char   so_band;        /* band for water marks */
        !           373: };
        !           374: 
        !           375: 
        !           376: /*
        !           377:  * Flag values for the "so_flags" member,
        !           378:  */
        !           379: 
        !           380: #define        SO_ALL          0x3F            /* set all options */
        !           381: #define SO_READOPT      0x0001         /* set read option */
        !           382: #define SO_WROFF        0x0002         /* set write offset */
        !           383: #define SO_MINPSZ       0x0004         /* set min packet size */
        !           384: #define SO_MAXPSZ       0x0008         /* set max packet size */
        !           385: #define SO_HIWAT        0x0010         /* set read queue high-water mark */
        !           386: #define SO_LOWAT        0x0020         /* set read queue low-water mark */
        !           387: 
        !           388: /* Flags above control which members to look at, below are R4 extensions */
        !           389: 
        !           390: #define        SO_MREADON      0x0040          /* set read notification on */
        !           391: #define        SO_MREADOFF     0x0080          /* set read notification off */
        !           392: #define        SO_NDELON       0x0100          /* old TTY semantics for NDELAY */
        !           393: #define        SO_NDELOFF      0x0200          /* STREAMS semantics for NDELAY */
        !           394: #define        SO_ISTTY        0x0400          /* stream is acting as a terminal */
        !           395: #define        SO_ISNTTY       0x0800          /* stream is not acting as a terminal */
        !           396: #define        SO_TOSTOP       0x1000          /* stop on background writes to stream */
        !           397: #define        SO_TONSTOP      0x2000          /* don't stop on background writes */
        !           398: #define        SO_BAND         0x4000          /* water marks that affect band */
        !           399: 
        !           400: /*
        !           401:  * Other flags relevant to the above structure are defined in <sys/stropts.h>.
        !           402:  */
        !           403: 
        !           404: 
        !           405: /*
        !           406:  * Structure of data block found at head of M_IOCTL message, usually reused
        !           407:  * for replying to M_IOCTL with an M_IOCACK or M_IOCNAK message.
        !           408:  */
        !           409: 
        !           410: struct iocblk {
        !           411:        int             ioc_cmd;        /* ioctl () command type */
        !           412:        cred_t        * ioc_cr;         /* user's full credentials */
        !           413:        unsigned int    ioc_id;         /* M_IOCTL sequence number */
        !           414:        unsigned int    ioc_count;      /* bytes in data field */
        !           415:        int             ioc_error;      /* error code */
        !           416:        int             ioc_rval;       /* return value */
        !           417: 
        !           418:        long            ioc_filler [4]; /* reserved for future use */
        !           419: };
        !           420: 
        !           421: 
        !           422: /*
        !           423:  * For compatibility with SVR3 sources
        !           424:  */
        !           425: 
        !           426: #define        ioc_uid         ioc_cr->cr_uid
        !           427: #define        ioc_gid         ioc_cr->cr_gid
        !           428: 
        !           429: 
        !           430: /*
        !           431:  * This special value of "ioc_count" is used to indicate that the stream
        !           432:  * head has passed us a "transparent" ioctl rather than an I_STR ioctl.
        !           433:  */
        !           434: 
        !           435: #define        TRANSPARENT     ((unsigned int) -1)
        !           436: 
        !           437: 
        !           438: /*
        !           439:  * This structure defines the data format used in an M_COPYIN/M_COPYOUT
        !           440:  * message (used to request data copying from user process space during
        !           441:  * an ioctl ()). Note that the first three members of the "copyreq" structure
        !           442:  * match the first three fields of the "iocblk" structure. It is intended
        !           443:  * that drivers be able to use this property to simply use the intial message
        !           444:  * block from M_IOCTL for all the transparent IOCTL messages.
        !           445:  */
        !           446: 
        !           447: struct copyreq {
        !           448:        int             cq_cmd;         /* ioctl command (from ioc_cmd) */
        !           449:        cred_t        * cq_cr;          /* full credentials (from ioc_cr) */
        !           450:        unsigned int    cq_id;          /* ioctl id (from ioc_id) */
        !           451:        caddr_t         cq_addr;        /* user address to copy data to/from */
        !           452:        unsigned int    cq_size;        /* number of bytes to copy */
        !           453:        int             cq_flag;        /* flags, see below */
        !           454:        mblk_t        * cq_private;     /* private state information */
        !           455:        long            cq_filler [4];  /* reserved for future use */
        !           456: };
        !           457: 
        !           458: /* For compatibility with old sources. */
        !           459: 
        !           460: #define        cq_uid          cq_cr->cr_uid
        !           461: #define        cq_gid          cq_cr->cr_gid
        !           462: 
        !           463: /* cq_flag values */
        !           464: 
        !           465: #define        STRCANON        0x0001          /* b_cont data block contains canonical format specifier */
        !           466: #define        RECOPY          0x0002          /* perform I_STR copyin again using canonical format specifier */
        !           467: 
        !           468: 
        !           469: /*
        !           470:  * This structure is used in the M_IOCDATA response to an M_COPYIN/M_COPYOUT,
        !           471:  * and is laid out so that equivalent fields from the "struct copyreq"
        !           472:  * structure remain at the same offset, ie we expect the stream head to
        !           473:  * simply turn around our request, although it is not required to do so.
        !           474:  */
        !           475: 
        !           476: struct copyresp {
        !           477:        int             cp_cmd;         /* ioctl command (from cq_cmd) */
        !           478:        cred_t        * cp_cr;          /* full credentials (from cq_cr) */
        !           479:        unsigned int    cp_id;          /* ioctl id (from cq_id) */
        !           480:        caddr_t         cp_rval;        /* request status: 0 success, non-zero failure */
        !           481:        unsigned int    cp_pad1;        /* reserved */
        !           482:        unsigned int    cp_pad2;        /* reserved */
        !           483:        mblk_t        * cp_private;     /* private state information */
        !           484:        long            cp_filler [4];  /* reserved for future use */
        !           485: };
        !           486: 
        !           487: /* for compatibility with old sources */
        !           488: 
        !           489: #define        cp_uid          cp_cr->cr_uid
        !           490: #define        cp_gid          cp_cr->cr_gid
        !           491: 
        !           492: 
        !           493: /*
        !           494:  * LOCAL EXTENSIONS : The methods used in the multiplexing examples in the
        !           495:  * STREAMS V.2 manual are slightly inefficient. The following general STREAMS
        !           496:  * queue schedling routines were defined for multiplexing drivers and device
        !           497:  * drivers (such as Ethernet drivers) that must consume data from several
        !           498:  * queues.
        !           499:  *
        !           500:  * In the STREAMS code supplied, these routines are also used for the main
        !           501:  * streams queue scheduling, so we define them here. A consequence of this is
        !           502:  * that a given queue may not be queued for both STREAMS execution and
        !           503:  * multiplexing at the same time.
        !           504:  *
        !           505:  * The basic idea is to use qschedule () and qunschedule () to add and remove
        !           506:  * a queue from the scheduling list. Lower queues may then getq () from the
        !           507:  * "s_head" of the scheduling list to consume the data. Since by default this
        !           508:  * will simply attempt to drain each scheduled queue of data before moving to
        !           509:  * the next, the muxrobin () call adjusts the head/tail pointers to effect
        !           510:  * a round-robin of the queues that have data.
        !           511:  */
        !           512: 
        !           513: struct strsched {
        !           514:        queue_t         * s_head;       /* next queue to read data from */
        !           515:        queue_t         * s_tail;       /* last queue to read data from */
        !           516: };
        !           517: 
        !           518: 
        !           519: /*
        !           520:  * Message allocation priorities, used with allocb () and bufcall ()
        !           521:  */
        !           522: 
        !           523: enum {
        !           524:        BPRI_LO,
        !           525:        BPRI_MED,
        !           526:        BPRI_HI
        !           527: };
        !           528: 
        !           529: 
        !           530: /*
        !           531:  * Flag values used with flushq () and flushband ().
        !           532:  */
        !           533: 
        !           534: enum {
        !           535:        FLUSHDATA,                      /* flush M_DATA, M_PROTO, M_PCPROTO, M_DELAY */
        !           536:        FLUSHALL                        /* flush all messages from queue */
        !           537: };
        !           538: 
        !           539: 
        !           540: /*
        !           541:  * queue field numbers to be used with strqget ()/strqset ().
        !           542:  */
        !           543: 
        !           544: typedef enum qfields {
        !           545:        QHIWAT          = 0,            /* q_hiwat or qb_hiwat */
        !           546:        QLOWAT          = 1,            /* q_lowat or qb_lowat */
        !           547:        QMAXPSZ         = 2,            /* q_maxpsz */
        !           548:        QMINPSZ         = 3,            /* q_minpsz */
        !           549:        QCOUNT          = 4,            /* q_count or qb_count */
        !           550:        QFIRST          = 5,            /* q_first or qb_first */
        !           551:        QLAST           = 6,            /* q_last or qb_last */
        !           552:        QFLAG           = 7,            /* q_flag or qb_flag */
        !           553:        QBAD            = 8
        !           554: } qfields_t;
        !           555: 
        !           556: 
        !           557: /*
        !           558:  * External function definitions for the STREAMS library.
        !           559:  *
        !           560:  * Note that prototypes are also provided for those STREAMS functions that
        !           561:  * are available as macros. This is since this header is a more appropriate
        !           562:  * place to encode this knowledge than the DDI/DKI required header
        !           563:  * <sys/ddi.h>
        !           564:  *
        !           565:  * The System V Release 4 Multi-Processor DDI/DKI defines some extra versions
        !           566:  * of some common STREAMS library functions so that STREAMS driver code does
        !           567:  * not reference the q->q_next member, since this may not be safe in a multi-
        !           568:  * processor environment. These functions are included in this implementation
        !           569:  * and are prototyped below to help device drivers anticipate the multi-
        !           570:  * processor environment.
        !           571:  */
        !           572: 
        !           573: __EXTERN_C_BEGIN__
        !           574: 
        !           575: int            adjmsg          __PROTO ((mblk_t * _mp, int _len));
        !           576: mblk_t       * allocb          __PROTO ((int _size, unsigned int _pri));
        !           577: queue_t              * backq           __PROTO ((queue_t * _q));
        !           578: int            bcanput         __PROTO ((queue_t * _q, unsigned char _pri));
        !           579: int            bcanputnext     __PROTO ((queue_t * _q, unsigned char _pri));
        !           580: /* see <sys/bufcall.h> for a discussion of this declaration for bufcall () */
        !           581: #define        __STDARG_BUFCALL__
        !           582: toid_t         bufcall         __PROTO ((unsigned int _size, int _pri, ...));
        !           583: int            canput          __PROTO ((queue_t * _q));
        !           584: int            canputnext      __PROTO ((queue_t * _q));
        !           585: mblk_t               * copyb           __PROTO ((mblk_t * _bp));
        !           586: mblk_t       * copymsg         __PROTO ((mblk_t * _mp));
        !           587: int            datamsg         __PROTO ((unsigned char _type));
        !           588: mblk_t       * dupb            __PROTO ((mblk_t * _bp));
        !           589: mblk_t       * dupmsg          __PROTO ((mblk_t * _mp));
        !           590: void           enableok        __PROTO ((queue_t * _q));
        !           591: mblk_t       * esballoc        __PROTO ((unsigned char * _base, int _size,
        !           592:                                          int _pri, frtn_t * _fr_rtn));
        !           593: /* The following assumes __STDARG_BUFCALL__ as above */
        !           594: toid_t         esbbcall        __PROTO ((int _pri, ...));
        !           595: void           flushband       __PROTO ((queue_t * _q, unsigned char _pri,
        !           596:                                          int _flag));
        !           597: void           flushq          __PROTO ((queue_t * _q, int _flag));
        !           598: pl_t           freezestr       __PROTO ((queue_t * _q));
        !           599: void           freeb           __PROTO ((mblk_t * _bp));
        !           600: void           freemsg         __PROTO ((mblk_t * _mp));
        !           601: int         (* getadmin        __PROTO ((unsigned short _mid)))
        !           602:                        __PROTO ((void));
        !           603: unsigned short getmid          __PROTO ((char * _name));
        !           604: mblk_t       * getq            __PROTO ((queue_t * _q));
        !           605: int            insq            __PROTO ((queue_t * _q, mblk_t * _emp,
        !           606:                                          mblk_t * _nmp));
        !           607: void           linkb           __PROTO ((mblk_t * _mp, mblk_t * _bp));
        !           608: int            msgdsize        __PROTO ((mblk_t * _mp));
        !           609: mblk_t       * msgpullup       __PROTO ((mblk_t * _mp, int _len));
        !           610: void           noenable        __PROTO ((queue_t * _q));
        !           611: queue_t              * OTHERQ          __PROTO ((queue_t * _q));
        !           612: int            pcmsg           __PROTO ((uchar_t _type));
        !           613: int            pullupmsg       __PROTO ((mblk_t * _mp, int _len));
        !           614: void           put             __PROTO ((queue_t * _q, mblk_t * _mp));
        !           615: int            putbq           __PROTO ((queue_t * _q, mblk_t * _mp));
        !           616: int            putctl          __PROTO ((queue_t * _q, int _type));
        !           617: int            putctl1         __PROTO ((queue_t * _q, int _type,
        !           618:                                          int _param));
        !           619: int            putnext         __PROTO ((queue_t * _q, mblk_t * _mp));
        !           620: int            putnextctl      __PROTO ((queue_t * _q, int _type));
        !           621: int            putnextctl1     __PROTO ((queue_t * _q, int _type,
        !           622:                                          int _param));
        !           623: int            putq            __PROTO ((queue_t * _q, mblk_t * _mp));
        !           624: void           qenable         __PROTO ((queue_t * _q));
        !           625: void           qprocsoff       __PROTO ((queue_t * _rq));
        !           626: void           qprocson        __PROTO ((queue_t * _rq));
        !           627: void           qreply          __PROTO ((queue_t * _q, mblk_t * _mp));
        !           628: int            qsize           __PROTO ((queue_t * _q));
        !           629: queue_t              * RD              __PROTO ((queue_t * _q));
        !           630: mblk_t       * rmvb            __PROTO ((mblk_t * _mp, mblk_t * _bp));
        !           631: void           rmvq            __PROTO ((queue_t * _q, mblk_t * _mp));
        !           632: int            strlog          __PROTO ((short _mid, short _sid, char _level,
        !           633:                                          unsigned short _flags, char * _fmt,
        !           634:                                          ...));
        !           635: int            strqget         __PROTO ((queue_t * _q, qfields_t _what,
        !           636:                                          unsigned char _pri, long * _valp));
        !           637: int            strqset         __PROTO ((queue_t * _q, qfields_t _what,
        !           638:                                          unsigned char _pri, long _val));
        !           639: int            testb           __PROTO ((int _size, int _pri));
        !           640: void           unbufcall       __PROTO ((toid_t _id));
        !           641: void           unfreezestr     __PROTO ((queue_t * _q, pl_t _pl));
        !           642: mblk_t       * unlinkb         __PROTO ((mblk_t * _mp));
        !           643: queue_t              * WR              __PROTO ((queue_t * _q));
        !           644: 
        !           645: __EXTERN_C_END__
        !           646: 
        !           647: 
        !           648: /*
        !           649:  * Possible values for the stream open flag "sflag" in a module or driver
        !           650:  * open (0 implies a normal driver open)
        !           651:  */
        !           652: 
        !           653: enum {
        !           654:        MODOPEN         = 1,            /* normal module open */
        !           655:        CLONEOPEN                       /* clone device open */
        !           656: };
        !           657: 
        !           658: 
        !           659: /*
        !           660:  * Special value for the two-byte form of the M_ERROR message.
        !           661:  */
        !           662: 
        !           663: enum {
        !           664:        NOERROR         = 0xFF
        !           665: };
        !           666: 
        !           667: 
        !           668: /*
        !           669:  * Functions that are normally implemented as macros (although the function
        !           670:  * versions which are prototyped above are available by including the
        !           671:  * <sys/ddi.h> header.
        !           672:  */
        !           673: /*
        !           674:  * NB: Borland C++ 3.1 in 'C' mode insists that if a pointer is derived from
        !           675:  * a ternary where the arms are calculated from lvalues then dereferencing
        !           676:  * that pointer does not yield a valid lvalue, e.g.
        !           677:  *     WR (q)->q_ptr = NULL;
        !           678:  * it thinks is invalid, which is untrue. To fix this, the pointer value from
        !           679:  * the ternary seems to need massaging to turn it into a proper rvalue... the
        !           680:  * easiest way to do this is add 0 to the *result* of the ternary. This is
        !           681:  * optimized away by basic constant-folding in even simple compilers.
        !           682:  */
        !           683: 
        !           684: #define        __HACK(exp)     ((exp) + 0)
        !           685: 
        !           686: #define        datamsg(type)   ((unsigned char) ((type) & (M_PRI - 1)) <= M_DELAY)
        !           687: /* There is no multiprocessor macro implementation of enableok () */
        !           688: /* There is no multiprocessor macro implementation of noenable () */
        !           689: #define        OTHERQ(q)     __HACK (((q)->q_flag & QREADR) != 0 ? (q) + 1 : (q) - 1)
        !           690: #define        pcmsg(type)     ((type) >= QPCTL)
        !           691: #define        RD(q)         __HACK (((q)->q_flag & QREADR) != 0 ? (q) : (q) - 1)
        !           692: #define        WR(q)         __HACK (((q)->q_flag & QREADR) != 0 ? (q) + 1 : (q))
        !           693: 
        !           694: #endif /* ! defined (__SYS_STREAM_H__) */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.