|
|
1.1 ! root 1: #define QPCTL 0100 /* priority control message */ ! 2: #define QBSIZE 64 /* "standard" size of queue block*/ ! 3: #define QBBSIZE 1024 /* size of a big queue block */ ! 4: ! 5: /* ! 6: * data queue ! 7: */ ! 8: struct queue { ! 9: struct qinit *qinfo; /* procs and limits for queue */ ! 10: struct block *first; /* first data block */ ! 11: struct block *last; /* last data block */ ! 12: struct queue *next; /* Q of next stream */ ! 13: struct queue *link; /* to next Q for scheduling */ ! 14: caddr_t ptr; /* to private data structure */ ! 15: short count; /* number of blocks on Q */ ! 16: u_short flag; ! 17: }; ! 18: ! 19: /* Queue flags */ ! 20: #define QENAB 01 /* Queue is already enabled to run */ ! 21: #define QWANTR 02 /* Someone wants to read Q */ ! 22: #define QWANTW 04 /* Someone wants to write Q */ ! 23: #define QFULL 010 /* Q is considered full */ ! 24: #define QREADR 020 /* This is the reader (first) Q */ ! 25: #define QUSE 040 /* This queue in use (allocation) */ ! 26: #define QNOENB 0100 /* Don't enable Q via putq */ ! 27: #define QDELIM 0200 /* This queue generates delimiters */ ! 28: #define QBIGB 0400 /* This queue would like big blocks */ ! 29: ! 30: /* ! 31: * queue information structure ! 32: */ ! 33: struct qinit { ! 34: int (*putp)(); /* put procedure */ ! 35: int (*srvp)(); /* service procedure */ ! 36: long (*qopen)(); /* called on startup */ ! 37: int (*qclose)(); /* called on finish */ ! 38: short limit; /* high water mark */ ! 39: short lolimit; /* low water mark */ ! 40: }; ! 41: ! 42: #define OTHERQ(q) ((q)->flag&QREADR? (q)+1: (q)-1) ! 43: #define WR(q) (q+1) ! 44: #define RD(q) (q-1) ! 45: ! 46: /* ! 47: * Queue data block ! 48: */ ! 49: struct block { ! 50: struct block *next; /* next in chain */ ! 51: u_char *rptr; /* first unconsumed data */ ! 52: u_char *wptr; /* next unwritten data */ ! 53: u_char *lim; /* max for wptr */ ! 54: u_char *base; /* min for rptr/wptr */ ! 55: u_char type; /* type of block contents */ ! 56: u_char class; /* size class (plus S_DELIM flag) */ ! 57: u_char bufix; /* buffer index (for io maps) */ ! 58: u_char rbufix; /* real index for anon block */ ! 59: u_char data[4]; /* data contents for tiny blocks */ ! 60: }; ! 61: ! 62: #define NOBUFIX 255 ! 63: #define S_DELIM 0200 /* This block is followed by a delimiter */ ! 64: #define CL_MASK 0177 ! 65: ! 66: /* ! 67: * Header for a stream: interface to rest of system ! 68: */ ! 69: struct stdata { ! 70: struct queue *wrq; /* write queue */ ! 71: struct block *iocblk; /* return block for ioctl */ ! 72: struct inode *inode; /* backptr, for hangups */ ! 73: struct proc *wsel; /* process write-selecting */ ! 74: struct proc *rsel; /* process read-selecting */ ! 75: short pgrp; /* process group, for signals */ ! 76: short flag; ! 77: char count; /* # processes in stream routines */ ! 78: }; ! 79: #define IOCWAIT 01 /* Someone wants to do ioctl */ ! 80: #define RSLEEP 02 /* Someone wants to read */ ! 81: #define WSLEEP 04 /* Someone wants to write */ ! 82: #define HUNGUP 010 /* Device has vanished */ ! 83: #define RSEL 020 /* read-select collision*/ ! 84: #define WSEL 040 /* write-select collision */ ! 85: #define EXCL 0100 /* exclusive-use (no opens) */ ! 86: #define STWOPEN 0200 /* waiting for 1st open */ ! 87: ! 88: #ifdef KERNEL ! 89: struct block *getq(); ! 90: int putq(); ! 91: int noput(); ! 92: struct block *allocb(); ! 93: struct block *cramb(); ! 94: struct block *dupb(); ! 95: struct queue *backq(); ! 96: struct queue *allocq(); ! 97: struct inode *stopen(); ! 98: #endif ! 99: ! 100: /* ! 101: * Control messages (regular priority) ! 102: */ ! 103: #define M_DATA 0 /* regular data (not ctl) */ ! 104: #define M_BREAK 01 /* line break */ ! 105: #define M_HANGUP 02 /* line disconnect */ ! 106: #define M_DELIM 03 /* data delimiter */ ! 107: #define M_ECHO 04 /* request ACK (1 param) */ ! 108: #define M_ACK 05 /* response to ECHO (1 param) */ ! 109: #define M_IOCTL 06 /* ioctl; set/get params */ ! 110: #define M_DELAY 07 /* real-time xmit delay (1 param) */ ! 111: #define M_CTL 010 /* device-specific control message */ ! 112: #define M_PASS 011 /* pass file */ ! 113: #define M_YDEL 012 /* stream has started generating delims */ ! 114: #define M_NDEL 013 /* stream has stopped generating delims */ ! 115: ! 116: /* ! 117: * Control messages (high priority; go to head of queue) ! 118: */ ! 119: #define M_SIGNAL 0101 /* generate process signal */ ! 120: #define M_FLUSH 0102 /* flush your queues */ ! 121: #define M_STOP 0103 /* stop transmission immediately */ ! 122: #define M_START 0104 /* restart transmission after stop */ ! 123: #define M_IOCACK 0105 /* acknowledge ioctl */ ! 124: #define M_IOCNAK 0106 /* negative ioctl acknowledge */ ! 125: #define M_PRICTL 0107 /* high priority device-specific ctl */ ! 126: #define M_IOCWAIT 0110 /* stop ioctl timeout, ack/nak follows later */ ! 127: ! 128: #define setqsched() mtpr(SIRR, 0x3) ! 129: ! 130: /* ! 131: * ioctl message packet ! 132: */ ! 133: ! 134: #define STIOCSIZE 16 ! 135: #define STIOCHDR 4 ! 136: ! 137: struct stioctl { ! 138: unsigned char com[STIOCHDR]; /* four-byte command, low order byte first */ ! 139: char data[STIOCSIZE]; /* depends on command */ ! 140: }; ! 141: ! 142: #define stiocom(bp) (((struct stioctl *)bp->rptr)->com[0]|(((struct stioctl *)bp->rptr)->com[1]<<8)) /* two high bytes ignored for now */ ! 143: #define stiodata(bp) (((struct stioctl *)bp->rptr)->data) ! 144: ! 145: /* ! 146: * for passing files across streams ! 147: */ ! 148: struct kpassfd { ! 149: union { ! 150: struct file *fp; ! 151: int fd; ! 152: } f; ! 153: short uid; ! 154: short gid; ! 155: short nice; ! 156: char logname[8]; ! 157: }; ! 158: ! 159: /* ! 160: * header for messages, see mesg.c ! 161: */ ! 162: ! 163: struct mesg { ! 164: char type; ! 165: u_char magic; ! 166: u_char losize, hisize; ! 167: }; ! 168: ! 169: #define MSGMAGIC 0345 ! 170: #define MSGHLEN 4 /* true length of struct mesg in bytes */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.