xref: /plan9/sys/src/cmd/unix/drawterm/kern/dat.h (revision ec59a3ddbfceee0efe34584c2c9981a5e5ff1ec4)
18ccd4a63SDavid du Colombier #define	KNAMELEN		28	/* max length of name held in kernel */
28ccd4a63SDavid du Colombier #define	DOMLEN			64
38ccd4a63SDavid du Colombier 
48ccd4a63SDavid du Colombier #define	BLOCKALIGN		8
58ccd4a63SDavid du Colombier 
68ccd4a63SDavid du Colombier typedef struct Alarms	Alarms;
78ccd4a63SDavid du Colombier typedef struct Block	Block;
88ccd4a63SDavid du Colombier typedef struct CSN	CSN;
98ccd4a63SDavid du Colombier typedef struct Chan	Chan;
108ccd4a63SDavid du Colombier typedef struct Cmdbuf	Cmdbuf;
118ccd4a63SDavid du Colombier typedef struct Cmdtab	Cmdtab;
128ccd4a63SDavid du Colombier typedef struct Cname	Cname;
138ccd4a63SDavid du Colombier typedef struct Conf	Conf;
148ccd4a63SDavid du Colombier typedef struct Dev	Dev;
158ccd4a63SDavid du Colombier typedef struct Dirtab	Dirtab;
168ccd4a63SDavid du Colombier typedef struct Edfinterface	Edfinterface;
178ccd4a63SDavid du Colombier typedef struct Egrp	Egrp;
188ccd4a63SDavid du Colombier typedef struct Evalue	Evalue;
198ccd4a63SDavid du Colombier typedef struct Fgrp	Fgrp;
208ccd4a63SDavid du Colombier typedef struct FPsave	FPsave;
218ccd4a63SDavid du Colombier typedef struct DevConf	DevConf;
228ccd4a63SDavid du Colombier typedef struct Label	Label;
238ccd4a63SDavid du Colombier typedef struct List	List;
248ccd4a63SDavid du Colombier typedef struct Log	Log;
258ccd4a63SDavid du Colombier typedef struct Logflag	Logflag;
268ccd4a63SDavid du Colombier typedef struct Mntcache Mntcache;
278ccd4a63SDavid du Colombier typedef struct Mount	Mount;
288ccd4a63SDavid du Colombier typedef struct Mntrpc	Mntrpc;
298ccd4a63SDavid du Colombier typedef struct Mntwalk	Mntwalk;
308ccd4a63SDavid du Colombier typedef struct Mnt	Mnt;
318ccd4a63SDavid du Colombier typedef struct Mhead	Mhead;
328ccd4a63SDavid du Colombier typedef struct Note	Note;
338ccd4a63SDavid du Colombier typedef struct Page	Page;
348ccd4a63SDavid du Colombier typedef struct Palloc	Palloc;
358ccd4a63SDavid du Colombier typedef struct Perf	Perf;
368ccd4a63SDavid du Colombier typedef struct Pgrps	Pgrps;
378ccd4a63SDavid du Colombier typedef struct PhysUart	PhysUart;
388ccd4a63SDavid du Colombier typedef struct Pgrp	Pgrp;
398ccd4a63SDavid du Colombier typedef struct Physseg	Physseg;
408ccd4a63SDavid du Colombier typedef struct Proc	Proc;
418ccd4a63SDavid du Colombier typedef struct Pte	Pte;
428ccd4a63SDavid du Colombier typedef struct Pthash	Pthash;
438ccd4a63SDavid du Colombier typedef struct Queue	Queue;
448ccd4a63SDavid du Colombier typedef struct Ref	Ref;
458ccd4a63SDavid du Colombier typedef struct Rendez	Rendez;
468ccd4a63SDavid du Colombier typedef struct Rgrp	Rgrp;
478ccd4a63SDavid du Colombier typedef struct RWlock	RWlock;
488ccd4a63SDavid du Colombier typedef struct Schedq	Schedq;
498ccd4a63SDavid du Colombier typedef struct Segment	Segment;
508ccd4a63SDavid du Colombier typedef struct Session	Session;
518ccd4a63SDavid du Colombier typedef struct Task	Task;
528ccd4a63SDavid du Colombier typedef struct Talarm	Talarm;
538ccd4a63SDavid du Colombier typedef struct Timer	Timer;
548ccd4a63SDavid du Colombier typedef struct Uart	Uart;
558ccd4a63SDavid du Colombier typedef struct Ureg Ureg;
568ccd4a63SDavid du Colombier typedef struct Waitq	Waitq;
578ccd4a63SDavid du Colombier typedef struct Walkqid	Walkqid;
588ccd4a63SDavid du Colombier typedef int    Devgen(Chan*, char*, Dirtab*, int, int, Dir*);
598ccd4a63SDavid du Colombier 
608ccd4a63SDavid du Colombier #include "fcall.h"
618ccd4a63SDavid du Colombier 
628ccd4a63SDavid du Colombier enum
638ccd4a63SDavid du Colombier {
648ccd4a63SDavid du Colombier 	SnarfSize = 64*1024,
658ccd4a63SDavid du Colombier };
668ccd4a63SDavid du Colombier 
678ccd4a63SDavid du Colombier struct Conf
688ccd4a63SDavid du Colombier {
698ccd4a63SDavid du Colombier 	ulong	nmach;		/* processors */
708ccd4a63SDavid du Colombier 	ulong	nproc;		/* processes */
718ccd4a63SDavid du Colombier 	ulong	monitor;	/* has monitor? */
728ccd4a63SDavid du Colombier 	ulong	npage0;		/* total physical pages of memory */
738ccd4a63SDavid du Colombier 	ulong	npage1;		/* total physical pages of memory */
748ccd4a63SDavid du Colombier 	ulong	npage;		/* total physical pages of memory */
758ccd4a63SDavid du Colombier 	ulong	upages;		/* user page pool */
768ccd4a63SDavid du Colombier 	ulong	nimage;		/* number of page cache image headers */
778ccd4a63SDavid du Colombier 	ulong	nswap;		/* number of swap pages */
788ccd4a63SDavid du Colombier 	int	nswppo;		/* max # of pageouts per segment pass */
798ccd4a63SDavid du Colombier 	ulong	base0;		/* base of bank 0 */
808ccd4a63SDavid du Colombier 	ulong	base1;		/* base of bank 1 */
818ccd4a63SDavid du Colombier 	ulong	copymode;	/* 0 is copy on write, 1 is copy on reference */
828ccd4a63SDavid du Colombier 	ulong	ialloc;		/* max interrupt time allocation in bytes */
838ccd4a63SDavid du Colombier 	ulong	pipeqsize;	/* size in bytes of pipe queues */
848ccd4a63SDavid du Colombier 	int	nuart;		/* number of uart devices */
858ccd4a63SDavid du Colombier };
868ccd4a63SDavid du Colombier 
878ccd4a63SDavid du Colombier struct Label
888ccd4a63SDavid du Colombier {
898ccd4a63SDavid du Colombier 	jmp_buf	buf;
908ccd4a63SDavid du Colombier };
918ccd4a63SDavid du Colombier 
928ccd4a63SDavid du Colombier struct Ref
938ccd4a63SDavid du Colombier {
948ccd4a63SDavid du Colombier 	Lock lk;
958ccd4a63SDavid du Colombier 	long	ref;
968ccd4a63SDavid du Colombier };
978ccd4a63SDavid du Colombier 
988ccd4a63SDavid du Colombier struct Rendez
998ccd4a63SDavid du Colombier {
1008ccd4a63SDavid du Colombier 	Lock lk;
1018ccd4a63SDavid du Colombier 	Proc	*p;
1028ccd4a63SDavid du Colombier };
1038ccd4a63SDavid du Colombier 
1048ccd4a63SDavid du Colombier struct RWlock	/* changed from kernel */
1058ccd4a63SDavid du Colombier {
1068ccd4a63SDavid du Colombier 	int	readers;
1078ccd4a63SDavid du Colombier 	Lock	lk;
1088ccd4a63SDavid du Colombier 	QLock	x;
1098ccd4a63SDavid du Colombier 	QLock	k;
1108ccd4a63SDavid du Colombier };
1118ccd4a63SDavid du Colombier 
1128ccd4a63SDavid du Colombier struct Talarm
1138ccd4a63SDavid du Colombier {
1148ccd4a63SDavid du Colombier 	Lock lk;
1158ccd4a63SDavid du Colombier 	Proc	*list;
1168ccd4a63SDavid du Colombier };
1178ccd4a63SDavid du Colombier 
1188ccd4a63SDavid du Colombier struct Alarms
1198ccd4a63SDavid du Colombier {
1208ccd4a63SDavid du Colombier 	QLock lk;
1218ccd4a63SDavid du Colombier 	Proc	*head;
1228ccd4a63SDavid du Colombier };
1238ccd4a63SDavid du Colombier 
1248ccd4a63SDavid du Colombier /*
1258ccd4a63SDavid du Colombier  * Access types in namec & channel flags
1268ccd4a63SDavid du Colombier  */
1278ccd4a63SDavid du Colombier enum
1288ccd4a63SDavid du Colombier {
1298ccd4a63SDavid du Colombier 	Aaccess,			/* as in stat, wstat */
1308ccd4a63SDavid du Colombier 	Abind,			/* for left-hand-side of bind */
1318ccd4a63SDavid du Colombier 	Atodir,				/* as in chdir */
1328ccd4a63SDavid du Colombier 	Aopen,				/* for i/o */
1338ccd4a63SDavid du Colombier 	Amount,				/* to be mounted or mounted upon */
1348ccd4a63SDavid du Colombier 	Acreate,			/* is to be created */
1358ccd4a63SDavid du Colombier 	Aremove,			/* will be removed by caller */
1368ccd4a63SDavid du Colombier 
1378ccd4a63SDavid du Colombier 	COPEN	= 0x0001,		/* for i/o */
1388ccd4a63SDavid du Colombier 	CMSG	= 0x0002,		/* the message channel for a mount */
1398ccd4a63SDavid du Colombier /*	CCREATE	= 0x0004,		permits creation if c->mnt */
1408ccd4a63SDavid du Colombier 	CCEXEC	= 0x0008,		/* close on exec */
1418ccd4a63SDavid du Colombier 	CFREE	= 0x0010,		/* not in use */
1428ccd4a63SDavid du Colombier 	CRCLOSE	= 0x0020,		/* remove on close */
1438ccd4a63SDavid du Colombier 	CCACHE	= 0x0080,		/* client cache */
1448ccd4a63SDavid du Colombier };
1458ccd4a63SDavid du Colombier 
1468ccd4a63SDavid du Colombier /* flag values */
1478ccd4a63SDavid du Colombier enum
1488ccd4a63SDavid du Colombier {
1498ccd4a63SDavid du Colombier 	BINTR	=	(1<<0),
1508ccd4a63SDavid du Colombier 	BFREE	=	(1<<1),
1518ccd4a63SDavid du Colombier 	Bipck	=	(1<<2),		/* ip checksum */
1528ccd4a63SDavid du Colombier 	Budpck	=	(1<<3),		/* udp checksum */
1538ccd4a63SDavid du Colombier 	Btcpck	=	(1<<4),		/* tcp checksum */
1548ccd4a63SDavid du Colombier 	Bpktck	=	(1<<5),		/* packet checksum */
1558ccd4a63SDavid du Colombier };
1568ccd4a63SDavid du Colombier 
1578ccd4a63SDavid du Colombier struct Block
1588ccd4a63SDavid du Colombier {
1598ccd4a63SDavid du Colombier 	Block*	next;
1608ccd4a63SDavid du Colombier 	Block*	list;
1618ccd4a63SDavid du Colombier 	uchar*	rp;			/* first unconsumed byte */
1628ccd4a63SDavid du Colombier 	uchar*	wp;			/* first empty byte */
1638ccd4a63SDavid du Colombier 	uchar*	lim;			/* 1 past the end of the buffer */
1648ccd4a63SDavid du Colombier 	uchar*	base;			/* start of the buffer */
1658ccd4a63SDavid du Colombier 	void	(*free)(Block*);
1668ccd4a63SDavid du Colombier 	ushort	flag;
1678ccd4a63SDavid du Colombier 	ushort	checksum;		/* IP checksum of complete packet (minus media header) */
1688ccd4a63SDavid du Colombier };
1698ccd4a63SDavid du Colombier #define BLEN(s)	((s)->wp - (s)->rp)
1708ccd4a63SDavid du Colombier #define BALLOC(s) ((s)->lim - (s)->base)
1718ccd4a63SDavid du Colombier 
1728ccd4a63SDavid du Colombier struct Chan
1738ccd4a63SDavid du Colombier {
1748ccd4a63SDavid du Colombier 	Ref ref;
1758ccd4a63SDavid du Colombier 	Chan*	next;			/* allocation */
1768ccd4a63SDavid du Colombier 	Chan*	link;
1778ccd4a63SDavid du Colombier 	vlong	offset;			/* in file */
1788ccd4a63SDavid du Colombier 	ushort	type;
1798ccd4a63SDavid du Colombier 	ulong	dev;
1808ccd4a63SDavid du Colombier 	ushort	mode;			/* read/write */
1818ccd4a63SDavid du Colombier 	ushort	flag;
1828ccd4a63SDavid du Colombier 	Qid	qid;
1838ccd4a63SDavid du Colombier 	int	fid;			/* for devmnt */
1848ccd4a63SDavid du Colombier 	ulong	iounit;	/* chunk size for i/o; 0==default */
1858ccd4a63SDavid du Colombier 	Mhead*	umh;			/* mount point that derived Chan; used in unionread */
1868ccd4a63SDavid du Colombier 	Chan*	umc;			/* channel in union; held for union read */
1878ccd4a63SDavid du Colombier 	QLock	umqlock;		/* serialize unionreads */
1888ccd4a63SDavid du Colombier 	int	uri;			/* union read index */
1898ccd4a63SDavid du Colombier 	int	dri;			/* devdirread index */
1908ccd4a63SDavid du Colombier 	ulong	mountid;
1918ccd4a63SDavid du Colombier 	Mntcache *mcp;			/* Mount cache pointer */
1928ccd4a63SDavid du Colombier 	Mnt		*mux;		/* Mnt for clients using me for messages */
1938ccd4a63SDavid du Colombier 	void*	aux;
1948ccd4a63SDavid du Colombier 	Qid	pgrpid;		/* for #p/notepg */
1958ccd4a63SDavid du Colombier 	ulong	mid;		/* for ns in devproc */
1968ccd4a63SDavid du Colombier 	Chan*	mchan;			/* channel to mounted server */
1978ccd4a63SDavid du Colombier 	Qid	mqid;			/* qid of root of mount point */
1988ccd4a63SDavid du Colombier 	Session*session;
1998ccd4a63SDavid du Colombier 	Cname	*name;
2008ccd4a63SDavid du Colombier };
2018ccd4a63SDavid du Colombier 
2028ccd4a63SDavid du Colombier struct Cname
2038ccd4a63SDavid du Colombier {
2048ccd4a63SDavid du Colombier 	Ref ref;
2058ccd4a63SDavid du Colombier 	int	alen;			/* allocated length */
2068ccd4a63SDavid du Colombier 	int	len;			/* strlen(s) */
2078ccd4a63SDavid du Colombier 	char	*s;
2088ccd4a63SDavid du Colombier };
2098ccd4a63SDavid du Colombier 
2108ccd4a63SDavid du Colombier struct Dev
2118ccd4a63SDavid du Colombier {
2128ccd4a63SDavid du Colombier 	int	dc;
2138ccd4a63SDavid du Colombier 	char*	name;
2148ccd4a63SDavid du Colombier 
2158ccd4a63SDavid du Colombier 	void	(*reset)(void);
2168ccd4a63SDavid du Colombier 	void	(*init)(void);
2178ccd4a63SDavid du Colombier 	void	(*shutdown)(void);
2188ccd4a63SDavid du Colombier 	Chan*	(*attach)(char*);
2198ccd4a63SDavid du Colombier 	Walkqid*	(*walk)(Chan*, Chan*, char**, int);
2208ccd4a63SDavid du Colombier 	int	(*stat)(Chan*, uchar*, int);
2218ccd4a63SDavid du Colombier 	Chan*	(*open)(Chan*, int);
2228ccd4a63SDavid du Colombier 	void	(*create)(Chan*, char*, int, ulong);
2238ccd4a63SDavid du Colombier 	void	(*close)(Chan*);
2248ccd4a63SDavid du Colombier 	long	(*read)(Chan*, void*, long, vlong);
2258ccd4a63SDavid du Colombier 	Block*	(*bread)(Chan*, long, ulong);
2268ccd4a63SDavid du Colombier 	long	(*write)(Chan*, void*, long, vlong);
2278ccd4a63SDavid du Colombier 	long	(*bwrite)(Chan*, Block*, ulong);
2288ccd4a63SDavid du Colombier 	void	(*remove)(Chan*);
2298ccd4a63SDavid du Colombier 	int	(*wstat)(Chan*, uchar*, int);
2308ccd4a63SDavid du Colombier 	void	(*power)(int);	/* power mgt: power(1) => on, power (0) => off */
2318ccd4a63SDavid du Colombier 	int	(*config)(int, char*, DevConf*);	// returns nil on error
2328ccd4a63SDavid du Colombier };
2338ccd4a63SDavid du Colombier 
2348ccd4a63SDavid du Colombier struct Dirtab
2358ccd4a63SDavid du Colombier {
2368ccd4a63SDavid du Colombier 	char	name[KNAMELEN];
2378ccd4a63SDavid du Colombier 	Qid	qid;
2388ccd4a63SDavid du Colombier 	vlong length;
239*ec59a3ddSDavid du Colombier 	ulong	perm;
2408ccd4a63SDavid du Colombier };
2418ccd4a63SDavid du Colombier 
2428ccd4a63SDavid du Colombier struct Walkqid
2438ccd4a63SDavid du Colombier {
2448ccd4a63SDavid du Colombier 	Chan	*clone;
2458ccd4a63SDavid du Colombier 	int	nqid;
2468ccd4a63SDavid du Colombier 	Qid	qid[1];
2478ccd4a63SDavid du Colombier };
2488ccd4a63SDavid du Colombier 
2498ccd4a63SDavid du Colombier enum
2508ccd4a63SDavid du Colombier {
2518ccd4a63SDavid du Colombier 	NSMAX	=	1000,
2528ccd4a63SDavid du Colombier 	NSLOG	=	7,
2538ccd4a63SDavid du Colombier 	NSCACHE	=	(1<<NSLOG),
2548ccd4a63SDavid du Colombier };
2558ccd4a63SDavid du Colombier 
2568ccd4a63SDavid du Colombier struct Mntwalk				/* state for /proc/#/ns */
2578ccd4a63SDavid du Colombier {
2588ccd4a63SDavid du Colombier 	int		cddone;
2598ccd4a63SDavid du Colombier 	ulong	id;
2608ccd4a63SDavid du Colombier 	Mhead*	mh;
2618ccd4a63SDavid du Colombier 	Mount*	cm;
2628ccd4a63SDavid du Colombier };
2638ccd4a63SDavid du Colombier 
2648ccd4a63SDavid du Colombier struct Mount
2658ccd4a63SDavid du Colombier {
2668ccd4a63SDavid du Colombier 	ulong	mountid;
2678ccd4a63SDavid du Colombier 	Mount*	next;
2688ccd4a63SDavid du Colombier 	Mhead*	head;
2698ccd4a63SDavid du Colombier 	Mount*	copy;
2708ccd4a63SDavid du Colombier 	Mount*	order;
2718ccd4a63SDavid du Colombier 	Chan*	to;			/* channel replacing channel */
2728ccd4a63SDavid du Colombier 	int	mflag;
2738ccd4a63SDavid du Colombier 	char	*spec;
2748ccd4a63SDavid du Colombier };
2758ccd4a63SDavid du Colombier 
2768ccd4a63SDavid du Colombier struct Mhead
2778ccd4a63SDavid du Colombier {
2788ccd4a63SDavid du Colombier 	Ref ref;
2798ccd4a63SDavid du Colombier 	RWlock	lock;
2808ccd4a63SDavid du Colombier 	Chan*	from;			/* channel mounted upon */
2818ccd4a63SDavid du Colombier 	Mount*	mount;			/* what's mounted upon it */
2828ccd4a63SDavid du Colombier 	Mhead*	hash;			/* Hash chain */
2838ccd4a63SDavid du Colombier };
2848ccd4a63SDavid du Colombier 
2858ccd4a63SDavid du Colombier struct Mnt
2868ccd4a63SDavid du Colombier {
2878ccd4a63SDavid du Colombier 	Lock lk;
2888ccd4a63SDavid du Colombier 	/* references are counted using c->ref; channels on this mount point incref(c->mchan) == Mnt.c */
2898ccd4a63SDavid du Colombier 	Chan	*c;		/* Channel to file service */
2908ccd4a63SDavid du Colombier 	Proc	*rip;		/* Reader in progress */
2918ccd4a63SDavid du Colombier 	Mntrpc	*queue;		/* Queue of pending requests on this channel */
2928ccd4a63SDavid du Colombier 	ulong	id;		/* Multiplexer id for channel check */
2938ccd4a63SDavid du Colombier 	Mnt	*list;		/* Free list */
2948ccd4a63SDavid du Colombier 	int	flags;		/* cache */
2958ccd4a63SDavid du Colombier 	int	msize;		/* data + IOHDRSZ */
2968ccd4a63SDavid du Colombier 	char	*version;			/* 9P version */
2978ccd4a63SDavid du Colombier 	Queue	*q;		/* input queue */
2988ccd4a63SDavid du Colombier };
2998ccd4a63SDavid du Colombier 
3008ccd4a63SDavid du Colombier enum
3018ccd4a63SDavid du Colombier {
3028ccd4a63SDavid du Colombier 	NUser,				/* note provided externally */
3038ccd4a63SDavid du Colombier 	NExit,				/* deliver note quietly */
3048ccd4a63SDavid du Colombier 	NDebug,				/* print debug message */
3058ccd4a63SDavid du Colombier };
3068ccd4a63SDavid du Colombier 
3078ccd4a63SDavid du Colombier struct Note
3088ccd4a63SDavid du Colombier {
3098ccd4a63SDavid du Colombier 	char	msg[ERRMAX];
3108ccd4a63SDavid du Colombier 	int	flag;			/* whether system posted it */
3118ccd4a63SDavid du Colombier };
3128ccd4a63SDavid du Colombier 
3138ccd4a63SDavid du Colombier enum
3148ccd4a63SDavid du Colombier {
3158ccd4a63SDavid du Colombier 	RENDLOG	=	5,
3168ccd4a63SDavid du Colombier 	RENDHASH =	1<<RENDLOG,		/* Hash to lookup rendezvous tags */
3178ccd4a63SDavid du Colombier 	MNTLOG	=	5,
3188ccd4a63SDavid du Colombier 	MNTHASH =	1<<MNTLOG,		/* Hash to walk mount table */
3198ccd4a63SDavid du Colombier 	NFD =		100,		/* per process file descriptors */
3208ccd4a63SDavid du Colombier 	PGHLOG  =	9,
3218ccd4a63SDavid du Colombier 	PGHSIZE	=	1<<PGHLOG,	/* Page hash for image lookup */
3228ccd4a63SDavid du Colombier };
3238ccd4a63SDavid du Colombier #define REND(p,s)	((p)->rendhash[(s)&((1<<RENDLOG)-1)])
3248ccd4a63SDavid du Colombier #define MOUNTH(p,qid)	((p)->mnthash[(qid).path&((1<<MNTLOG)-1)])
3258ccd4a63SDavid du Colombier 
3268ccd4a63SDavid du Colombier struct Pgrp
3278ccd4a63SDavid du Colombier {
3288ccd4a63SDavid du Colombier 	Ref ref;				/* also used as a lock when mounting */
3298ccd4a63SDavid du Colombier 	int	noattach;
3308ccd4a63SDavid du Colombier 	ulong	pgrpid;
3318ccd4a63SDavid du Colombier 	QLock	debug;			/* single access via devproc.c */
3328ccd4a63SDavid du Colombier 	RWlock	ns;			/* Namespace n read/one write lock */
3338ccd4a63SDavid du Colombier 	Mhead	*mnthash[MNTHASH];
3348ccd4a63SDavid du Colombier };
3358ccd4a63SDavid du Colombier 
3368ccd4a63SDavid du Colombier struct Rgrp
3378ccd4a63SDavid du Colombier {
3388ccd4a63SDavid du Colombier 	Ref ref;
3398ccd4a63SDavid du Colombier 	Proc	*rendhash[RENDHASH];	/* Rendezvous tag hash */
3408ccd4a63SDavid du Colombier };
3418ccd4a63SDavid du Colombier 
3428ccd4a63SDavid du Colombier struct Egrp
3438ccd4a63SDavid du Colombier {
3448ccd4a63SDavid du Colombier 	Ref ref;
3458ccd4a63SDavid du Colombier 	RWlock lk;
3468ccd4a63SDavid du Colombier 	Evalue	**ent;
3478ccd4a63SDavid du Colombier 	int nent;
3488ccd4a63SDavid du Colombier 	int ment;
3498ccd4a63SDavid du Colombier 	ulong	path;	/* qid.path of next Evalue to be allocated */
3508ccd4a63SDavid du Colombier 	ulong	vers;	/* of Egrp */
3518ccd4a63SDavid du Colombier };
3528ccd4a63SDavid du Colombier 
3538ccd4a63SDavid du Colombier struct Evalue
3548ccd4a63SDavid du Colombier {
3558ccd4a63SDavid du Colombier 	char	*name;
3568ccd4a63SDavid du Colombier 	char	*value;
3578ccd4a63SDavid du Colombier 	int	len;
3588ccd4a63SDavid du Colombier 	Evalue	*link;
3598ccd4a63SDavid du Colombier 	Qid	qid;
3608ccd4a63SDavid du Colombier };
3618ccd4a63SDavid du Colombier 
3628ccd4a63SDavid du Colombier struct Fgrp
3638ccd4a63SDavid du Colombier {
3648ccd4a63SDavid du Colombier 	Ref ref;
3658ccd4a63SDavid du Colombier 	Chan	**fd;
3668ccd4a63SDavid du Colombier 	int	nfd;			/* number allocated */
3678ccd4a63SDavid du Colombier 	int	maxfd;			/* highest fd in use */
3688ccd4a63SDavid du Colombier 	int	exceed;			/* debugging */
3698ccd4a63SDavid du Colombier };
3708ccd4a63SDavid du Colombier 
3718ccd4a63SDavid du Colombier enum
3728ccd4a63SDavid du Colombier {
3738ccd4a63SDavid du Colombier 	DELTAFD	= 20,		/* incremental increase in Fgrp.fd's */
3748ccd4a63SDavid du Colombier 	NERR = 20
3758ccd4a63SDavid du Colombier };
3768ccd4a63SDavid du Colombier 
3778ccd4a63SDavid du Colombier typedef uvlong	Ticks;
3788ccd4a63SDavid du Colombier 
3798ccd4a63SDavid du Colombier enum
3808ccd4a63SDavid du Colombier {
3818ccd4a63SDavid du Colombier 	Running,
3828ccd4a63SDavid du Colombier 	Rendezvous,
3838ccd4a63SDavid du Colombier 	Wakeme,
3848ccd4a63SDavid du Colombier };
3858ccd4a63SDavid du Colombier 
3868ccd4a63SDavid du Colombier struct Proc
3878ccd4a63SDavid du Colombier {
3888ccd4a63SDavid du Colombier 	uint		state;
3898ccd4a63SDavid du Colombier 	uint		mach;
3908ccd4a63SDavid du Colombier 
3918ccd4a63SDavid du Colombier 	ulong	pid;
3928ccd4a63SDavid du Colombier 	ulong	parentpid;
3938ccd4a63SDavid du Colombier 
3948ccd4a63SDavid du Colombier 	Pgrp	*pgrp;		/* Process group for namespace */
3958ccd4a63SDavid du Colombier 	Fgrp	*fgrp;		/* File descriptor group */
3968ccd4a63SDavid du Colombier 	Rgrp *rgrp;
3978ccd4a63SDavid du Colombier 
3988ccd4a63SDavid du Colombier 	Lock	rlock;		/* sync sleep/wakeup with postnote */
3998ccd4a63SDavid du Colombier 	Rendez	*r;		/* rendezvous point slept on */
4008ccd4a63SDavid du Colombier 	Rendez	sleep;		/* place for syssleep/debug */
4018ccd4a63SDavid du Colombier 	int	notepending;	/* note issued but not acted on */
4028ccd4a63SDavid du Colombier 	int	kp;		/* true if a kernel process */
4038ccd4a63SDavid du Colombier 
404*ec59a3ddSDavid du Colombier 	void*	rendtag;	/* Tag for rendezvous */
405*ec59a3ddSDavid du Colombier 	void*	rendval;	/* Value for rendezvous */
4068ccd4a63SDavid du Colombier 	Proc	*rendhash;	/* Hash list for tag values */
4078ccd4a63SDavid du Colombier 
4088ccd4a63SDavid du Colombier 	int	nerrlab;
4098ccd4a63SDavid du Colombier 	Label	errlab[NERR];
4108ccd4a63SDavid du Colombier 	char user[KNAMELEN];
4118ccd4a63SDavid du Colombier 	char	*syserrstr;	/* last error from a system call, errbuf0 or 1 */
4128ccd4a63SDavid du Colombier 	char	*errstr;	/* reason we're unwinding the error stack, errbuf1 or 0 */
4138ccd4a63SDavid du Colombier 	char	errbuf0[ERRMAX];
4148ccd4a63SDavid du Colombier 	char	errbuf1[ERRMAX];
4158ccd4a63SDavid du Colombier 	char	genbuf[128];	/* buffer used e.g. for last name element from namec */
4168ccd4a63SDavid du Colombier 	char text[KNAMELEN];
4178ccd4a63SDavid du Colombier 
4188ccd4a63SDavid du Colombier 	Chan	*slash;
4198ccd4a63SDavid du Colombier 	Chan	*dot;
4208ccd4a63SDavid du Colombier 
4218ccd4a63SDavid du Colombier 	Proc		*qnext;
4228ccd4a63SDavid du Colombier 
4238ccd4a63SDavid du Colombier 	void	(*fn)(void*);
4248ccd4a63SDavid du Colombier 	void *arg;
4258ccd4a63SDavid du Colombier 
4268ccd4a63SDavid du Colombier 	char oproc[1024];	/* reserved for os */
4278ccd4a63SDavid du Colombier 
4288ccd4a63SDavid du Colombier };
4298ccd4a63SDavid du Colombier 
4308ccd4a63SDavid du Colombier enum
4318ccd4a63SDavid du Colombier {
4328ccd4a63SDavid du Colombier 	PRINTSIZE =	256,
4338ccd4a63SDavid du Colombier 	MAXCRYPT = 	127,
4348ccd4a63SDavid du Colombier 	NUMSIZE	=	12,		/* size of formatted number */
4358ccd4a63SDavid du Colombier 	MB =		(1024*1024),
4368ccd4a63SDavid du Colombier 	READSTR =	1000,		/* temporary buffer size for device reads */
4378ccd4a63SDavid du Colombier };
4388ccd4a63SDavid du Colombier 
4398ccd4a63SDavid du Colombier extern	char*	conffile;
4408ccd4a63SDavid du Colombier extern	int	cpuserver;
4418ccd4a63SDavid du Colombier extern	Dev*	devtab[];
4428ccd4a63SDavid du Colombier extern  char	*eve;
4438ccd4a63SDavid du Colombier extern	char	hostdomain[];
4448ccd4a63SDavid du Colombier extern	uchar	initcode[];
4458ccd4a63SDavid du Colombier extern  Queue*	kbdq;
4468ccd4a63SDavid du Colombier extern  Queue*	kprintoq;
4478ccd4a63SDavid du Colombier extern  Ref	noteidalloc;
4488ccd4a63SDavid du Colombier extern	Palloc	palloc;
4498ccd4a63SDavid du Colombier extern  Queue	*serialoq;
4508ccd4a63SDavid du Colombier extern	char*	statename[];
4518ccd4a63SDavid du Colombier extern	int	nsyscall;
4528ccd4a63SDavid du Colombier extern	char	*sysname;
4538ccd4a63SDavid du Colombier extern	uint	qiomaxatomic;
4548ccd4a63SDavid du Colombier extern	Conf	conf;
4558ccd4a63SDavid du Colombier enum
4568ccd4a63SDavid du Colombier {
4578ccd4a63SDavid du Colombier 	LRESPROF	= 3,
4588ccd4a63SDavid du Colombier };
4598ccd4a63SDavid du Colombier 
4608ccd4a63SDavid du Colombier /*
4618ccd4a63SDavid du Colombier  *  action log
4628ccd4a63SDavid du Colombier  */
4638ccd4a63SDavid du Colombier struct Log {
4648ccd4a63SDavid du Colombier 	Lock lk;
4658ccd4a63SDavid du Colombier 	int	opens;
4668ccd4a63SDavid du Colombier 	char*	buf;
4678ccd4a63SDavid du Colombier 	char	*end;
4688ccd4a63SDavid du Colombier 	char	*rptr;
4698ccd4a63SDavid du Colombier 	int	len;
4708ccd4a63SDavid du Colombier 	int	nlog;
4718ccd4a63SDavid du Colombier 	int	minread;
4728ccd4a63SDavid du Colombier 
4738ccd4a63SDavid du Colombier 	int	logmask;	/* mask of things to debug */
4748ccd4a63SDavid du Colombier 
4758ccd4a63SDavid du Colombier 	QLock	readq;
4768ccd4a63SDavid du Colombier 	Rendez	readr;
4778ccd4a63SDavid du Colombier };
4788ccd4a63SDavid du Colombier 
4798ccd4a63SDavid du Colombier struct Logflag {
4808ccd4a63SDavid du Colombier 	char*	name;
4818ccd4a63SDavid du Colombier 	int	mask;
4828ccd4a63SDavid du Colombier };
4838ccd4a63SDavid du Colombier 
4848ccd4a63SDavid du Colombier enum
4858ccd4a63SDavid du Colombier {
4868ccd4a63SDavid du Colombier 	NCMDFIELD = 128
4878ccd4a63SDavid du Colombier };
4888ccd4a63SDavid du Colombier 
4898ccd4a63SDavid du Colombier struct Cmdbuf
4908ccd4a63SDavid du Colombier {
4918ccd4a63SDavid du Colombier 	char	*buf;
4928ccd4a63SDavid du Colombier 	char	**f;
4938ccd4a63SDavid du Colombier 	int	nf;
4948ccd4a63SDavid du Colombier };
4958ccd4a63SDavid du Colombier 
4968ccd4a63SDavid du Colombier struct Cmdtab
4978ccd4a63SDavid du Colombier {
4988ccd4a63SDavid du Colombier 	int	index;	/* used by client to switch on result */
4998ccd4a63SDavid du Colombier 	char	*cmd;	/* command name */
5008ccd4a63SDavid du Colombier 	int	narg;	/* expected #args; 0 ==> variadic */
5018ccd4a63SDavid du Colombier };
5028ccd4a63SDavid du Colombier 
5038ccd4a63SDavid du Colombier /* queue state bits,  Qmsg, Qcoalesce, and Qkick can be set in qopen */
5048ccd4a63SDavid du Colombier enum
5058ccd4a63SDavid du Colombier {
5068ccd4a63SDavid du Colombier 	/* Queue.state */
5078ccd4a63SDavid du Colombier 	Qstarve		= (1<<0),	/* consumer starved */
5088ccd4a63SDavid du Colombier 	Qmsg		= (1<<1),	/* message stream */
5098ccd4a63SDavid du Colombier 	Qclosed		= (1<<2),	/* queue has been closed/hungup */
5108ccd4a63SDavid du Colombier 	Qflow		= (1<<3),	/* producer flow controlled */
5118ccd4a63SDavid du Colombier 	Qcoalesce	= (1<<4),	/* coallesce packets on read */
5128ccd4a63SDavid du Colombier 	Qkick		= (1<<5),	/* always call the kick routine after qwrite */
5138ccd4a63SDavid du Colombier };
5148ccd4a63SDavid du Colombier 
5158ccd4a63SDavid du Colombier #define DEVDOTDOT -1
5168ccd4a63SDavid du Colombier 
5178ccd4a63SDavid du Colombier extern Proc *_getproc(void);
5188ccd4a63SDavid du Colombier extern void _setproc(Proc*);
5198ccd4a63SDavid du Colombier #define	up	(_getproc())
520