plan 9 kernel history: overview | file list | diff list

1992/0326/port/portdat.h (diff list | history)

port/portdat.h on 1991/0428
1991/0428    
typedef struct Alarm	Alarm; 
1991/0513    
typedef struct Alarms	Alarms; 
1991/0428    
typedef struct Block	Block; 
typedef struct Blist	Blist; 
typedef struct Chan	Chan; 
1991/1127    
typedef struct Crypt	Crypt; 
1991/0428    
typedef struct Dev	Dev; 
typedef struct Dirtab	Dirtab; 
1991/0705    
typedef struct Egrp	Egrp; 
1991/0428    
typedef struct Env	Env; 
typedef struct Envval	Envval; 
typedef struct Etherpkt	Etherpkt; 
1991/0705    
typedef struct Fgrp	Fgrp; 
typedef struct Image	Image; 
1991/0607    
typedef struct IOQ	IOQ; 
typedef struct KIOQ	KIOQ; 
1991/0428    
typedef struct List	List; 
typedef struct Mount	Mount; 
1991/1011    
typedef struct Mhead	Mhead; 
1991/1115    
typedef struct Netinf	Netinf; 
typedef struct Netprot	Netprot; 
1991/1106    
typedef struct Network	Network; 
1991/0428    
typedef struct Note	Note; 
typedef struct Page	Page; 
1991/0705    
typedef struct Palloc	Palloc; 
1992/0128    
typedef struct Pgrps	Pgrps; 
1991/0428    
typedef struct Pgrp	Pgrp; 
typedef struct Proc	Proc; 
1991/0705    
typedef struct Pte	Pte; 
1991/0428    
typedef struct Qinfo	Qinfo; 
typedef struct QLock	QLock; 
typedef struct Queue	Queue; 
typedef struct Ref	Ref; 
typedef struct Rendez	Rendez; 
1991/1011    
typedef struct RWlock	RWlock; 
1991/0705    
typedef struct Segment	Segment; 
1991/0428    
typedef struct Stream	Stream; 
1991/0926    
typedef struct Waitq	Waitq; 
1992/0307    
typedef int    Devgen(Chan*, Dirtab*, int, int, Dir*); 
1991/0428    
 
struct List 
{ 
	void	*next; 
}; 
 
struct Ref 
{ 
	Lock; 
1992/0309    
	long	ref; 
1991/0428    
}; 
 
struct Rendez 
{ 
	Lock; 
	Proc	*p; 
}; 
 
struct QLock 
{ 
1991/1105    
	Lock	use;			/* to access Qlock structure */ 
1991/0428    
	Proc	*head;			/* next process waiting for object */ 
	Proc	*tail;			/* last process waiting for object */ 
1991/1002    
	int	locked;			/* flag */ 
1991/0428    
}; 
 
1991/1011    
struct RWlock 
{ 
	Lock;				/* Lock modify lock */ 
	QLock	x;			/* Mutual exclusion lock */ 
	QLock	k;			/* Lock for waiting writers held for readers */ 
	int	readers;		/* Count of readers in lock */ 
}; 
 
1991/0428    
struct Alarm 
{ 
	List; 
	Lock; 
	int	busy; 
1991/0724    
	long	dt;			/* may underflow in clock(); must be signed */ 
1991/0428    
	void	(*f)(void*); 
	void	*arg; 
}; 
 
1991/0513    
struct Alarms 
{ 
1991/0727    
	Lock; 
1991/0513    
	Proc	*head; 
}; 
 
1991/0428    
/* Block.flags */ 
#define S_DELIM 0x80 
#define S_CLASS 0x07 
 
/* Block.type */ 
#define M_DATA 0 
#define M_CTL 1 
#define M_HANGUP 2 
 
struct Block 
{ 
	Block	*next; 
1991/10302    
	Block	*list;			/* chain of block lists */ 
1991/0724    
	uchar	*rptr;			/* first unconsumed byte */ 
	uchar	*wptr;			/* first empty byte */ 
	uchar	*lim;			/* 1 past the end of the buffer */ 
	uchar	*base;			/* start of the buffer */ 
1991/0428    
	uchar	flags; 
	uchar	type; 
1992/0222    
	ulong	pc;			/* pc of caller */ 
1991/0428    
}; 
 
struct Blist { 
	Lock; 
1991/0724    
	Block	*first;			/* first data block */ 
	Block	*last;			/* last data block */ 
	long	len;			/* length of list in bytes */ 
	int	nb;			/* number of blocks in list */ 
1991/0428    
}; 
 
/* 
 * Access types in namec 
 */ 
enum 
{ 
1991/0724    
	Aaccess,			/* as in access, stat */ 
	Atodir,				/* as in chdir */ 
	Aopen,				/* for i/o */ 
	Amount,				/* to be mounted upon */ 
	Acreate,			/* file is to be created */ 
1991/0428    
}; 
 
/* 
 *  Chan.flags 
 */ 
1991/0724    
#define	COPEN	1			/* for i/o */ 
1991/1011    
#define	CMSG	2			/* is the message channel for a mount */ 
#define	CCREATE	4			/* permits creation if c->mnt */ 
1991/0724    
#define	CCEXEC	8			/* close on exec */ 
#define	CFREE	16			/* not in use */ 
1991/0428    
 
struct Chan 
{ 
	QLock	rdl;			/* read access */ 
	QLock	wrl;			/* write access */ 
1991/1101    
	Lock	offl;			/* offset access */ 
1991/0428    
	Ref; 
	union{ 
		Chan	*next;		/* allocation */ 
		ulong	offset;		/* in file */ 
	}; 
	ushort	type; 
	ushort	dev; 
	ushort	mode;			/* read/write */ 
	ushort	flag; 
	Qid	qid; 
	Mount	*mnt;			/* mount point that derived Chan */ 
	ulong	mountid; 
	int	fid;			/* for devmnt */ 
1992/0318    
	Stream	*stream;		/* for stream channels */ 
1991/0428    
	union { 
		void	*aux; 
		Qid	pgrpid;		/* for #p/notepg */ 
		int	mntindex;	/* for devmnt */ 
	}; 
	Chan	*mchan;			/* channel to mounted server */ 
	Qid	mqid;			/* qid of root of mount point */ 
}; 
 
1991/1127    
struct Crypt 
{ 
1991/1207    
	char	key[DESKEYLEN];		/* des encryption key */ 
1991/1127    
	char	chal[8];		/* challenge for setting user name */ 
}; 
 
1991/0428    
struct Dev 
{ 
	void	 (*reset)(void); 
	void	 (*init)(void); 
	Chan	*(*attach)(char*); 
	Chan	*(*clone)(Chan*, Chan*); 
	int	 (*walk)(Chan*, char*); 
	void	 (*stat)(Chan*, char*); 
	Chan	*(*open)(Chan*, int); 
	void	 (*create)(Chan*, char*, int, ulong); 
	void	 (*close)(Chan*); 
	long	 (*read)(Chan*, void*, long, ulong); 
	long	 (*write)(Chan*, void*, long, ulong); 
	void	 (*remove)(Chan*); 
	void	 (*wstat)(Chan*, char*); 
}; 
 
struct Dirtab 
{ 
	char	name[NAMELEN]; 
	Qid	qid; 
	long	length; 
	long	perm; 
}; 
 
struct Env 
{ 
1991/1018    
	Envval	*name; 
1991/0428    
	Envval	*val; 
}; 
 
/* 
 *  Ethernet packet buffers. 
 */ 
struct Etherpkt { 
	uchar d[6]; 
	uchar s[6]; 
	uchar type[2]; 
	uchar data[1500]; 
	uchar crc[4]; 
}; 
1991/0724    
#define	ETHERMINTU	60		/* minimum transmit size */ 
#define	ETHERMAXTU	1514		/* maximum transmit size */ 
#define ETHERHDRSIZE	14		/* size of an ethernet header */ 
1991/0428    
 
1991/0607    
/* 
 *  character based IO (mouse, keyboard, console screen) 
 */ 
#define NQ	4096 
struct IOQ 
{ 
	Lock; 
	uchar	buf[NQ]; 
	uchar	*in; 
	uchar	*out; 
	int	state; 
	Rendez	r; 
	union{ 
		void	(*puts)(IOQ*, void*, int);	/* output */ 
		int	(*putc)(IOQ*, int);		/* input */ 
	}; 
1991/0810    
	union{ 
		int	(*gets)(IOQ*, void*, int);	/* input */ 
		int	(*getc)(IOQ*);			/* output */ 
	}; 
1991/0607    
	void	*ptr; 
}; 
1992/0307    
 
1991/0607    
struct KIOQ 
{ 
	QLock; 
	IOQ; 
	int	repeat; 
	int	c; 
	int	count; 
}; 
1992/0307    
 
1991/0607    
extern IOQ	lineq; 
extern IOQ	printq; 
extern IOQ	mouseq; 
extern KIOQ	kbdq; 
 
1991/0428    
struct Mount 
{ 
	ulong	mountid; 
	Mount	*next; 
1991/1011    
	Mhead	*head; 
	Chan	*to;			/* channel replacing underlying channel */ 
1991/0428    
}; 
 
1991/1011    
struct Mhead 
1991/0428    
{ 
1991/1011    
	Chan	*from;			/* channel mounted upon */ 
	Mount	*mount;			/* what's mounted upon it */ 
	Mhead	*hash;			/* Hash chain */ 
1991/0428    
}; 
 
1992/0307    
enum 
{ 
1991/0428    
	NUser,				/* note provided externally */ 
1991/1105    
	NExit,				/* deliver note quietly */ 
	NDebug,				/* print debug message */ 
1991/0428    
}; 
 
struct Note 
{ 
	char	msg[ERRLEN]; 
	int	flag;			/* whether system posted it */ 
}; 
 
1991/0705    
/* Fields for cache control of pages */ 
#define	PG_NOFLUSH	0 
#define PG_TXTFLUSH	1 
#define PG_DATFLUSH	2 
/* Simulated modified and referenced bits */ 
#define PG_MOD		0x01 
#define PG_REF		0x02 
1991/0428    
 
1991/0705    
struct Page 
1991/0428    
{ 
1991/0705    
	ulong	pa;			/* Physical address in memory */ 
	ulong	va;			/* Virtual address for user */ 
	ulong	daddr;			/* Disc address on swap */ 
	ushort	ref;			/* Reference count */ 
	char	lock;			/* Software lock */ 
	char	modref;			/* Simulated modify/reference bits */ 
	char	cachectl[MAXMACH];	/* Cache flushing control for putmmu */ 
	Image	*image;			/* Associated text or swap image */ 
	Page	*next;			/* Lru free list */ 
	Page	*prev; 
	Page	*hash;			/* Image hash chains */ 
}; 
 
struct Swapalloc 
{ 
1991/0724    
	Lock;				/* Free map lock */ 
	int	free;			/* Number of currently free swap pages */ 
	char	*swmap;			/* Base of swap map in memory */ 
	char	*alloc;			/* Round robin allocator */ 
	char	*top;			/* Top of swap map */ 
	Rendez	r;			/* Pager kproc idle sleep */ 
1992/0303    
	ulong	highwater;		/* Threshold beyond which we must page */ 
	ulong	headroom;		/* Space pager attempts to clear below highwater */ 
1991/0705    
}swapalloc; 
 
struct Image 
{ 
	Ref; 
	Chan	*c;			/* Channel associated with running image */ 
	Qid 	qid;			/* Qid for page cache coherence checks */ 
1991/0428    
	Qid	mqid; 
1991/0705    
	Chan	*mchan; 
	ushort	type;			/* Device type of owning channel */ 
	Segment *s;			/* TEXT segment for image if running, may be null */ 
	Image	*hash;			/* Qid hash chains */ 
	Image	*next;			/* Free list */ 
1991/0428    
}; 
 
1991/0705    
struct Pte 
1991/0428    
{ 
1992/0131    
	Page	*pages[PTEPERTAB];	/* Page map for this chunk of pte */ 
	Page	**first;		/* First used entry */ 
	Page	**last;			/* Last used entry */ 
	Pte	*next;			/* Free list */ 
1991/0428    
}; 
 
1991/0705    
/* Segment types */ 
1992/0307    
#define SG_TYPE		07		/* Mask type of segment */ 
#define SG_TEXT		00 
#define SG_DATA		01 
#define SG_BSS		02 
#define SG_STACK	03 
#define SG_SHARED	04 
#define SG_PHYSICAL	05 
#define SG_SHDATA	06 
 
1991/0705    
/* Segment flags */ 
1992/0303    
#define SG_RONLY	040			/* Segment is read only */ 
1991/0705    
 
#define PG_ONSWAP	1 
#define pagedout(s)	(((ulong)s)==0 || (((ulong)s)&PG_ONSWAP)) 
#define swapaddr(s)	(((ulong)s)&~PG_ONSWAP) 
#define onswap(s)	(((ulong)s)&PG_ONSWAP) 
 
#define SEGMAXSIZE	(SEGMAPSIZE*PTEMAPMEM) 
 
struct Segment 
{ 
	Ref; 
	QLock	lk; 
	ushort	steal;			/* Page stealer lock */ 
	Segment	*next;			/* free list pointers */ 
	ushort	type;			/* segment type */ 
	ulong	base;			/* virtual base */ 
	ulong	top;			/* virtual top */ 
	ulong	size;			/* size in pages */ 
	ulong	fstart;			/* start address in file for demand load */ 
	ulong	flen;			/* length of segment in file */ 
1991/0706    
	int	flushme;		/* maintain consistent icache for this segment */ 
1991/0705    
	Image	*image;			/* image in file system attached to this segment */ 
	Page	*(*pgalloc)(ulong addr);/* SG_PHYSICAL page allocator */ 
	void	(*pgfree)(Page *);	/* SG_PHYSICAL page free */ 
	Pte	*map[SEGMAPSIZE];	/* segment pte map */ 
}; 
 
1991/0806    
#define RENDHASH	32 
#define REND(p,s)	((p)->rendhash[(s)%RENDHASH]) 
1991/1011    
#define MNTHASH		32 
#define MOUNTH(p,s)	((p)->mnthash[(s)->qid.path%MNTHASH]) 
1991/0806    
 
1991/0428    
struct Pgrp 
{ 
	Ref;				/* also used as a lock when mounting */ 
1991/0705    
	Pgrp	*next;			/* free list */ 
1991/0428    
	int	index;			/* index in pgrp table */ 
	ulong	pgrpid; 
1991/1127    
	Crypt	*crypt;			/* encryption key and challenge */ 
1991/0428    
	QLock	debug;			/* single access via devproc.c */ 
1991/1011    
	RWlock	ns;			/* Namespace many read/one write lock */ 
	Mhead	*mnthash[MNTHASH]; 
1991/0806    
	Proc	*rendhash[RENDHASH];	/* Rendezvous tag hash */ 
1991/0705    
}; 
 
struct Egrp 
{ 
	Ref; 
	Egrp	*next; 
	int	nenv;			/* highest active env table entry, +1 */ 
1991/1018    
	QLock	ev;			/* for all of etab */ 
	Env	*etab; 
1991/0428    
}; 
 
1991/0705    
#define	NFD	100 
struct Fgrp 
{ 
	Ref; 
	Fgrp	*next; 
	Chan	*fd[NFD]; 
	int	maxfd;			/* highest fd in use */ 
}; 
 
#define PGHSIZE	512 
struct Palloc 
{ 
	Lock; 
1991/0802    
	ulong	addr0;			/* next available ialloc addr in bank 0 */ 
	ulong	addr1;			/* next available ialloc addr in bank 1 */ 
1991/0705    
	int	active; 
1991/0724    
	Page	*head;			/* most recently used */ 
	Page	*tail;			/* least recently used */ 
	ulong	freecount;		/* how many pages on free list now */ 
	ulong	user;			/* how many user pages */ 
1991/0705    
	Page	*hash[PGHSIZE]; 
	Lock	hashlock; 
1991/0724    
	Rendez	r;			/* Sleep for free mem */ 
	QLock	pwait;			/* Queue of procs waiting for memory */ 
	int	wanted;			/* Do the wakeup at free */ 
1991/0705    
}; 
 
1992/0128    
struct Pgrps 
{ 
	Lock; 
	Pgrp	*arena; 
	Pgrp	*free; 
	ulong	pgrpid; 
	ulong	cryptbase; 
	ulong	crypttop; 
}; 
 
1991/0926    
struct Waitq 
{ 
	Waitmsg	w; 
	Waitq	*next; 
}; 
 
1991/0514    
enum					/* Argument to forkpgrp call */ 
{ 
	FPall 	  = 0,			/* Concession to back portablility */ 
	FPnote 	  = 1, 
	FPnamespc = 2, 
	FPenv	  = 4, 
	FPclear	  = 8, 
}; 
 
1991/0807    
enum 
{ 
	Forkpg	  = 1, 
	Forkeg	  = 2, 
	Forkfd	  = 4, 
}; 
 
1991/0428    
/* 
1991/0605    
 *  process memory segments - NSEG always last ! 
1991/0428    
 */ 
1991/0605    
enum 
{ 
1991/0705    
	SSEG, TSEG, DSEG, BSEG, ESEG, LSEG, SEG1, SEG2, NSEG 
1991/0605    
}; 
1991/0428    
 
/* 
 * Process states 
 */ 
enum 
{ 
	Dead = 0, 
	Moribund, 
	Ready, 
	Scheding, 
	Running, 
	Queueing, 
	Wakeme, 
	Broken, 
1991/0705    
	Stopped, 
1991/0806    
	Rendezvous, 
1991/0428    
}; 
 
/* 
1991/0705    
 * devproc requests 
 */ 
enum 
{ 
	Proc_stopme = 1, 
	Proc_exitme = 2, 
1991/1110    
	Proc_traceme = 3, 
1991/0705    
}; 
 
/* 
1991/0428    
 * Proc.time 
 */ 
enum 
{ 
	TUser, 
	TSys, 
	TReal, 
	TCUser, 
	TCSys, 
	TCReal, 
}; 
 
struct Proc 
{ 
	Label	sched; 
	Mach	*mach;			/* machine running this proc */ 
	char	text[NAMELEN]; 
1991/1105    
	char	user[NAMELEN]; 
1991/0428    
	Proc	*rnext;			/* next process in run queue */ 
	Proc	*qnext;			/* next process on queue for a QLock */ 
	QLock	*qlock;			/* address of qlock being queued for DEBUG */ 
1991/0830    
	ulong	qlockpc;		/* pc of last call to qlock */ 
1991/0428    
	int	state; 
1991/0926    
	char	*psstate;		/* What /proc/???/status reports */ 
1991/0428    
	Page	*upage;			/* BUG: should be unlinked from page list */ 
1991/0705    
	Segment	*seg[NSEG]; 
1991/0428    
	ulong	pid; 
1991/0926    
 
	Lock	exl;			/* Lock count and waitq */ 
	Waitq	*waitq;			/* Exited processes wait children */ 
	int	nchild;			/* Number of living children */ 
	int	nwait;			/* Number of uncollected wait records */ 
	Rendez	waitr;			/* Place to hang out in wait */ 
1991/0428    
	Proc	*parent; 
1991/0705    
 
	Pgrp	*pgrp;			/* Process group for notes and namespace */ 
	Egrp 	*egrp;			/* Environment group */ 
	Fgrp	*fgrp;			/* File descriptor group */ 
 
1991/0428    
	ulong	parentpid; 
	ulong	time[6];		/* User, Sys, Real; child U, S, R */ 
	short	insyscall; 
	int	fpstate; 
1991/1109    
 
1991/1216    
	QLock	debug;			/* to access debugging elements of User */ 
1991/1110    
	Proc	*pdbg;			/* the debugging process */ 
1991/1109    
	ulong	procmode;		/* proc device file mode */ 
1991/1110    
	int	hang;			/* hang at next exec for debug */ 
	int	procctl;		/* Control for /proc debugging */ 
	ulong	pc;			/* DEBUG only */ 
1991/1109    
 
1991/0428    
	Rendez	*r;			/* rendezvous point slept on */ 
1991/1110    
	Rendez	sleep;			/* place for tsleep/syssleep/debug */ 
1991/0727    
	int	notepending;		/* note issued but not acted on */ 
1991/0428    
	int	kp;			/* true if a kernel process */ 
1991/0513    
	Proc	*palarm;		/* Next alarm time */ 
	ulong	alarm;			/* Time of call */ 
1991/0705    
	int 	hasspin;		/* I hold a spin lock */ 
	int	newtlb;			/* Pager has touched my tables so I must flush */ 
1991/0806    
 
	ulong	rendtag;		/* Tag for rendezvous */  
	ulong	rendval;		/* Value for rendezvous */ 
	Proc	*rendhash;		/* Hash list for tag values */ 
1991/0504    
	/* 
1991/0507    
	 *  machine specific MMU goo 
1991/0504    
	 */ 
1991/0507    
	PMMU; 
1991/0428    
}; 
 
/* 
 *  operations available to a queue 
 */ 
struct Qinfo 
{ 
	void (*iput)(Queue*, Block*);	/* input routine */ 
	void (*oput)(Queue*, Block*);	/* output routine */ 
	void (*open)(Queue*, Stream*); 
	void (*close)(Queue*); 
	char *name; 
	void (*reset)(void);		/* initialization */ 
1992/0318    
	char nodelim;			/* True if stream does not preserve delimiters */ 
1991/0428    
	Qinfo *next; 
}; 
 
/* 
 *  Queue.flag 
 */ 
1991/0724    
#define QHUNGUP	0x1			/* flag bit meaning the stream has been hung up */ 
1991/0428    
#define QINUSE	0x2 
1991/0724    
#define QHIWAT	0x4			/* queue has gone past the high water mark */	 
1991/0428    
#define QDEBUG	0x8 
 
1992/0318    
struct Queue 
{ 
1991/0428    
	Blist; 
	int	flag; 
1991/0724    
	Qinfo	*info;			/* line discipline definition */ 
	Queue	*other;			/* opposite direction, same line discipline */ 
	Queue	*next;			/* next queue in the stream */ 
1991/0428    
	void	(*put)(Queue*, Block*); 
1991/0724    
	QLock	rlock;			/* mutex for processes sleeping at r */ 
	Rendez	r;			/* standard place to wait for flow control */ 
	Rendez	*rp;			/* where flow control wakeups go to */ 
	void	*ptr;			/* private info for the queue */ 
1991/0428    
}; 
 
1992/0318    
struct Stream 
{ 
1991/0724    
	QLock;				/* structure lock */ 
	short	inuse;			/* number of processes in stream */ 
	short	opens;			/* number of processes with stream open */ 
	ushort	hread;			/* number of reads after hangup */ 
	ushort	type;			/* correlation with Chan */ 
	ushort	dev;			/* ... */ 
	ushort	id;			/* ... */ 
	QLock	rdlock;			/* read lock */ 
	Queue	*procq;			/* write queue at process end */ 
	Queue	*devq;			/* read queue at device end */ 
	Block	*err;			/* error message from down stream */ 
1991/0809    
	int	flushmsg;		/* flush up till the next delimiter */ 
1991/0428    
}; 
 
/* 
 *  useful stream macros 
 */ 
#define	RD(q)		((q)->other < (q) ? (q->other) : q) 
#define	WR(q)		((q)->other > (q) ? (q->other) : q) 
#define STREAMTYPE(x)	((x)&0x1f) 
#define STREAMID(x)	(((x)&~CHDIR)>>5) 
#define STREAMQID(i,t)	(((i)<<5)|(t)) 
#define PUTNEXT(q,b)	(*(q)->next->put)((q)->next, b) 
#define BLEN(b)		((b)->wptr - (b)->rptr) 
#define QFULL(q)	((q)->flag & QHIWAT) 
1992/0305    
#define FLOWCTL(q,b)	{ if(QFULL(q->next)) flowctl(q,b); else PUTNEXT(q,b);} 
1991/0428    
 
/* 
 *  stream file qid's & high water mark 
 */ 
enum { 
	Shighqid = STREAMQID(1,0) - 1, 
	Sdataqid = Shighqid, 
	Sctlqid = Sdataqid-1, 
	Slowqid = Sctlqid, 
1991/0724    
	Streamhi= (9*1024),		/* byte count high water mark */ 
	Streambhi= 32,			/* block count high water mark */ 
1991/0428    
}; 
1991/1106    
 
/* 
 *  a multiplexed network 
 */ 
1991/1115    
struct Netprot 
1991/1106    
{ 
1991/1115    
	ulong	mode; 
	char	owner[NAMELEN]; 
}; 
1992/0307    
 
1991/1115    
struct Netinf 
{ 
1991/1106    
	char	*name; 
	void	(*fill)(Chan*, char*, int); 
}; 
1992/0307    
 
1991/1106    
struct Network 
{ 
1991/1115    
	Lock; 
1991/1106    
	char	*name; 
	int	nconv;			/* max # of conversations */ 
	Qinfo	*devp;			/* device end line disc */ 
	Qinfo	*protop;		/* protocol line disc */ 
	int	(*listen)(Chan*); 
	int	(*clone)(Chan*); 
	int	ninfo; 
1991/1115    
	Netinf	info[5]; 
	Netprot	*prot;			/* protections */ 
1991/1106    
}; 
#define MAJOR(q) ((q) >> 8) 
#define MINOR(q) ((q) & 0xff) 
#define DEVICE(a,i) (((a)<<8) | (i)) 
1991/0428    
 
1992/0212    
#define MAXSYSARG	5		/* for mount(fd, mpt, flag, arg, srv) */ 
1991/0428    
#define	PRINTSIZE	256 
1991/0724    
#define	NUMSIZE		12		/* size of formatted number */ 
1991/0428    
 
extern	FPsave	initfp; 
extern	Conf	conf; 
extern	ulong	initcode[]; 
extern	Dev	devtab[]; 
1992/0318    
extern	char	*devchar; 
1991/1102    
extern	char	*conffile; 
1991/0428    
extern	char	*statename[]; 
1991/0705    
extern	Palloc 	palloc; 
1992/0128    
extern	Pgrps 	pgrpalloc; 
1991/0705    
extern  Image	swapimage; 
1991/1109    
extern  char	eve[]; 
1991/1112    
extern	int	nrdy; 
1992/0321    
extern	char	sysname[NAMELEN]; 
1992/0325    
extern	int	cpuserver; 
1991/0428    
 
1991/0705    
#define	CHDIR		0x80000000L 
#define	CHAPPEND 	0x40000000L 
#define	CHEXCL		0x20000000L 
1992/0318    
 
/* 
 * auth messages 
 */ 
1992/0322    
#define AUTHLEN		8 
1992/0318    
enum{ 
	FScchal	= 1, 
1992/0321    
	FSschal, 
	FSok, 
1992/0318    
	FSctick, 
1992/0321    
	FSstick, 
	FSerr, 
1992/0318    
 
	RXschal	= 0, 
	RXstick	= 1, 
}; 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)