#define QPCTL 0100 /* priority control message */ #define QBSIZE 64 /* "standard" size of queue block*/ /* * data queue */ struct queue { struct qinit *qinfo; /* procs and limits for queue */ struct block *first; /* first data block */ struct block *last; /* last data block */ struct queue *next; /* Q of next stream */ struct queue *link; /* to next Q for scheduling */ caddr_t ptr; /* to private data structure */ short count; /* number of blocks on Q */ u_short flag; }; /* Queue flags */ #define QENAB 01 /* Queue is already enabled to run */ #define QWANTR 02 /* Someone wants to read Q */ #define QWANTW 04 /* Someone wants to write Q */ #define QFULL 010 /* Q is considered full */ #define QREADR 020 /* This is the reader (first) Q */ #define QUSE 040 /* This queue in use (allocation) */ #define QNOENB 0100 /* Don't enable Q via putq */ #define QDELIM 0200 /* This queue generates delimiters */ #define QBIGB 0400 /* This queue would like big blocks */ /* * queue information structure */ struct qinit { int (*putp)(); /* put procedure */ int (*srvp)(); /* service procedure */ long (*qopen)(); /* called on startup */ int (*qclose)(); /* called on finish */ short limit; /* high water mark */ short lolimit; /* low water mark */ }; #define OTHERQ(q) ((q)->flag&QREADR? (q)+1: (q)-1) #define WR(q) (q+1) #define RD(q) (q-1) /* * Queue data block */ struct block { struct block *next; /* next in chain */ u_char *rptr; /* first unconsumed data */ u_char *wptr; /* next unwritten data */ u_char *lim; /* max for wptr */ u_char *base; /* min for rptr/wptr */ u_char type; /* type of block contents */ u_char class; /* size class (plus S_DELIM flag) */ u_char bufix; /* buffer index (for io maps) */ u_char rbufix; /* real index for anon block */ u_char data[4]; /* data contents for tiny blocks */ }; #define NOBUFIX 255 #define SSRCSIZ 32 /* also defined in filio.h */ #define S_DELIM 0200 /* This block is followed by a delimiter */ #define CL_MASK 0177 /* * Header for a stream: interface to rest of system */ struct stdata { struct queue *wrq; /* write queue */ struct block *iocblk; /* return block for ioctl */ struct inode *inode; /* backptr, for hangups */ struct proc *wsel; /* process write-selecting */ struct proc *rsel; /* process read-selecting */ short pgrp; /* process group, for signals */ short flag; char count; /* # processes in stream routines */ char source[SSRCSIZ]; /* security name of stream */ }; #define IOCWAIT 01 /* Someone wants to do ioctl */ #define RSLEEP 02 /* Someone wants to read */ #define WSLEEP 04 /* Someone wants to write */ #define HUNGUP 010 /* Device has vanished */ #define RSEL 020 /* read-select collision*/ #define WSEL 040 /* write-select collision */ #define EXCL 0100 /* exclusive-use (no opens) */ #define STWOPEN 0200 /* waiting for 1st open */ #ifdef KERNEL struct block *getq(); int putq(); int noput(); struct block *allocb(); struct block *cramb(); struct block *dupb(); struct queue *backq(); struct queue *allocq(); struct inode *stopen(); #endif /* * Control messages (regular priority) */ #define M_DATA 0 /* regular data (not ctl) */ #define M_BREAK 01 /* line break */ #define M_HANGUP 02 /* line disconnect */ #define M_DELIM 03 /* data delimiter */ #define M_IOCTL 06 /* ioctl; set/get params */ #define M_DELAY 07 /* real-time xmit delay (1 param) */ #define M_CTL 010 /* device-specific control message */ #define M_PASS 011 /* pass file */ #define M_YDEL 012 /* stream has started generating delims */ #define M_NDEL 013 /* stream has stopped generating delims */ /* * Control messages (high priority; go to head of queue) */ #define M_SIGNAL 0101 /* generate process signal */ #define M_FLUSH 0102 /* flush your queues */ #define M_STOP 0103 /* stop transmission immediately */ #define M_START 0104 /* restart transmission after stop */ #define M_IOCACK 0105 /* acknowledge ioctl */ #define M_IOCNAK 0106 /* negative ioctl acknowledge */ #define M_PRICTL 0107 /* high priority device-specific ctl */ #define M_IOCWAIT 0110 /* stop ioctl timeout, ack/nak follows later */ #define setqsched() mtpr(SIRR, 0x3) /* * ioctl message packet */ #define STIOCSIZE 16 #define STIOCHDR 4 struct stioctl { unsigned char com[STIOCHDR]; /* four-byte command, low order byte first */ char data[STIOCSIZE]; /* depends on command */ }; #define stiocom(bp) (((struct stioctl *)bp->rptr)->com[0]|(((struct stioctl *)bp->rptr)->com[1]<<8)) /* two high bytes ignored for now */ #define stiodata(bp) (((struct stioctl *)bp->rptr)->data) /* * for passing files across streams */ struct kpassfd { union { struct file *fp; int fd; } f; short uid; short gid; short nice; char logname[8]; char cap; }; /* * header for messages, see mesg.c */ struct mesg { char type; u_char magic; u_char losize, hisize; }; #define MSGMAGIC 0345 #define MSGHLEN 4 /* true length of struct mesg in bytes */