|
|
1.1 ! root 1: typedef struct Alarms Alarms; ! 2: typedef struct Block Block; ! 3: typedef struct Blist Blist; ! 4: typedef struct Chan Chan; ! 5: typedef struct Dev Dev; ! 6: typedef struct Dirtab Dirtab; ! 7: typedef struct Egrp Egrp; ! 8: typedef struct Evalue Evalue; ! 9: typedef struct Etherpkt Etherpkt; ! 10: typedef struct Fgrp Fgrp; ! 11: typedef struct Image Image; ! 12: typedef struct IOQ IOQ; ! 13: typedef struct KIOQ KIOQ; ! 14: typedef struct List List; ! 15: typedef struct Mount Mount; ! 16: typedef struct Mnt Mnt; ! 17: typedef struct Mhead Mhead; ! 18: typedef struct Netinf Netinf; ! 19: typedef struct Netprot Netprot; ! 20: typedef struct Network Network; ! 21: typedef struct Note Note; ! 22: typedef struct Page Page; ! 23: typedef struct Palloc Palloc; ! 24: typedef struct Parallax Parallax; ! 25: typedef struct Pgrps Pgrps; ! 26: typedef struct Pgrp Pgrp; ! 27: typedef struct Physseg Physseg; ! 28: typedef struct Proc Proc; ! 29: typedef struct Pte Pte; ! 30: typedef struct Qinfo Qinfo; ! 31: typedef struct QLock QLock; ! 32: typedef struct Queue Queue; ! 33: typedef struct Ref Ref; ! 34: typedef struct Rendez Rendez; ! 35: typedef struct RWlock RWlock; ! 36: typedef struct Sargs Sargs; ! 37: typedef struct Session Session; ! 38: typedef struct Scsi Scsi; ! 39: typedef struct Scsibuf Scsibuf; ! 40: typedef struct Scsidata Scsidata; ! 41: typedef struct Segment Segment; ! 42: typedef struct Stream Stream; ! 43: typedef struct Talarm Talarm; ! 44: typedef struct Waitq Waitq; ! 45: typedef int Devgen(Chan*, Dirtab*, int, int, Dir*); ! 46: typedef void Streamput(Queue*, Block*); ! 47: typedef void Streamopen(Queue*, Stream*); ! 48: typedef void Streamclose(Queue*); ! 49: typedef void Streamreset(void); ! 50: ! 51: #include <auth.h> ! 52: #include <fcall.h> ! 53: ! 54: struct Ref ! 55: { ! 56: Lock; ! 57: long ref; ! 58: }; ! 59: ! 60: struct Rendez ! 61: { ! 62: Lock; ! 63: Proc *p; ! 64: }; ! 65: ! 66: struct QLock ! 67: { ! 68: Lock use; /* to access Qlock structure */ ! 69: Proc *head; /* next process waiting for object */ ! 70: Proc *tail; /* last process waiting for object */ ! 71: int locked; /* flag */ ! 72: }; ! 73: ! 74: struct RWlock ! 75: { ! 76: Lock; /* Lock modify lock */ ! 77: QLock x; /* Mutual exclusion lock */ ! 78: QLock k; /* Lock for waiting writers held for readers */ ! 79: int readers; /* Count of readers in lock */ ! 80: }; ! 81: ! 82: struct Talarm ! 83: { ! 84: Lock; ! 85: Proc *list; ! 86: }; ! 87: ! 88: struct Alarms ! 89: { ! 90: QLock; ! 91: Proc *head; ! 92: }; ! 93: ! 94: #define MAXSYSARG 5 /* for mount(fd, mpt, flag, arg, srv) */ ! 95: struct Sargs ! 96: { ! 97: ulong args[MAXSYSARG]; ! 98: }; ! 99: ! 100: /* Block.flags */ ! 101: #define S_DELIM 0x80 ! 102: #define S_CLASS 0x07 ! 103: ! 104: /* Block.type */ ! 105: #define M_DATA 0 ! 106: #define M_CTL 1 ! 107: #define M_HANGUP 2 ! 108: ! 109: struct Block ! 110: { ! 111: Block *next; ! 112: Block *list; /* chain of block lists */ ! 113: uchar *rptr; /* first unconsumed byte */ ! 114: uchar *wptr; /* first empty byte */ ! 115: uchar *lim; /* 1 past the end of the buffer */ ! 116: uchar *base; /* start of the buffer */ ! 117: uchar flags; ! 118: uchar type; ! 119: ulong pc; /* pc of caller */ ! 120: }; ! 121: ! 122: struct Blist ! 123: { ! 124: Lock; ! 125: Block *first; /* first data block */ ! 126: Block *last; /* last data block */ ! 127: long len; /* length of list in bytes */ ! 128: int nb; /* number of blocks in list */ ! 129: }; ! 130: ! 131: /* ! 132: * Access types in namec ! 133: */ ! 134: enum ! 135: { ! 136: Aaccess, /* as in access, stat */ ! 137: Atodir, /* as in chdir */ ! 138: Aopen, /* for i/o */ ! 139: Amount, /* to be mounted upon */ ! 140: Acreate, /* file is to be created */ ! 141: }; ! 142: ! 143: /* ! 144: * Chan.flags ! 145: */ ! 146: #define COPEN 1 /* for i/o */ ! 147: #define CMSG 2 /* is the message channel for a mount */ ! 148: #define CCREATE 4 /* permits creation if c->mnt */ ! 149: #define CCEXEC 8 /* close on exec */ ! 150: #define CFREE 16 /* not in use */ ! 151: #define CRCLOSE 32 /* remove on close */ ! 152: ! 153: struct Chan ! 154: { ! 155: Ref; ! 156: union{ ! 157: Chan *next; /* allocation */ ! 158: ulong offset; /* in file */ ! 159: }; ! 160: ushort type; ! 161: ulong dev; ! 162: ushort mode; /* read/write */ ! 163: ushort flag; ! 164: Qid qid; ! 165: Mount *mnt; /* mount point that derived Chan */ ! 166: ulong mountid; ! 167: int fid; /* for devmnt */ ! 168: Stream *stream; /* for stream channels */ ! 169: union { ! 170: void *aux; ! 171: Qid pgrpid; /* for #p/notepg */ ! 172: Mnt *mntptr; /* for devmnt */ ! 173: }; ! 174: Chan *mchan; /* channel to mounted server */ ! 175: Qid mqid; /* qid of root of mount point */ ! 176: Session *session; ! 177: }; ! 178: ! 179: struct Dev ! 180: { ! 181: void (*reset)(void); ! 182: void (*init)(void); ! 183: Chan* (*attach)(char*); ! 184: Chan* (*clone)(Chan*, Chan*); ! 185: int (*walk)(Chan*, char*); ! 186: void (*stat)(Chan*, char*); ! 187: Chan* (*open)(Chan*, int); ! 188: void (*create)(Chan*, char*, int, ulong); ! 189: void (*close)(Chan*); ! 190: long (*read)(Chan*, void*, long, ulong); ! 191: long (*write)(Chan*, void*, long, ulong); ! 192: void (*remove)(Chan*); ! 193: void (*wstat)(Chan*, char*); ! 194: }; ! 195: ! 196: struct Dirtab ! 197: { ! 198: char name[NAMELEN]; ! 199: Qid qid; ! 200: long length; ! 201: long perm; ! 202: }; ! 203: ! 204: /* ! 205: * Ethernet packet buffers. ! 206: */ ! 207: struct Etherpkt ! 208: { ! 209: uchar d[6]; ! 210: uchar s[6]; ! 211: uchar type[2]; ! 212: uchar data[1500]; ! 213: uchar crc[4]; ! 214: }; ! 215: ! 216: enum ! 217: { ! 218: ETHERMINTU = 64, /* minimum transmit size */ ! 219: ETHERMAXTU = 1514, /* maximum transmit size */ ! 220: ETHERHDRSIZE = 14, /* size of an ethernet header */ ! 221: }; ! 222: ! 223: /* SCSI devices. */ ! 224: enum ! 225: { ! 226: ScsiTestunit = 0x00, ! 227: ScsiExtsens = 0x03, ! 228: ScsiInquiry = 0x12, ! 229: ScsiModesense = 0x1a, ! 230: ScsiStartunit = 0x1B, ! 231: ScsiStopunit = 0x1B, ! 232: ScsiGetcap = 0x25, ! 233: ScsiRead = 0x08, ! 234: ScsiWrite = 0x0a, ! 235: ScsiExtread = 0x28, ! 236: ScsiExtwrite = 0x2a, ! 237: ! 238: /* data direction */ ! 239: ScsiIn = 1, ! 240: ScsiOut = 0, ! 241: }; ! 242: ! 243: struct Scsibuf ! 244: { ! 245: void* virt; ! 246: void* phys; ! 247: Scsibuf* next; ! 248: }; ! 249: ! 250: struct Scsidata ! 251: { ! 252: uchar* base; ! 253: uchar* lim; ! 254: uchar* ptr; ! 255: }; ! 256: ! 257: struct Scsi ! 258: { ! 259: QLock; ! 260: int bus; ! 261: ulong pid; ! 262: ushort target; ! 263: ushort lun; ! 264: ushort rflag; ! 265: ushort status; ! 266: Scsidata cmd; ! 267: Scsidata data; ! 268: Scsibuf* b; ! 269: uchar* save; ! 270: uchar cmdblk[16]; ! 271: }; ! 272: ! 273: /* character based IO (mouse, keyboard, console screen) */ ! 274: #define NQ 4096 ! 275: struct IOQ ! 276: { ! 277: Lock; ! 278: uchar buf[NQ]; ! 279: uchar *in; ! 280: uchar *out; ! 281: int state; ! 282: Rendez r; ! 283: union{ ! 284: void (*puts)(IOQ*, void*, int); /* output */ ! 285: int (*putc)(IOQ*, int); /* input */ ! 286: }; ! 287: union{ ! 288: int (*gets)(IOQ*, void*, int); /* input */ ! 289: int (*getc)(IOQ*); /* output */ ! 290: }; ! 291: void *ptr; ! 292: }; ! 293: ! 294: struct KIOQ ! 295: { ! 296: QLock; ! 297: IOQ; ! 298: int repeat; ! 299: int c; ! 300: int count; ! 301: }; ! 302: ! 303: struct Mount ! 304: { ! 305: ulong mountid; ! 306: Mount *next; ! 307: Mhead *head; ! 308: Chan *to; /* channel replacing underlying channel */ ! 309: }; ! 310: ! 311: struct Mhead ! 312: { ! 313: Chan *from; /* channel mounted upon */ ! 314: Mount *mount; /* what's mounted upon it */ ! 315: Mhead *hash; /* Hash chain */ ! 316: }; ! 317: ! 318: enum ! 319: { ! 320: NUser, /* note provided externally */ ! 321: NExit, /* deliver note quietly */ ! 322: NDebug, /* print debug message */ ! 323: }; ! 324: ! 325: struct Note ! 326: { ! 327: char msg[ERRLEN]; ! 328: int flag; /* whether system posted it */ ! 329: }; ! 330: ! 331: enum ! 332: { ! 333: PG_NOFLUSH = 0, /* Fields for cache control of pages */ ! 334: PG_TXTFLUSH = 1, ! 335: PG_DATFLUSH = 2, ! 336: PG_MOD = 0x01, /* Simulated modified and referenced bits */ ! 337: PG_REF = 0x02, ! 338: }; ! 339: ! 340: struct Page ! 341: { ! 342: Lock; ! 343: ulong pa; /* Physical address in memory */ ! 344: ulong va; /* Virtual address for user */ ! 345: ulong daddr; /* Disc address on swap */ ! 346: ushort ref; /* Reference count */ ! 347: char modref; /* Simulated modify/reference bits */ ! 348: char cachectl[MAXMACH]; /* Cache flushing control for putmmu */ ! 349: Image *image; /* Associated text or swap image */ ! 350: Page *next; /* Lru free list */ ! 351: Page *prev; ! 352: Page *hash; /* Image hash chains */ ! 353: }; ! 354: ! 355: struct Swapalloc ! 356: { ! 357: Lock; /* Free map lock */ ! 358: int free; /* Number of currently free swap pages */ ! 359: uchar *swmap; /* Base of swap map in memory */ ! 360: uchar *alloc; /* Round robin allocator */ ! 361: uchar *last; /* Speed swap allocation */ ! 362: uchar *top; /* Top of swap map */ ! 363: Rendez r; /* Pager kproc idle sleep */ ! 364: ulong highwater; /* Threshold beyond which we must page */ ! 365: ulong headroom; /* Space pager keeps free under highwater */ ! 366: }swapalloc; ! 367: ! 368: struct Image ! 369: { ! 370: Ref; ! 371: Chan *c; /* Channel associated with running image */ ! 372: Qid qid; /* Qid for page cache coherence checks */ ! 373: Qid mqid; ! 374: Chan *mchan; ! 375: ushort type; /* Device type of owning channel */ ! 376: Segment *s; /* TEXT segment for image if running */ ! 377: Image *hash; /* Qid hash chains */ ! 378: Image *next; /* Free list */ ! 379: }; ! 380: ! 381: struct Pte ! 382: { ! 383: Page *pages[PTEPERTAB]; /* Page map for this chunk of pte */ ! 384: Page **first; /* First used entry */ ! 385: Page **last; /* Last used entry */ ! 386: Pte *next; /* Free list */ ! 387: }; ! 388: ! 389: /* Segment types */ ! 390: enum ! 391: { ! 392: SG_TYPE = 07, /* Mask type of segment */ ! 393: SG_TEXT = 00, ! 394: SG_DATA = 01, ! 395: SG_BSS = 02, ! 396: SG_STACK = 03, ! 397: SG_SHARED = 04, ! 398: SG_PHYSICAL = 05, ! 399: SG_SHDATA = 06, ! 400: ! 401: SG_RONLY = 040, /* Segment is read only */ ! 402: SG_CEXEC = 0100, /* Detach at exec */ ! 403: }; ! 404: ! 405: #define PG_ONSWAP 1 ! 406: #define onswap(s) (((ulong)s)&PG_ONSWAP) ! 407: #define pagedout(s) (((ulong)s)==0 || onswap(s)) ! 408: #define swapaddr(s) (((ulong)s)&~PG_ONSWAP) ! 409: ! 410: #define SEGMAXSIZE (SEGMAPSIZE*PTEMAPMEM) ! 411: ! 412: struct Physseg ! 413: { ! 414: ulong attr; /* Segment attributes */ ! 415: char *name; /* Attach name */ ! 416: ulong pa; /* Physical address */ ! 417: ulong size; /* Maximum segment size in pages */ ! 418: Page *(*pgalloc)(Segment*, ulong); /* Allocation if we need it */ ! 419: void (*pgfree)(Page*); ! 420: }; ! 421: ! 422: struct Segment ! 423: { ! 424: Ref; ! 425: QLock lk; ! 426: ushort steal; /* Page stealer lock */ ! 427: Segment *next; /* free list pointers */ ! 428: ushort type; /* segment type */ ! 429: ulong base; /* virtual base */ ! 430: ulong top; /* virtual top */ ! 431: ulong size; /* size in pages */ ! 432: ulong fstart; /* start address in file for demand load */ ! 433: ulong flen; /* length of segment in file */ ! 434: int flushme; /* maintain consistent icache for this segment */ ! 435: Image *image; /* text in file attached to this segment */ ! 436: Physseg *pseg; ! 437: Pte *map[SEGMAPSIZE]; /* segment pte map */ ! 438: }; ! 439: ! 440: enum ! 441: { ! 442: RENDHASH = 32, /* Hash to lookup rendezvous tags */ ! 443: MNTHASH = 32, /* Hash to walk mount table */ ! 444: NFD = 100, /* Number of per process file descriptors */ ! 445: PGHLOG = 9, ! 446: PGHSIZE = 1<<PGHLOG, /* Page hash for image lookup */ ! 447: }; ! 448: #define REND(p,s) ((p)->rendhash[(s)%RENDHASH]) ! 449: #define MOUNTH(p,s) ((p)->mnthash[(s)->qid.path%MNTHASH]) ! 450: ! 451: struct Pgrp ! 452: { ! 453: Ref; /* also used as a lock when mounting */ ! 454: Pgrp *next; /* free list */ ! 455: ulong pgrpid; ! 456: QLock debug; /* single access via devproc.c */ ! 457: RWlock ns; /* Namespace many read/one write lock */ ! 458: Mhead *mnthash[MNTHASH]; ! 459: Proc *rendhash[RENDHASH]; /* Rendezvous tag hash */ ! 460: }; ! 461: ! 462: struct Egrp ! 463: { ! 464: Ref; ! 465: QLock; ! 466: Evalue *entries; ! 467: ulong path; ! 468: }; ! 469: ! 470: struct Evalue ! 471: { ! 472: char *name; ! 473: char *value; ! 474: int len; ! 475: ulong path; ! 476: Evalue *link; ! 477: }; ! 478: ! 479: struct Fgrp ! 480: { ! 481: Ref; ! 482: Chan *fd[NFD]; ! 483: int maxfd; /* highest fd in use */ ! 484: }; ! 485: ! 486: struct Palloc ! 487: { ! 488: Lock; ! 489: ulong p0, p1; /* base of pages in bank 0/1 */ ! 490: ulong np0, np1; /* number of pages in bank 0/1 */ ! 491: Page *head; /* most recently used */ ! 492: Page *tail; /* least recently used */ ! 493: ulong freecount; /* how many pages on free list now */ ! 494: ulong user; /* how many user pages */ ! 495: Page *hash[PGHSIZE]; ! 496: Lock hashlock; ! 497: Rendez r; /* Sleep for free mem */ ! 498: QLock pwait; /* Queue of procs waiting for memory */ ! 499: int wanted; /* Do the wakeup at free */ ! 500: ulong cmembase; /* Key memory protected from read by devproc */ ! 501: ulong cmemtop; ! 502: }; ! 503: ! 504: struct Waitq ! 505: { ! 506: Waitmsg w; ! 507: Waitq *next; ! 508: }; ! 509: ! 510: enum ! 511: { ! 512: RFNAMEG = (1<<0), ! 513: RFENVG = (1<<1), ! 514: RFFDG = (1<<2), ! 515: RFNOTEG = (1<<3), ! 516: RFPROC = (1<<4), ! 517: RFMEM = (1<<5), ! 518: RFNOWAIT = (1<<6), ! 519: RFCNAMEG = (1<<10), ! 520: RFCENVG = (1<<11), ! 521: RFCFDG = (1<<12) ! 522: }; ! 523: ! 524: /* ! 525: * process memory segments - NSEG always last ! ! 526: */ ! 527: enum ! 528: { ! 529: SSEG, TSEG, DSEG, BSEG, ESEG, LSEG, SEG1, SEG2, NSEG ! 530: }; ! 531: ! 532: enum ! 533: { ! 534: Dead = 0, /* Process states */ ! 535: Moribund, ! 536: Ready, ! 537: Scheding, ! 538: Running, ! 539: Queueing, ! 540: Wakeme, ! 541: Broken, ! 542: Stopped, ! 543: Rendezvous, ! 544: ! 545: Proc_stopme = 1, /* devproc requests */ ! 546: Proc_exitme, ! 547: Proc_traceme, ! 548: ! 549: TUser = 0, /* Proc.time */ ! 550: TSys, ! 551: TReal, ! 552: TCUser, ! 553: TCSys, ! 554: TCReal, ! 555: ! 556: Nrq = 20, /* number of scheduler priority levels */ ! 557: PriNormal = 10, /* base priority for normal processes */ ! 558: PriKproc = 13, /* base priority for kernel processes */ ! 559: PriRoot = 13, /* base priority for root processes */ ! 560: }; ! 561: ! 562: struct Proc ! 563: { ! 564: Label sched; ! 565: Mach *mach; /* machine running this proc */ ! 566: char text[NAMELEN]; ! 567: char user[NAMELEN]; ! 568: Proc *rnext; /* next process in run queue */ ! 569: Proc *qnext; /* next process on queue for a QLock */ ! 570: QLock *qlock; /* address of qlock being queued for DEBUG */ ! 571: ulong qlockpc; /* pc of last call to qlock */ ! 572: int state; ! 573: char *psstate; /* What /proc/#/status reports */ ! 574: Page *upage; /* page from palloc */ ! 575: Segment *seg[NSEG]; ! 576: ulong pid; ! 577: ulong noteid; /* Equivalent of note group */ ! 578: ! 579: Lock exl; /* Lock count and waitq */ ! 580: Waitq *waitq; /* Exited processes wait children */ ! 581: int nchild; /* Number of living children */ ! 582: int nwait; /* Number of uncollected wait records */ ! 583: QLock qwaitr; ! 584: Rendez waitr; /* Place to hang out in wait */ ! 585: Proc *parent; ! 586: ! 587: Pgrp *pgrp; /* Process group for notes and namespace */ ! 588: Egrp *egrp; /* Environment group */ ! 589: Fgrp *fgrp; /* File descriptor group */ ! 590: ! 591: ulong parentpid; ! 592: ulong time[6]; /* User, Sys, Real; child U, S, R */ ! 593: short insyscall; ! 594: int fpstate; ! 595: ! 596: QLock debug; /* to access debugging elements of User */ ! 597: Proc *pdbg; /* the debugging process */ ! 598: ulong procmode; /* proc device file mode */ ! 599: int hang; /* hang at next exec for debug */ ! 600: int procctl; /* Control for /proc debugging */ ! 601: ulong pc; /* DEBUG only */ ! 602: ! 603: Rendez *r; /* rendezvous point slept on */ ! 604: Rendez sleep; /* place for syssleep/debug */ ! 605: int notepending; /* note issued but not acted on */ ! 606: int kp; /* true if a kernel process */ ! 607: Proc *palarm; /* Next alarm time */ ! 608: ulong alarm; /* Time of call */ ! 609: int hasspin; /* I hold a spin lock */ ! 610: int newtlb; /* Pager has touched my tables so I must flush */ ! 611: ! 612: ulong rendtag; /* Tag for rendezvous */ ! 613: ulong rendval; /* Value for rendezvous */ ! 614: Proc *rendhash; /* Hash list for tag values */ ! 615: ! 616: ulong twhen; ! 617: Rendez *trend; ! 618: Proc *tlink; ! 619: int (*tfn)(void*); ! 620: ! 621: Mach *mp; /* machine this process last ran on */ ! 622: ulong priority; /* priority level */ ! 623: ulong basepri; /* base priority level */ ! 624: ulong rt; /* # ticks used since last blocked */ ! 625: ulong art; /* avg # ticks used since last blocked */ ! 626: ulong movetime; /* last time process switched processors */ ! 627: ulong readytime; /* time process went ready */ ! 628: ! 629: /* ! 630: * machine specific MMU ! 631: */ ! 632: PMMU; ! 633: }; ! 634: ! 635: /* ! 636: * operations available to a queue ! 637: */ ! 638: struct Qinfo ! 639: { ! 640: Streamput *iput; /* input routine */ ! 641: Streamput *oput; /* output routine */ ! 642: Streamopen *open; ! 643: Streamclose *close; ! 644: char *name; ! 645: Streamreset *reset; /* initialization */ ! 646: char nodelim; /* True if stream does not preserve delimiters */ ! 647: Qinfo *next; ! 648: }; ! 649: ! 650: /* Queue.flag */ ! 651: enum ! 652: { ! 653: QHUNGUP = 0x1, /* stream has been hung up */ ! 654: QINUSE = 0x2, /* allocation check */ ! 655: QHIWAT = 0x4, /* queue has gone past the high water mark */ ! 656: QDEBUG = 0x8, ! 657: }; ! 658: ! 659: struct Queue ! 660: { ! 661: Blist; ! 662: int flag; ! 663: Qinfo *info; /* line discipline definition */ ! 664: Queue *other; /* opposite direction, same line discipline */ ! 665: Queue *next; /* next queue in the stream */ ! 666: void (*put)(Queue*, Block*); ! 667: QLock rlock; /* mutex for processes sleeping at r */ ! 668: Rendez r; /* standard place to wait for flow control */ ! 669: Rendez *rp; /* where flow control wakeups go to */ ! 670: void *ptr; /* private info for the queue */ ! 671: }; ! 672: ! 673: struct Stream ! 674: { ! 675: QLock; /* structure lock */ ! 676: Stream *next; ! 677: short inuse; /* number of processes in stream */ ! 678: short opens; /* number of processes with stream open */ ! 679: ushort hread; /* number of reads after hangup */ ! 680: ushort type; /* correlation with Chan */ ! 681: ushort dev; /* ... */ ! 682: ulong id; /* ... */ ! 683: QLock rdlock; /* read lock */ ! 684: Queue *procq; /* write queue at process end */ ! 685: Queue *devq; /* read queue at device end */ ! 686: Block *err; /* error message from down stream */ ! 687: int flushmsg; /* flush up till the next delimiter */ ! 688: }; ! 689: ! 690: /* ! 691: * useful stream macros ! 692: */ ! 693: #define RD(q) ((q)->other < (q) ? (q->other) : q) ! 694: #define WR(q) ((q)->other > (q) ? (q->other) : q) ! 695: #define STREAMTYPE(x) ((x)&0x1f) ! 696: #define STREAMID(x) (((x)&~CHDIR)>>5) ! 697: #define STREAMQID(i,t) (((i)<<5)|(t)) ! 698: #define PUTTHIS(q,b) (*(q)->put)((q), b) ! 699: #define PUTNEXT(q,b) (*(q)->next->put)((q)->next, b) ! 700: #define BLEN(b) ((b)->wptr - (b)->rptr) ! 701: #define QFULL(q) ((q)->flag & QHIWAT) ! 702: #define FLOWCTL(q,b) { if(QFULL(q->next)) flowctl(q,b); else PUTNEXT(q,b);} ! 703: ! 704: /* ! 705: * stream file qid's & high water mark ! 706: */ ! 707: enum ! 708: { ! 709: Shighqid = STREAMQID(1,0) - 1, ! 710: Sdataqid = Shighqid, ! 711: Sctlqid = Sdataqid-1, ! 712: Slowqid = Sctlqid, ! 713: Streamhi = (32*1024), /* byte count high water mark */ ! 714: Streambhi = 128, /* block count high water mark */ ! 715: }; ! 716: ! 717: /* ! 718: * a multiplexed network ! 719: */ ! 720: struct Netprot ! 721: { ! 722: int id; ! 723: Netprot *next; /* linked list of protections */ ! 724: ulong mode; ! 725: char owner[NAMELEN]; ! 726: }; ! 727: ! 728: struct Netinf ! 729: { ! 730: char *name; ! 731: void (*fill)(Chan*, char*, int); ! 732: }; ! 733: ! 734: struct Network ! 735: { ! 736: Lock; ! 737: char *name; ! 738: int nconv; /* max # of conversations */ ! 739: Qinfo *devp; /* device end line disc */ ! 740: Qinfo *protop; /* protocol line disc */ ! 741: int (*listen)(Chan*); ! 742: int (*clone)(Chan*); ! 743: int ninfo; ! 744: Netinf info[5]; ! 745: Netprot *prot; /* linked list of protections */ ! 746: }; ! 747: ! 748: /* ! 749: * Parallax for pen pointers ! 750: */ ! 751: struct Parallax ! 752: { ! 753: int xoff; ! 754: int xnum; ! 755: int xdenom; ! 756: ! 757: int yoff; ! 758: int ynum; ! 759: int ydenom; ! 760: }; ! 761: ! 762: enum ! 763: { ! 764: PRINTSIZE = 256, ! 765: MAXCRYPT = 127, ! 766: NUMSIZE = 12, /* size of formatted number */ ! 767: MB = (1024*1024), ! 768: }; ! 769: ! 770: extern Conf conf; ! 771: extern char* conffile; ! 772: extern int cpuserver; ! 773: extern Rune* devchar; ! 774: extern Dev devtab[]; ! 775: extern char eve[]; ! 776: extern char hostdomain[]; ! 777: extern int hwcurs; ! 778: extern uchar initcode[]; ! 779: extern FPsave initfp; ! 780: extern KIOQ kbdq; ! 781: extern IOQ lineq; ! 782: extern IOQ mouseq; ! 783: extern Ref noteidalloc; ! 784: extern int nrdy; ! 785: extern IOQ printq; ! 786: extern char* statename[]; ! 787: extern Image swapimage; ! 788: extern char sysname[NAMELEN]; ! 789: extern Talarm talarm; ! 790: extern Palloc palloc; ! 791: extern int cpuserver; ! 792: extern Physseg physseg[]; ! 793: ! 794: enum ! 795: { ! 796: CHDIR = 0x80000000L, ! 797: CHAPPEND = 0x40000000L, ! 798: CHEXCL = 0x20000000L, ! 799: CHMOUNT = 0x10000000L, ! 800: }; ! 801: ! 802: /* ! 803: * auth messages ! 804: */ ! 805: enum ! 806: { ! 807: FScchal = 1, ! 808: FSschal, ! 809: FSok, ! 810: FSctick, ! 811: FSstick, ! 812: FSerr, ! 813: ! 814: RXschal = 0, ! 815: RXstick = 1, ! 816: }; ! 817: ! 818: /* ! 819: * mouse types ! 820: */ ! 821: enum ! 822: { ! 823: Mouseother= 0, ! 824: Mouseserial= 1, ! 825: MousePS2= 2, ! 826: Mousekurta= 3, ! 827: }; ! 828: extern int mouseshifted; ! 829: extern int mousetype; ! 830: extern int mouseswap;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.