xref: /inferno-os/include/kern.h (revision 1f303b3397c4a329dd5193981151f1359b453232)
137da2899SCharles.Forsyth typedef unsigned long size_t;
237da2899SCharles.Forsyth 
337da2899SCharles.Forsyth #define	nelem(x)	(sizeof(x)/sizeof((x)[0]))
437da2899SCharles.Forsyth #define	offsetof(s, m)	(ulong)(&(((s*)0)->m))
537da2899SCharles.Forsyth #define	assert(x)	if(x){}else _assert("x")
637da2899SCharles.Forsyth 
737da2899SCharles.Forsyth /*
837da2899SCharles.Forsyth  * mem routines
937da2899SCharles.Forsyth  */
1037da2899SCharles.Forsyth extern	void*	memccpy(void*, void*, int, ulong);
1137da2899SCharles.Forsyth extern	void*	memset(void*, int, ulong);
1237da2899SCharles.Forsyth extern	int	memcmp(void*, void*, ulong);
1337da2899SCharles.Forsyth extern	void*	memcpy(void*, void*, ulong);
1437da2899SCharles.Forsyth extern	void*	memmove(void*, void*, ulong);
1537da2899SCharles.Forsyth extern	void*	memchr(void*, int, ulong);
1637da2899SCharles.Forsyth 
1737da2899SCharles.Forsyth /*
1837da2899SCharles.Forsyth  * string routines
1937da2899SCharles.Forsyth  */
2037da2899SCharles.Forsyth extern	char*	strcat(char*, char*);
2137da2899SCharles.Forsyth extern	char*	strchr(char*, int);
2237da2899SCharles.Forsyth extern	int	strcmp(char*, char*);
2337da2899SCharles.Forsyth extern	char*	strcpy(char*, char*);
2437da2899SCharles.Forsyth extern	char*	strecpy(char*, char*, char*);
2537da2899SCharles.Forsyth extern	char*	strdup(char*);
2637da2899SCharles.Forsyth extern	char*	strncat(char*, char*, long);
2737da2899SCharles.Forsyth extern	char*	strncpy(char*, char*, long);
2837da2899SCharles.Forsyth extern	int	strncmp(char*, char*, long);
2937da2899SCharles.Forsyth extern	char*	strpbrk(char*, char*);
3037da2899SCharles.Forsyth extern	char*	strrchr(char*, int);
3137da2899SCharles.Forsyth extern	char*	strtok(char*, char*);
3237da2899SCharles.Forsyth extern	long	strlen(char*);
3337da2899SCharles.Forsyth extern	long	strspn(char*, char*);
3437da2899SCharles.Forsyth extern	long	strcspn(char*, char*);
3537da2899SCharles.Forsyth extern	char*	strstr(char*, char*);
3637da2899SCharles.Forsyth extern	int	cistrncmp(char*, char*, int);
3737da2899SCharles.Forsyth extern	int	cistrcmp(char*, char*);
3837da2899SCharles.Forsyth extern	char*	cistrstr(char*, char*);
3937da2899SCharles.Forsyth extern	int	tokenize(char*, char**, int);
4037da2899SCharles.Forsyth 
4137da2899SCharles.Forsyth enum
4237da2899SCharles.Forsyth {
43*1f303b33SCharles Forsyth 	UTFmax		= 4,		/* maximum bytes per rune */
4437da2899SCharles.Forsyth 	Runesync	= 0x80,		/* cannot represent part of a UTF sequence (<) */
4537da2899SCharles.Forsyth 	Runeself	= 0x80,		/* rune and UTF sequences are the same (<) */
46*1f303b33SCharles Forsyth 	Runeerror	= 0xFFFD,	/* decoding error in UTF */
47*1f303b33SCharles Forsyth 	Runemax		= 0x10FFFF,	/* 21-bit rune */
48*1f303b33SCharles Forsyth 	Runemask	= 0x1FFFFF,	/* bits used by runes (see grep) */
4937da2899SCharles.Forsyth };
5037da2899SCharles.Forsyth 
5137da2899SCharles.Forsyth /*
5237da2899SCharles.Forsyth  * rune routines
5337da2899SCharles.Forsyth  */
5437da2899SCharles.Forsyth extern	int	runetochar(char*, Rune*);
5537da2899SCharles.Forsyth extern	int	chartorune(Rune*, char*);
5637da2899SCharles.Forsyth extern	int	runelen(long);
5737da2899SCharles.Forsyth extern	int	runenlen(Rune*, int);
5837da2899SCharles.Forsyth extern	int	fullrune(char*, int);
5937da2899SCharles.Forsyth extern	int	utflen(char*);
6037da2899SCharles.Forsyth extern	int	utfnlen(char*, long);
6137da2899SCharles.Forsyth extern	char*	utfrune(char*, long);
6237da2899SCharles.Forsyth extern	char*	utfrrune(char*, long);
6337da2899SCharles.Forsyth extern	char*	utfutf(char*, char*);
6437da2899SCharles.Forsyth extern	char*	utfecpy(char*, char*, char*);
6537da2899SCharles.Forsyth 
6637da2899SCharles.Forsyth extern	Rune*	runestrcat(Rune*, Rune*);
6737da2899SCharles.Forsyth extern	Rune*	runestrchr(Rune*, Rune);
6837da2899SCharles.Forsyth extern	int	runestrcmp(Rune*, Rune*);
6937da2899SCharles.Forsyth extern	Rune*	runestrcpy(Rune*, Rune*);
7037da2899SCharles.Forsyth extern	Rune*	runestrncpy(Rune*, Rune*, long);
7137da2899SCharles.Forsyth extern	Rune*	runestrecpy(Rune*, Rune*, Rune*);
7237da2899SCharles.Forsyth extern	Rune*	runestrdup(Rune*);
7337da2899SCharles.Forsyth extern	Rune*	runestrncat(Rune*, Rune*, long);
7437da2899SCharles.Forsyth extern	int	runestrncmp(Rune*, Rune*, long);
7537da2899SCharles.Forsyth extern	Rune*	runestrrchr(Rune*, Rune);
7637da2899SCharles.Forsyth extern	long	runestrlen(Rune*);
7737da2899SCharles.Forsyth extern	Rune*	runestrstr(Rune*, Rune*);
7837da2899SCharles.Forsyth 
7937da2899SCharles.Forsyth extern	Rune	tolowerrune(Rune);
8037da2899SCharles.Forsyth extern	Rune	totitlerune(Rune);
8137da2899SCharles.Forsyth extern	Rune	toupperrune(Rune);
8237da2899SCharles.Forsyth extern	int	isalpharune(Rune);
8337da2899SCharles.Forsyth extern	int	islowerrune(Rune);
8437da2899SCharles.Forsyth extern	int	isspacerune(Rune);
8537da2899SCharles.Forsyth extern	int	istitlerune(Rune);
8637da2899SCharles.Forsyth extern	int	isupperrune(Rune);
8737da2899SCharles.Forsyth 
8837da2899SCharles.Forsyth /*
8937da2899SCharles.Forsyth  * malloc
9037da2899SCharles.Forsyth  */
9137da2899SCharles.Forsyth extern	void*	malloc(ulong);
9237da2899SCharles.Forsyth extern	void*	mallocz(ulong, int);
9337da2899SCharles.Forsyth extern	void	free(void*);
9437da2899SCharles.Forsyth extern	ulong	msize(void*);
9537da2899SCharles.Forsyth extern	void*	calloc(ulong, ulong);
9637da2899SCharles.Forsyth extern	void*	realloc(void*, ulong);
9737da2899SCharles.Forsyth extern	void		setmalloctag(void*, ulong);
9837da2899SCharles.Forsyth extern	void		setrealloctag(void*, ulong);
9937da2899SCharles.Forsyth extern	ulong	getmalloctag(void*);
10037da2899SCharles.Forsyth extern	ulong	getrealloctag(void*);
10137da2899SCharles.Forsyth extern	void*	malloctopoolblock(void*);
10237da2899SCharles.Forsyth 
10337da2899SCharles.Forsyth /*
10437da2899SCharles.Forsyth  * print routines
10537da2899SCharles.Forsyth  */
10637da2899SCharles.Forsyth typedef struct Fmt	Fmt;
10737da2899SCharles.Forsyth struct Fmt{
10837da2899SCharles.Forsyth 	uchar	runes;			/* output buffer is runes or chars? */
10937da2899SCharles.Forsyth 	void	*start;			/* of buffer */
11037da2899SCharles.Forsyth 	void	*to;			/* current place in the buffer */
11137da2899SCharles.Forsyth 	void	*stop;			/* end of the buffer; overwritten if flush fails */
11237da2899SCharles.Forsyth 	int	(*flush)(Fmt *);	/* called when to == stop */
11337da2899SCharles.Forsyth 	void	*farg;			/* to make flush a closure */
11437da2899SCharles.Forsyth 	int	nfmt;			/* num chars formatted so far */
11537da2899SCharles.Forsyth 	va_list	args;			/* args passed to dofmt */
11637da2899SCharles.Forsyth 	int	r;			/* % format Rune */
11737da2899SCharles.Forsyth 	int	width;
11837da2899SCharles.Forsyth 	int	prec;
11937da2899SCharles.Forsyth 	ulong	flags;
12037da2899SCharles.Forsyth };
12137da2899SCharles.Forsyth 
12237da2899SCharles.Forsyth enum{
12337da2899SCharles.Forsyth 	FmtWidth	= 1,
12437da2899SCharles.Forsyth 	FmtLeft		= FmtWidth << 1,
12537da2899SCharles.Forsyth 	FmtPrec		= FmtLeft << 1,
12637da2899SCharles.Forsyth 	FmtSharp	= FmtPrec << 1,
12737da2899SCharles.Forsyth 	FmtSpace	= FmtSharp << 1,
12837da2899SCharles.Forsyth 	FmtSign		= FmtSpace << 1,
12937da2899SCharles.Forsyth 	FmtZero		= FmtSign << 1,
13037da2899SCharles.Forsyth 	FmtUnsigned	= FmtZero << 1,
13137da2899SCharles.Forsyth 	FmtShort	= FmtUnsigned << 1,
13237da2899SCharles.Forsyth 	FmtLong		= FmtShort << 1,
13337da2899SCharles.Forsyth 	FmtVLong	= FmtLong << 1,
13437da2899SCharles.Forsyth 	FmtComma	= FmtVLong << 1,
13537da2899SCharles.Forsyth 	FmtByte	= FmtComma << 1,
13637da2899SCharles.Forsyth 
13737da2899SCharles.Forsyth 	FmtFlag		= FmtByte << 1
13837da2899SCharles.Forsyth };
13937da2899SCharles.Forsyth 
14037da2899SCharles.Forsyth extern	int	print(char*, ...);
14137da2899SCharles.Forsyth extern	char*	seprint(char*, char*, char*, ...);
14237da2899SCharles.Forsyth extern	char*	vseprint(char*, char*, char*, va_list);
14337da2899SCharles.Forsyth extern	int	snprint(char*, int, char*, ...);
14437da2899SCharles.Forsyth extern	int	vsnprint(char*, int, char*, va_list);
14537da2899SCharles.Forsyth extern	char*	smprint(char*, ...);
14637da2899SCharles.Forsyth extern	char*	vsmprint(char*, va_list);
14737da2899SCharles.Forsyth extern	int	sprint(char*, char*, ...);
14837da2899SCharles.Forsyth extern	int	fprint(int, char*, ...);
14937da2899SCharles.Forsyth extern	int	vfprint(int, char*, va_list);
15037da2899SCharles.Forsyth 
15137da2899SCharles.Forsyth extern	int	runesprint(Rune*, char*, ...);
15237da2899SCharles.Forsyth extern	int	runesnprint(Rune*, int, char*, ...);
15337da2899SCharles.Forsyth extern	int	runevsnprint(Rune*, int, char*, va_list);
15437da2899SCharles.Forsyth extern	Rune*	runeseprint(Rune*, Rune*, char*, ...);
15537da2899SCharles.Forsyth extern	Rune*	runevseprint(Rune*, Rune*, char*, va_list);
15637da2899SCharles.Forsyth extern	Rune*	runesmprint(char*, ...);
15737da2899SCharles.Forsyth extern	Rune*	runevsmprint(char*, va_list);
15837da2899SCharles.Forsyth 
15937da2899SCharles.Forsyth extern	int	fmtfdinit(Fmt*, int, char*, int);
16037da2899SCharles.Forsyth extern	int	fmtfdflush(Fmt*);
16137da2899SCharles.Forsyth extern	int	fmtstrinit(Fmt*);
16237da2899SCharles.Forsyth extern	char*	fmtstrflush(Fmt*);
16337da2899SCharles.Forsyth extern	int	runefmtstrinit(Fmt*);
16437da2899SCharles.Forsyth extern	Rune*	runefmtstrflush(Fmt*);
16537da2899SCharles.Forsyth 
16637da2899SCharles.Forsyth #pragma	varargck	argpos	fmtprint	2
16737da2899SCharles.Forsyth #pragma	varargck	argpos	fprint	2
16837da2899SCharles.Forsyth #pragma	varargck	argpos	print	1
16937da2899SCharles.Forsyth #pragma	varargck	argpos	runeseprint	3
17037da2899SCharles.Forsyth #pragma	varargck	argpos	runesmprint	1
17137da2899SCharles.Forsyth #pragma	varargck	argpos	runesnprint	3
17237da2899SCharles.Forsyth #pragma	varargck	argpos	runesprint	2
17337da2899SCharles.Forsyth #pragma	varargck	argpos	seprint	3
17437da2899SCharles.Forsyth #pragma	varargck	argpos	smprint	1
17537da2899SCharles.Forsyth #pragma	varargck	argpos	snprint	3
17637da2899SCharles.Forsyth #pragma	varargck	argpos	sprint	2
17737da2899SCharles.Forsyth #pragma	varargck	argpos	vseprint	3
17837da2899SCharles.Forsyth #pragma	varargck	argpos	vsnprint	3
17937da2899SCharles.Forsyth 
18037da2899SCharles.Forsyth #pragma	varargck	type	"lld"	vlong
18137da2899SCharles.Forsyth #pragma	varargck	type	"llx"	vlong
18237da2899SCharles.Forsyth #pragma	varargck	type	"lld"	uvlong
18337da2899SCharles.Forsyth #pragma	varargck	type	"llx"	uvlong
18437da2899SCharles.Forsyth #pragma	varargck	type	"ld"	long
18537da2899SCharles.Forsyth #pragma	varargck	type	"lx"	long
18637da2899SCharles.Forsyth #pragma	varargck	type	"ld"	ulong
18737da2899SCharles.Forsyth #pragma	varargck	type	"lx"	ulong
18837da2899SCharles.Forsyth #pragma	varargck	type	"d"	int
18937da2899SCharles.Forsyth #pragma	varargck	type	"x"	int
19037da2899SCharles.Forsyth #pragma	varargck	type	"c"	int
19137da2899SCharles.Forsyth #pragma	varargck	type	"C"	int
19237da2899SCharles.Forsyth #pragma	varargck	type	"d"	uint
19337da2899SCharles.Forsyth #pragma	varargck	type	"x"	uint
19437da2899SCharles.Forsyth #pragma	varargck	type	"c"	uint
19537da2899SCharles.Forsyth #pragma	varargck	type	"C"	uint
19637da2899SCharles.Forsyth #pragma	varargck	type	"f"	double
19737da2899SCharles.Forsyth #pragma	varargck	type	"e"	double
19837da2899SCharles.Forsyth #pragma	varargck	type	"g"	double
19937da2899SCharles.Forsyth #pragma	varargck	type	"s"	char*
20037da2899SCharles.Forsyth #pragma	varargck	type	"q"	char*
20137da2899SCharles.Forsyth #pragma	varargck	type	"S"	Rune*
20237da2899SCharles.Forsyth #pragma	varargck	type	"Q"	Rune*
20337da2899SCharles.Forsyth #pragma	varargck	type	"r"	void
20437da2899SCharles.Forsyth #pragma	varargck	type	"%"	void
20537da2899SCharles.Forsyth #pragma	varargck	type	"n"	int*
20637da2899SCharles.Forsyth #pragma	varargck	type	"p"	void*
2076b2e3235Sforsyth #pragma	varargck	type	"p"	uintptr
20837da2899SCharles.Forsyth #pragma	varargck	flag	','
20937da2899SCharles.Forsyth #pragma varargck	type	"<" void*
21037da2899SCharles.Forsyth #pragma varargck	type	"[" void*
21137da2899SCharles.Forsyth #pragma varargck	type	"H" void*
21237da2899SCharles.Forsyth 
21337da2899SCharles.Forsyth extern	int	fmtinstall(int, int (*)(Fmt*));
21437da2899SCharles.Forsyth extern	int	dofmt(Fmt*, char*);
21537da2899SCharles.Forsyth extern	int	dorfmt(Fmt*, Rune*);
21637da2899SCharles.Forsyth extern	int	fmtprint(Fmt*, char*, ...);
21737da2899SCharles.Forsyth extern	int	fmtvprint(Fmt*, char*, va_list);
21837da2899SCharles.Forsyth extern	int	fmtrune(Fmt*, int);
21937da2899SCharles.Forsyth extern	int	fmtstrcpy(Fmt*, char*);
22037da2899SCharles.Forsyth extern	int	fmtrunestrcpy(Fmt*, Rune*);
22137da2899SCharles.Forsyth /*
22237da2899SCharles.Forsyth  * error string for %r
22337da2899SCharles.Forsyth  * supplied on per os basis, not part of fmt library
22437da2899SCharles.Forsyth  */
22537da2899SCharles.Forsyth extern	int	errfmt(Fmt *f);
22637da2899SCharles.Forsyth 
22737da2899SCharles.Forsyth /*
22837da2899SCharles.Forsyth  * quoted strings
22937da2899SCharles.Forsyth  */
23037da2899SCharles.Forsyth extern	char	*unquotestrdup(char*);
23137da2899SCharles.Forsyth extern	Rune	*unquoterunestrdup(Rune*);
23237da2899SCharles.Forsyth extern	char	*quotestrdup(char*);
23337da2899SCharles.Forsyth extern	Rune	*quoterunestrdup(Rune*);
23437da2899SCharles.Forsyth extern	int	quotestrfmt(Fmt*);
23537da2899SCharles.Forsyth extern	int	quoterunestrfmt(Fmt*);
23637da2899SCharles.Forsyth extern	void	quotefmtinstall(void);
23737da2899SCharles.Forsyth extern	int	(*doquote)(int);
23837da2899SCharles.Forsyth 
23937da2899SCharles.Forsyth /*
24037da2899SCharles.Forsyth  * random number
24137da2899SCharles.Forsyth  */
24237da2899SCharles.Forsyth extern	void	srand(long);
24337da2899SCharles.Forsyth extern	int	rand(void);
24437da2899SCharles.Forsyth extern	int	nrand(int);
24537da2899SCharles.Forsyth extern	long	lrand(void);
24637da2899SCharles.Forsyth extern	long	lnrand(long);
24737da2899SCharles.Forsyth extern	double	frand(void);
24837da2899SCharles.Forsyth extern	ulong	truerand(void);
24937da2899SCharles.Forsyth extern	ulong	ntruerand(ulong);
25037da2899SCharles.Forsyth 
25137da2899SCharles.Forsyth /*
25237da2899SCharles.Forsyth  * math
25337da2899SCharles.Forsyth  */
25437da2899SCharles.Forsyth extern	ulong	getfcr(void);
25537da2899SCharles.Forsyth extern	void	setfsr(ulong);
25637da2899SCharles.Forsyth extern	ulong	getfsr(void);
25737da2899SCharles.Forsyth extern	void	setfcr(ulong);
25837da2899SCharles.Forsyth extern	double	NaN(void);
25937da2899SCharles.Forsyth extern	double	Inf(int);
26037da2899SCharles.Forsyth extern	int	isNaN(double);
26137da2899SCharles.Forsyth extern	int	isInf(double, int);
26237da2899SCharles.Forsyth 
26337da2899SCharles.Forsyth extern	double	pow(double, double);
26437da2899SCharles.Forsyth extern	double	atan2(double, double);
26537da2899SCharles.Forsyth extern	double	fabs(double);
26637da2899SCharles.Forsyth extern	double	atan(double);
26737da2899SCharles.Forsyth extern	double	log(double);
26837da2899SCharles.Forsyth extern	double	log10(double);
26937da2899SCharles.Forsyth extern	double	exp(double);
27037da2899SCharles.Forsyth extern	double	floor(double);
27137da2899SCharles.Forsyth extern	double	ceil(double);
27237da2899SCharles.Forsyth extern	double	hypot(double, double);
27337da2899SCharles.Forsyth extern	double	sin(double);
27437da2899SCharles.Forsyth extern	double	cos(double);
27537da2899SCharles.Forsyth extern	double	tan(double);
27637da2899SCharles.Forsyth extern	double	asin(double);
27737da2899SCharles.Forsyth extern	double	acos(double);
27837da2899SCharles.Forsyth extern	double	sinh(double);
27937da2899SCharles.Forsyth extern	double	cosh(double);
28037da2899SCharles.Forsyth extern	double	tanh(double);
28137da2899SCharles.Forsyth extern	double	sqrt(double);
28237da2899SCharles.Forsyth extern	double	fmod(double, double);
28337da2899SCharles.Forsyth 
28437da2899SCharles.Forsyth #define	HUGE	3.4028234e38
28537da2899SCharles.Forsyth #define	PIO2	1.570796326794896619231e0
28637da2899SCharles.Forsyth #define	PI	(PIO2+PIO2)
28737da2899SCharles.Forsyth 
28837da2899SCharles.Forsyth /*
28937da2899SCharles.Forsyth  * Time-of-day
29037da2899SCharles.Forsyth  */
29137da2899SCharles.Forsyth 
29237da2899SCharles.Forsyth typedef
29337da2899SCharles.Forsyth struct Tm
29437da2899SCharles.Forsyth {
29537da2899SCharles.Forsyth 	int	sec;
29637da2899SCharles.Forsyth 	int	min;
29737da2899SCharles.Forsyth 	int	hour;
29837da2899SCharles.Forsyth 	int	mday;
29937da2899SCharles.Forsyth 	int	mon;
30037da2899SCharles.Forsyth 	int	year;
30137da2899SCharles.Forsyth 	int	wday;
30237da2899SCharles.Forsyth 	int	yday;
30337da2899SCharles.Forsyth 	char	zone[4];
30437da2899SCharles.Forsyth 	int	tzoff;
30537da2899SCharles.Forsyth } Tm;
30637da2899SCharles.Forsyth 
30737da2899SCharles.Forsyth extern	Tm*	gmtime(long);
30837da2899SCharles.Forsyth extern	Tm*	localtime(long);
30937da2899SCharles.Forsyth extern	char*	asctime(Tm*);
31037da2899SCharles.Forsyth extern	char*	ctime(long);
31137da2899SCharles.Forsyth extern	double	cputime(void);
31237da2899SCharles.Forsyth extern	long	times(long*);
31337da2899SCharles.Forsyth extern	long	tm2sec(Tm*);
31437da2899SCharles.Forsyth extern	vlong	nsec(void);
31537da2899SCharles.Forsyth 
31637da2899SCharles.Forsyth /*
31737da2899SCharles.Forsyth  * one-of-a-kind
31837da2899SCharles.Forsyth  */
31937da2899SCharles.Forsyth enum
32037da2899SCharles.Forsyth {
32137da2899SCharles.Forsyth 	PNPROC		= 1,
32237da2899SCharles.Forsyth 	PNGROUP		= 2,
32337da2899SCharles.Forsyth };
32437da2899SCharles.Forsyth extern	vlong	nsec(void);
32537da2899SCharles.Forsyth 
32637da2899SCharles.Forsyth extern	void	_assert(char*);
32737da2899SCharles.Forsyth extern	int	abs(int);
32837da2899SCharles.Forsyth extern	int	atexit(void(*)(void));
32937da2899SCharles.Forsyth extern	void	atexitdont(void(*)(void));
33037da2899SCharles.Forsyth extern	int	atnotify(int(*)(void*, char*), int);
33137da2899SCharles.Forsyth extern	double	atof(char*);
33237da2899SCharles.Forsyth extern	int	atoi(char*);
33337da2899SCharles.Forsyth extern	long	atol(char*);
33437da2899SCharles.Forsyth extern	double	charstod(int(*)(void*), void*);
33537da2899SCharles.Forsyth extern	char*	cleanname(char*);
33637da2899SCharles.Forsyth extern	int	decrypt(void*, void*, int);
33737da2899SCharles.Forsyth extern	int	encrypt(void*, void*, int);
33837da2899SCharles.Forsyth extern	int	dec64(uchar*, int, char*, int);
33937da2899SCharles.Forsyth extern	int	enc64(char*, int, uchar*, int);
34037da2899SCharles.Forsyth extern	int	dec32(uchar*, int, char*, int);
34137da2899SCharles.Forsyth extern	int	enc32(char*, int, uchar*, int);
34237da2899SCharles.Forsyth extern	int	dec16(uchar*, int, char*, int);
34337da2899SCharles.Forsyth extern	int	enc16(char*, int, uchar*, int);
34437da2899SCharles.Forsyth extern	int	encodefmt(Fmt*);
34537da2899SCharles.Forsyth extern	void	exits(char*);
34637da2899SCharles.Forsyth extern	double	frexp(double, int*);
3476b2e3235Sforsyth extern	uintptr	getcallerpc(void*);
34837da2899SCharles.Forsyth extern	char*	getenv(char*);
34937da2899SCharles.Forsyth extern	int	getfields(char*, char**, int, int, char*);
35037da2899SCharles.Forsyth extern	char*	getuser(void);
35137da2899SCharles.Forsyth extern	char*	getwd(char*, int);
35237da2899SCharles.Forsyth extern	long	labs(long);
35337da2899SCharles.Forsyth extern	double	ldexp(double, int);
35437da2899SCharles.Forsyth /*extern	void	longjmp(jmp_buf, int);*/
35537da2899SCharles.Forsyth extern	char*	mktemp(char*);
35637da2899SCharles.Forsyth extern	double	modf(double, double*);
35737da2899SCharles.Forsyth extern	int	netcrypt(void*, void*);
35837da2899SCharles.Forsyth /*extern	void	notejmp(void*, jmp_buf, int);*/
35937da2899SCharles.Forsyth extern	void	perror(char*);
36037da2899SCharles.Forsyth extern  int	postnote(int, int, char *);
36137da2899SCharles.Forsyth extern	double	pow10(int);
36237da2899SCharles.Forsyth extern	double	ipow10(int);
36337da2899SCharles.Forsyth extern	int	putenv(char*, char*);
36437da2899SCharles.Forsyth extern	void	qsort(void*, long, long, int (*)(void*, void*));
36537da2899SCharles.Forsyth /*extern	int	setjmp(jmp_buf);*/
36637da2899SCharles.Forsyth extern	double	strtod(char*, char**);
36737da2899SCharles.Forsyth extern	long	strtol(char*, char**, int);
36837da2899SCharles.Forsyth extern	ulong	strtoul(char*, char**, int);
36937da2899SCharles.Forsyth extern	vlong	strtoll(char*, char**, int);
37037da2899SCharles.Forsyth extern	uvlong	strtoull(char*, char**, int);
37137da2899SCharles.Forsyth extern	void	sysfatal(char*, ...);
37237da2899SCharles.Forsyth #pragma	varargck	argpos	sysfatal	1
37337da2899SCharles.Forsyth extern	void	syslog(int, char*, char*, ...);
37437da2899SCharles.Forsyth #pragma	varargck	argpos	syslog	3
37513c8260fSCharles.Forsyth extern	int	_tas(int*);
37637da2899SCharles.Forsyth extern	long	time(long*);
37737da2899SCharles.Forsyth extern	int	tolower(int);
37837da2899SCharles.Forsyth extern	int	toupper(int);
37937da2899SCharles.Forsyth 
38037da2899SCharles.Forsyth /*
38137da2899SCharles.Forsyth  *  network dialing
38237da2899SCharles.Forsyth  */
38337da2899SCharles.Forsyth #define NETPATHLEN 40
38437da2899SCharles.Forsyth extern	int	accept(int, char*);
38537da2899SCharles.Forsyth extern	int	announce(char*, char*);
38637da2899SCharles.Forsyth extern	int	dial(char*, char*, char*, int*);
38737da2899SCharles.Forsyth extern	void	setnetmtpt(char*, int, char*);
38837da2899SCharles.Forsyth extern	int	hangup(int);
38937da2899SCharles.Forsyth extern	int	listen(char*, char*);
39037da2899SCharles.Forsyth extern	char*	netmkaddr(char*, char*, char*);
39137da2899SCharles.Forsyth extern	int	reject(int, char*, char*);
39237da2899SCharles.Forsyth 
39337da2899SCharles.Forsyth /*
39437da2899SCharles.Forsyth  * system calls
39537da2899SCharles.Forsyth  *
39637da2899SCharles.Forsyth  */
39737da2899SCharles.Forsyth #define	STATMAX	65535U	/* max length of machine-independent stat structure */
39837da2899SCharles.Forsyth #define	DIRMAX	(sizeof(Dir)+STATMAX)	/* max length of Dir structure */
39937da2899SCharles.Forsyth #define	ERRMAX	128	/* max length of error string */
40037da2899SCharles.Forsyth 
40137da2899SCharles.Forsyth #define	MORDER	0x0003	/* mask for bits defining order of mounting */
40237da2899SCharles.Forsyth #define	MREPL	0x0000	/* mount replaces object */
40337da2899SCharles.Forsyth #define	MBEFORE	0x0001	/* mount goes before others in union directory */
40437da2899SCharles.Forsyth #define	MAFTER	0x0002	/* mount goes after others in union directory */
40537da2899SCharles.Forsyth #define	MCREATE	0x0004	/* permit creation in mounted directory */
40637da2899SCharles.Forsyth #define	MCACHE	0x0010	/* cache some data */
40737da2899SCharles.Forsyth #define	MMASK	0x0017	/* all bits on */
40837da2899SCharles.Forsyth 
40937da2899SCharles.Forsyth #define	OREAD	0	/* open for read */
41037da2899SCharles.Forsyth #define	OWRITE	1	/* write */
41137da2899SCharles.Forsyth #define	ORDWR	2	/* read and write */
41237da2899SCharles.Forsyth #define	OEXEC	3	/* execute, == read but check execute permission */
41337da2899SCharles.Forsyth #define	OTRUNC	16	/* or'ed in (except for exec), truncate file first */
41437da2899SCharles.Forsyth #define	OCEXEC	32	/* or'ed in, close on exec */
41537da2899SCharles.Forsyth #define	ORCLOSE	64	/* or'ed in, remove on close */
41637da2899SCharles.Forsyth #define	OEXCL	0x1000	/* or'ed in, exclusive use (create only) */
41737da2899SCharles.Forsyth 
41837da2899SCharles.Forsyth #define	AEXIST	0	/* accessible: exists */
41937da2899SCharles.Forsyth #define	AEXEC	1	/* execute access */
42037da2899SCharles.Forsyth #define	AWRITE	2	/* write access */
42137da2899SCharles.Forsyth #define	AREAD	4	/* read access */
42237da2899SCharles.Forsyth 
42337da2899SCharles.Forsyth /* Segattch */
42437da2899SCharles.Forsyth #define	SG_RONLY	0040	/* read only */
42537da2899SCharles.Forsyth #define	SG_CEXEC	0100	/* detach on exec */
42637da2899SCharles.Forsyth 
42737da2899SCharles.Forsyth #define	NCONT	0	/* continue after note */
42837da2899SCharles.Forsyth #define	NDFLT	1	/* terminate after note */
42937da2899SCharles.Forsyth #define	NSAVE	2	/* clear note but hold state */
43037da2899SCharles.Forsyth #define	NRSTR	3	/* restore saved state */
43137da2899SCharles.Forsyth 
43237da2899SCharles.Forsyth /* rfork */
43337da2899SCharles.Forsyth enum
43437da2899SCharles.Forsyth {
43537da2899SCharles.Forsyth 	RFNAMEG		= (1<<0),
43637da2899SCharles.Forsyth 	RFENVG		= (1<<1),
43737da2899SCharles.Forsyth 	RFFDG		= (1<<2),
43837da2899SCharles.Forsyth 	RFNOTEG		= (1<<3),
43937da2899SCharles.Forsyth 	RFPROC		= (1<<4),
44037da2899SCharles.Forsyth 	RFMEM		= (1<<5),
44137da2899SCharles.Forsyth 	RFNOWAIT	= (1<<6),
44237da2899SCharles.Forsyth 	RFCNAMEG	= (1<<10),
44337da2899SCharles.Forsyth 	RFCENVG		= (1<<11),
44437da2899SCharles.Forsyth 	RFCFDG		= (1<<12),
44537da2899SCharles.Forsyth 	RFREND		= (1<<13),
44637da2899SCharles.Forsyth 	RFNOMNT		= (1<<14)
44737da2899SCharles.Forsyth };
44837da2899SCharles.Forsyth 
44937da2899SCharles.Forsyth /* bits in Qid.type */
45037da2899SCharles.Forsyth #define QTDIR		0x80		/* type bit for directories */
45137da2899SCharles.Forsyth #define QTAPPEND	0x40		/* type bit for append only files */
45237da2899SCharles.Forsyth #define QTEXCL		0x20		/* type bit for exclusive use files */
45337da2899SCharles.Forsyth #define QTMOUNT		0x10		/* type bit for mounted channel */
45437da2899SCharles.Forsyth #define QTAUTH		0x08		/* type bit for authentication file */
45537da2899SCharles.Forsyth #define QTFILE		0x00		/* plain file */
45637da2899SCharles.Forsyth 
45737da2899SCharles.Forsyth /* bits in Dir.mode */
45837da2899SCharles.Forsyth #define DMDIR		0x80000000	/* mode bit for directories */
45937da2899SCharles.Forsyth #define DMAPPEND	0x40000000	/* mode bit for append only files */
46037da2899SCharles.Forsyth #define DMEXCL		0x20000000	/* mode bit for exclusive use files */
46137da2899SCharles.Forsyth #define DMMOUNT		0x10000000	/* mode bit for mounted channel */
46237da2899SCharles.Forsyth #define DMAUTH		0x08000000	/* mode bit for authentication file */
46337da2899SCharles.Forsyth #define DMREAD		0x4		/* mode bit for read permission */
46437da2899SCharles.Forsyth #define DMWRITE		0x2		/* mode bit for write permission */
46537da2899SCharles.Forsyth #define DMEXEC		0x1		/* mode bit for execute permission */
46637da2899SCharles.Forsyth 
46737da2899SCharles.Forsyth typedef
46837da2899SCharles.Forsyth struct Qid
46937da2899SCharles.Forsyth {
47037da2899SCharles.Forsyth 	uvlong	path;
47137da2899SCharles.Forsyth 	ulong	vers;
47237da2899SCharles.Forsyth 	uchar	type;
47337da2899SCharles.Forsyth } Qid;
47437da2899SCharles.Forsyth 
47537da2899SCharles.Forsyth typedef
47637da2899SCharles.Forsyth struct Dir {
47737da2899SCharles.Forsyth 
47837da2899SCharles.Forsyth 	/* system-modified data */
47937da2899SCharles.Forsyth 	ushort	type;	/* server type */
48037da2899SCharles.Forsyth 	uint	dev;	/* server subtype */
48137da2899SCharles.Forsyth 	/* file data */
48237da2899SCharles.Forsyth 	Qid	qid;	/* unique id from server */
48337da2899SCharles.Forsyth 	ulong	mode;	/* permissions */
48437da2899SCharles.Forsyth 	ulong	atime;	/* last read time */
48537da2899SCharles.Forsyth 	ulong	mtime;	/* last write time */
48637da2899SCharles.Forsyth 	vlong	length;	/* file length */
48737da2899SCharles.Forsyth 	char	*name;	/* last element of path */
48837da2899SCharles.Forsyth 	char	*uid;	/* owner name */
48937da2899SCharles.Forsyth 	char	*gid;	/* group name */
49037da2899SCharles.Forsyth 	char	*muid;	/* last modifier name */
49137da2899SCharles.Forsyth } Dir;
49237da2899SCharles.Forsyth 
49337da2899SCharles.Forsyth extern	Dir*	dirstat(char*);
49437da2899SCharles.Forsyth extern	Dir*	dirfstat(int);
49537da2899SCharles.Forsyth extern	int	dirwstat(char*, Dir*);
49637da2899SCharles.Forsyth extern	int	dirfwstat(int, Dir*);
49737da2899SCharles.Forsyth extern	long	dirread(int, Dir**);
49837da2899SCharles.Forsyth extern	void	nulldir(Dir*);
49937da2899SCharles.Forsyth extern	long	dirreadall(int, Dir**);
50037da2899SCharles.Forsyth 
50137da2899SCharles.Forsyth #define CHDIR		0x80000000	/* mode bit for directories */
50237da2899SCharles.Forsyth #define CHAPPEND	0x40000000	/* mode bit for append only files */
50337da2899SCharles.Forsyth #define CHEXCL		0x20000000	/* mode bit for exclusive use files */
50437da2899SCharles.Forsyth #define CHMOUNT		0x10000000	/* mode bit for mounted channel */
50537da2899SCharles.Forsyth #define CHREAD		0x4		/* mode bit for read permission */
50637da2899SCharles.Forsyth #define CHWRITE		0x2		/* mode bit for write permission */
50737da2899SCharles.Forsyth #define CHEXEC		0x1		/* mode bit for execute permission */
50837da2899SCharles.Forsyth 
50937da2899SCharles.Forsyth 
51037da2899SCharles.Forsyth typedef
51137da2899SCharles.Forsyth struct Waitmsg
51237da2899SCharles.Forsyth {
51337da2899SCharles.Forsyth 	char	pid[12];	/* of loved one */
51437da2899SCharles.Forsyth 	char	time[3*12];	/* of loved one & descendants */
51537da2899SCharles.Forsyth 	char	*msg;
51637da2899SCharles.Forsyth } Waitmsg;
51737da2899SCharles.Forsyth 
51837da2899SCharles.Forsyth typedef
51937da2899SCharles.Forsyth struct IOchunk
52037da2899SCharles.Forsyth {
52137da2899SCharles.Forsyth 	void	*addr;
52237da2899SCharles.Forsyth 	ulong	len;
52337da2899SCharles.Forsyth } IOchunk;
52437da2899SCharles.Forsyth 
52537da2899SCharles.Forsyth extern	void	_exits(char*);
52637da2899SCharles.Forsyth 
52737da2899SCharles.Forsyth extern	void	abort(void);
52837da2899SCharles.Forsyth extern	int	access(char*, int);
52937da2899SCharles.Forsyth extern	long	alarm(ulong);
53037da2899SCharles.Forsyth extern	int	await(char*, int);
53137da2899SCharles.Forsyth extern	int	bind(char*, char*, int);
53237da2899SCharles.Forsyth extern	int	brk(void*);
53337da2899SCharles.Forsyth extern	int	chdir(char*);
53437da2899SCharles.Forsyth extern	int	close(int);
53537da2899SCharles.Forsyth extern	int	create(char*, int, ulong);
53637da2899SCharles.Forsyth extern	int	dup(int, int);
53737da2899SCharles.Forsyth extern	int	errstr(char*, uint);
53837da2899SCharles.Forsyth extern	int	exec(char*, char*[]);
53937da2899SCharles.Forsyth extern	int	execl(char*, ...);
54037da2899SCharles.Forsyth extern  int	filsys(int, int, char*);
54137da2899SCharles.Forsyth extern	int	fork(void);
54237da2899SCharles.Forsyth extern	int	rfork(int);
54337da2899SCharles.Forsyth extern	int	fauth(int, char*);
54437da2899SCharles.Forsyth extern	int	fstat(int, uchar*, int);
54537da2899SCharles.Forsyth extern	int	fwstat(int, uchar*, int);
54637da2899SCharles.Forsyth extern	int	fversion(int, int, char*, int);
54737da2899SCharles.Forsyth extern	int	mount(int, int, char*, int, char*);
54837da2899SCharles.Forsyth extern	int	unmount(char*, char*);
54937da2899SCharles.Forsyth extern	int	noted(int);
55037da2899SCharles.Forsyth extern	int	notify(void(*)(void*, char*));
55137da2899SCharles.Forsyth extern	int	open(char*, int);
55237da2899SCharles.Forsyth extern	int	fd2path(int, char*, int);
55337da2899SCharles.Forsyth extern	int	pipe(int*);
55437da2899SCharles.Forsyth extern	long	pread(int, void*, long, vlong);
55537da2899SCharles.Forsyth extern	long	pwrite(int, void*, long, vlong);
55637da2899SCharles.Forsyth extern	long	read(int, void*, long);
55737da2899SCharles.Forsyth extern	long	readn(int, void*, long);
55837da2899SCharles.Forsyth extern	int	remove(char*);
55937da2899SCharles.Forsyth extern	void*	sbrk(ulong);
56037da2899SCharles.Forsyth extern	vlong	seek(int, vlong, int);
56137da2899SCharles.Forsyth extern	long	segattach(int, char*, void*, ulong);
56237da2899SCharles.Forsyth extern	int	segbrk(void*, void*);
56337da2899SCharles.Forsyth extern	int	segdetach(void*);
56437da2899SCharles.Forsyth extern	int	segflush(void*, ulong);
56537da2899SCharles.Forsyth extern	int	segfree(void*, ulong);
56637da2899SCharles.Forsyth extern	int	sleep(long);
56737da2899SCharles.Forsyth extern	int	stat(char*, uchar*, int);
56837da2899SCharles.Forsyth extern	Waitmsg*	wait(void);
56937da2899SCharles.Forsyth extern	int	waitpid(void);
57037da2899SCharles.Forsyth extern	long	write(int, void*, long);
57137da2899SCharles.Forsyth extern	long	write9p(int, void*, long);
57237da2899SCharles.Forsyth extern	int	wstat(char*, char*);
57337da2899SCharles.Forsyth extern	ulong	rendezvous(ulong, ulong);
57437da2899SCharles.Forsyth 
57537da2899SCharles.Forsyth extern	int	getpid(void);
57637da2899SCharles.Forsyth extern	int	getppid(void);
57737da2899SCharles.Forsyth extern	void	rerrstr(char*, uint);
57837da2899SCharles.Forsyth extern	char*	sysname(void);
57937da2899SCharles.Forsyth extern	void	werrstr(char*, ...);
58037da2899SCharles.Forsyth #pragma	varargck	argpos	werrstr	1
58137da2899SCharles.Forsyth 
58237da2899SCharles.Forsyth extern char *argv0;
58337da2899SCharles.Forsyth #define	ARGBEGIN	for((argv0||(argv0=*argv)),argv++,argc--;\
58437da2899SCharles.Forsyth 			    argv[0] && argv[0][0]=='-' && argv[0][1];\
58537da2899SCharles.Forsyth 			    argc--, argv++) {\
58637da2899SCharles.Forsyth 				char *_args, *_argt;\
58737da2899SCharles.Forsyth 				Rune _argc;\
58837da2899SCharles.Forsyth 				_args = &argv[0][1];\
58937da2899SCharles.Forsyth 				if(_args[0]=='-' && _args[1]==0){\
59037da2899SCharles.Forsyth 					argc--; argv++; break;\
59137da2899SCharles.Forsyth 				}\
59237da2899SCharles.Forsyth 				_argc = 0;\
59337da2899SCharles.Forsyth 				while(*_args && (_args += chartorune(&_argc, _args)))\
59437da2899SCharles.Forsyth 				switch(_argc)
59537da2899SCharles.Forsyth #define	ARGEND		SET(_argt);USED(_argt,_argc,_args);}USED(argv, argc);
59637da2899SCharles.Forsyth #define	ARGF()		(_argt=_args, _args="",\
59737da2899SCharles.Forsyth 				(*_argt? _argt: argv[1]? (argc--, *++argv): 0))
59837da2899SCharles.Forsyth #define	EARGF(x)	(_argt=_args, _args="",\
59937da2899SCharles.Forsyth 				(*_argt? _argt: argv[1]? (argc--, *++argv): ((x), abort(), (char*)0)))
60037da2899SCharles.Forsyth 
60137da2899SCharles.Forsyth #define	ARGC()		_argc
602