|
|
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__) */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.