xref: /plan9-contrib/sys/include/libc.h (revision c3b0023128940c4042dcb984316e2abe361e0e76)
13e12c5d1SDavid du Colombier #pragma	lib	"libc.a"
2219b2ee8SDavid du Colombier #pragma	src	"/sys/src/libc"
3219b2ee8SDavid du Colombier 
4219b2ee8SDavid du Colombier #define	nelem(x)	(sizeof(x)/sizeof((x)[0]))
57dd7cddfSDavid du Colombier #define	offsetof(s, m)	(ulong)(&(((s*)0)->m))
69a747e4fSDavid du Colombier #define	assert(x)	if(x){}else _assert("x")
73e12c5d1SDavid du Colombier 
83e12c5d1SDavid du Colombier /*
93e12c5d1SDavid du Colombier  * mem routines
103e12c5d1SDavid du Colombier  */
113e12c5d1SDavid du Colombier extern	void*	memccpy(void*, void*, int, ulong);
123e12c5d1SDavid du Colombier extern	void*	memset(void*, int, ulong);
133e12c5d1SDavid du Colombier extern	int	memcmp(void*, void*, ulong);
143e12c5d1SDavid du Colombier extern	void*	memcpy(void*, void*, ulong);
153e12c5d1SDavid du Colombier extern	void*	memmove(void*, void*, ulong);
163e12c5d1SDavid du Colombier extern	void*	memchr(void*, int, ulong);
173e12c5d1SDavid du Colombier 
183e12c5d1SDavid du Colombier /*
193e12c5d1SDavid du Colombier  * string routines
203e12c5d1SDavid du Colombier  */
213e12c5d1SDavid du Colombier extern	char*	strcat(char*, char*);
227dd7cddfSDavid du Colombier extern	char*	strchr(char*, int);
233e12c5d1SDavid du Colombier extern	int	strcmp(char*, char*);
243e12c5d1SDavid du Colombier extern	char*	strcpy(char*, char*);
2559cc4ca5SDavid du Colombier extern	char*	strecpy(char*, char*, char*);
263e12c5d1SDavid du Colombier extern	char*	strdup(char*);
273e12c5d1SDavid du Colombier extern	char*	strncat(char*, char*, long);
283e12c5d1SDavid du Colombier extern	char*	strncpy(char*, char*, long);
293e12c5d1SDavid du Colombier extern	int	strncmp(char*, char*, long);
303e12c5d1SDavid du Colombier extern	char*	strpbrk(char*, char*);
317dd7cddfSDavid du Colombier extern	char*	strrchr(char*, int);
323e12c5d1SDavid du Colombier extern	char*	strtok(char*, char*);
333e12c5d1SDavid du Colombier extern	long	strlen(char*);
343e12c5d1SDavid du Colombier extern	long	strspn(char*, char*);
353e12c5d1SDavid du Colombier extern	long	strcspn(char*, char*);
363e12c5d1SDavid du Colombier extern	char*	strstr(char*, char*);
3780ee5cbfSDavid du Colombier extern	int	cistrncmp(char*, char*, int);
3880ee5cbfSDavid du Colombier extern	int	cistrcmp(char*, char*);
3980ee5cbfSDavid du Colombier extern	char*	cistrstr(char*, char*);
40219b2ee8SDavid du Colombier extern	int	tokenize(char*, char**, int);
413e12c5d1SDavid du Colombier 
423e12c5d1SDavid du Colombier enum
433e12c5d1SDavid du Colombier {
44e94a8e9bSDavid du Colombier 	UTFmax		= 4,		/* maximum bytes per rune */
453e12c5d1SDavid du Colombier 	Runesync	= 0x80,		/* cannot represent part of a UTF sequence (<) */
463e12c5d1SDavid du Colombier 	Runeself	= 0x80,		/* rune and UTF sequences are the same (<) */
471517f4bcSDavid du Colombier 	Runeerror	= 0xFFFD,	/* decoding error in UTF */
48e94a8e9bSDavid du Colombier 	Runemax		= 0x10FFFF,	/* 21-bit rune */
49e94a8e9bSDavid du Colombier 	Runemask	= 0x1FFFFF,	/* bits used by runes (see grep) */
503e12c5d1SDavid du Colombier };
513e12c5d1SDavid du Colombier 
523e12c5d1SDavid du Colombier /*
537dd7cddfSDavid du Colombier  * rune routines
543e12c5d1SDavid du Colombier  */
553e12c5d1SDavid du Colombier extern	int	runetochar(char*, Rune*);
563e12c5d1SDavid du Colombier extern	int	chartorune(Rune*, char*);
573e12c5d1SDavid du Colombier extern	int	runelen(long);
587dd7cddfSDavid du Colombier extern	int	runenlen(Rune*, int);
593e12c5d1SDavid du Colombier extern	int	fullrune(char*, int);
603e12c5d1SDavid du Colombier extern	int	utflen(char*);
6159cc4ca5SDavid du Colombier extern	int	utfnlen(char*, long);
623e12c5d1SDavid du Colombier extern	char*	utfrune(char*, long);
633e12c5d1SDavid du Colombier extern	char*	utfrrune(char*, long);
643e12c5d1SDavid du Colombier extern	char*	utfutf(char*, char*);
659a747e4fSDavid du Colombier extern	char*	utfecpy(char*, char*, char*);
6659cc4ca5SDavid du Colombier 
6759cc4ca5SDavid du Colombier extern	Rune*	runestrcat(Rune*, Rune*);
6859cc4ca5SDavid du Colombier extern	Rune*	runestrchr(Rune*, Rune);
6959cc4ca5SDavid du Colombier extern	int	runestrcmp(Rune*, Rune*);
7059cc4ca5SDavid du Colombier extern	Rune*	runestrcpy(Rune*, Rune*);
7159cc4ca5SDavid du Colombier extern	Rune*	runestrncpy(Rune*, Rune*, long);
7259cc4ca5SDavid du Colombier extern	Rune*	runestrecpy(Rune*, Rune*, Rune*);
7359cc4ca5SDavid du Colombier extern	Rune*	runestrdup(Rune*);
7459cc4ca5SDavid du Colombier extern	Rune*	runestrncat(Rune*, Rune*, long);
7559cc4ca5SDavid du Colombier extern	int	runestrncmp(Rune*, Rune*, long);
7659cc4ca5SDavid du Colombier extern	Rune*	runestrrchr(Rune*, Rune);
7759cc4ca5SDavid du Colombier extern	long	runestrlen(Rune*);
7859cc4ca5SDavid du Colombier extern	Rune*	runestrstr(Rune*, Rune*);
7959cc4ca5SDavid du Colombier 
807dd7cddfSDavid du Colombier extern	Rune	tolowerrune(Rune);
817dd7cddfSDavid du Colombier extern	Rune	totitlerune(Rune);
827dd7cddfSDavid du Colombier extern	Rune	toupperrune(Rune);
83e94a8e9bSDavid du Colombier extern	Rune	tobaserune(Rune);
847dd7cddfSDavid du Colombier extern	int	isalpharune(Rune);
85e94a8e9bSDavid du Colombier extern	int	isbaserune(Rune);
86e94a8e9bSDavid du Colombier extern	int	isdigitrune(Rune);
877dd7cddfSDavid du Colombier extern	int	islowerrune(Rune);
887dd7cddfSDavid du Colombier extern	int	isspacerune(Rune);
897dd7cddfSDavid du Colombier extern	int	istitlerune(Rune);
907dd7cddfSDavid du Colombier extern	int	isupperrune(Rune);
913e12c5d1SDavid du Colombier 
923e12c5d1SDavid du Colombier /*
933e12c5d1SDavid du Colombier  * malloc
943e12c5d1SDavid du Colombier  */
957dd7cddfSDavid du Colombier extern	void*	malloc(ulong);
967dd7cddfSDavid du Colombier extern	void*	mallocz(ulong, int);
973e12c5d1SDavid du Colombier extern	void	free(void*);
987dd7cddfSDavid du Colombier extern	ulong	msize(void*);
995243b8d1SDavid du Colombier extern	void*	mallocalign(ulong, ulong, long, ulong);
1007dd7cddfSDavid du Colombier extern	void*	calloc(ulong, ulong);
1017dd7cddfSDavid du Colombier extern	void*	realloc(void*, ulong);
1027dd7cddfSDavid du Colombier extern	void	setmalloctag(void*, ulong);
1037dd7cddfSDavid du Colombier extern	void	setrealloctag(void*, ulong);
1047dd7cddfSDavid du Colombier extern	ulong	getmalloctag(void*);
1057dd7cddfSDavid du Colombier extern	ulong	getrealloctag(void*);
1067dd7cddfSDavid du Colombier extern	void*	malloctopoolblock(void*);
1073e12c5d1SDavid du Colombier 
1083e12c5d1SDavid du Colombier /*
1093e12c5d1SDavid du Colombier  * print routines
1103e12c5d1SDavid du Colombier  */
1119a747e4fSDavid du Colombier typedef struct Fmt	Fmt;
1129a747e4fSDavid du Colombier struct Fmt{
1139a747e4fSDavid du Colombier 	uchar	runes;			/* output buffer is runes or chars? */
1149a747e4fSDavid du Colombier 	void	*start;			/* of buffer */
1159a747e4fSDavid du Colombier 	void	*to;			/* current place in the buffer */
1169a747e4fSDavid du Colombier 	void	*stop;			/* end of the buffer; overwritten if flush fails */
1179a747e4fSDavid du Colombier 	int	(*flush)(Fmt *);	/* called when to == stop */
1189a747e4fSDavid du Colombier 	void	*farg;			/* to make flush a closure */
1199a747e4fSDavid du Colombier 	int	nfmt;			/* num chars formatted so far */
1209a747e4fSDavid du Colombier 	va_list	args;			/* args passed to dofmt */
1219a747e4fSDavid du Colombier 	int	r;			/* % format Rune */
1229a747e4fSDavid du Colombier 	int	width;
1239a747e4fSDavid du Colombier 	int	prec;
1249a747e4fSDavid du Colombier 	ulong	flags;
125bd389b36SDavid du Colombier };
1269a747e4fSDavid du Colombier 
1279a747e4fSDavid du Colombier enum{
1289a747e4fSDavid du Colombier 	FmtWidth	= 1,
1299a747e4fSDavid du Colombier 	FmtLeft		= FmtWidth << 1,
1309a747e4fSDavid du Colombier 	FmtPrec		= FmtLeft << 1,
1319a747e4fSDavid du Colombier 	FmtSharp	= FmtPrec << 1,
1329a747e4fSDavid du Colombier 	FmtSpace	= FmtSharp << 1,
1339a747e4fSDavid du Colombier 	FmtSign		= FmtSpace << 1,
1349a747e4fSDavid du Colombier 	FmtZero		= FmtSign << 1,
1359a747e4fSDavid du Colombier 	FmtUnsigned	= FmtZero << 1,
1369a747e4fSDavid du Colombier 	FmtShort	= FmtUnsigned << 1,
1379a747e4fSDavid du Colombier 	FmtLong		= FmtShort << 1,
1389a747e4fSDavid du Colombier 	FmtVLong	= FmtLong << 1,
1399a747e4fSDavid du Colombier 	FmtComma	= FmtVLong << 1,
1409a747e4fSDavid du Colombier 	FmtByte		= FmtComma << 1,
1419a747e4fSDavid du Colombier 
1429a747e4fSDavid du Colombier 	FmtFlag		= FmtByte << 1
1439a747e4fSDavid du Colombier };
1449a747e4fSDavid du Colombier 
1453e12c5d1SDavid du Colombier extern	int	print(char*, ...);
1467dd7cddfSDavid du Colombier extern	char*	seprint(char*, char*, char*, ...);
1479a747e4fSDavid du Colombier extern	char*	vseprint(char*, char*, char*, va_list);
148bd389b36SDavid du Colombier extern	int	snprint(char*, int, char*, ...);
1499a747e4fSDavid du Colombier extern	int	vsnprint(char*, int, char*, va_list);
1509a747e4fSDavid du Colombier extern	char*	smprint(char*, ...);
1519a747e4fSDavid du Colombier extern	char*	vsmprint(char*, va_list);
1523e12c5d1SDavid du Colombier extern	int	sprint(char*, char*, ...);
1533e12c5d1SDavid du Colombier extern	int	fprint(int, char*, ...);
1549a747e4fSDavid du Colombier extern	int	vfprint(int, char*, va_list);
1553e12c5d1SDavid du Colombier 
1569a747e4fSDavid du Colombier extern	int	runesprint(Rune*, char*, ...);
1579a747e4fSDavid du Colombier extern	int	runesnprint(Rune*, int, char*, ...);
1589a747e4fSDavid du Colombier extern	int	runevsnprint(Rune*, int, char*, va_list);
1599a747e4fSDavid du Colombier extern	Rune*	runeseprint(Rune*, Rune*, char*, ...);
1609a747e4fSDavid du Colombier extern	Rune*	runevseprint(Rune*, Rune*, char*, va_list);
1619a747e4fSDavid du Colombier extern	Rune*	runesmprint(char*, ...);
1629a747e4fSDavid du Colombier extern	Rune*	runevsmprint(char*, va_list);
1639a747e4fSDavid du Colombier 
1649a747e4fSDavid du Colombier extern	int	fmtfdinit(Fmt*, int, char*, int);
1659a747e4fSDavid du Colombier extern	int	fmtfdflush(Fmt*);
1669a747e4fSDavid du Colombier extern	int	fmtstrinit(Fmt*);
1679a747e4fSDavid du Colombier extern	char*	fmtstrflush(Fmt*);
1689a747e4fSDavid du Colombier extern	int	runefmtstrinit(Fmt*);
1699a747e4fSDavid du Colombier extern	Rune*	runefmtstrflush(Fmt*);
1709a747e4fSDavid du Colombier 
1719a747e4fSDavid du Colombier #pragma	varargck	argpos	fmtprint	2
1727dd7cddfSDavid du Colombier #pragma	varargck	argpos	fprint		2
1739a747e4fSDavid du Colombier #pragma	varargck	argpos	print		1
1749a747e4fSDavid du Colombier #pragma	varargck	argpos	runeseprint	3
1759a747e4fSDavid du Colombier #pragma	varargck	argpos	runesmprint	1
1769a747e4fSDavid du Colombier #pragma	varargck	argpos	runesnprint	3
1779a747e4fSDavid du Colombier #pragma	varargck	argpos	runesprint	2
1789a747e4fSDavid du Colombier #pragma	varargck	argpos	seprint		3
1799a747e4fSDavid du Colombier #pragma	varargck	argpos	smprint		1
1809a747e4fSDavid du Colombier #pragma	varargck	argpos	snprint		3
1819a747e4fSDavid du Colombier #pragma	varargck	argpos	sprint		2
1827dd7cddfSDavid du Colombier 
1837dd7cddfSDavid du Colombier #pragma	varargck	type	"lld"	vlong
184175630faSDavid du Colombier #pragma	varargck	type	"llo"	vlong
1857dd7cddfSDavid du Colombier #pragma	varargck	type	"llx"	vlong
186175630faSDavid du Colombier #pragma	varargck	type	"llb"	vlong
1877dd7cddfSDavid du Colombier #pragma	varargck	type	"lld"	uvlong
188175630faSDavid du Colombier #pragma	varargck	type	"llo"	uvlong
1897dd7cddfSDavid du Colombier #pragma	varargck	type	"llx"	uvlong
190175630faSDavid du Colombier #pragma	varargck	type	"llb"	uvlong
1917dd7cddfSDavid du Colombier #pragma	varargck	type	"ld"	long
192175630faSDavid du Colombier #pragma	varargck	type	"lo"	long
1937dd7cddfSDavid du Colombier #pragma	varargck	type	"lx"	long
194208510e1SDavid du Colombier #pragma	varargck	type	"lb"	long
1957dd7cddfSDavid du Colombier #pragma	varargck	type	"ld"	ulong
196175630faSDavid du Colombier #pragma	varargck	type	"lo"	ulong
1977dd7cddfSDavid du Colombier #pragma	varargck	type	"lx"	ulong
198208510e1SDavid du Colombier #pragma	varargck	type	"lb"	ulong
1997dd7cddfSDavid du Colombier #pragma	varargck	type	"d"	int
200175630faSDavid du Colombier #pragma	varargck	type	"o"	int
2017dd7cddfSDavid du Colombier #pragma	varargck	type	"x"	int
2027dd7cddfSDavid du Colombier #pragma	varargck	type	"c"	int
2037dd7cddfSDavid du Colombier #pragma	varargck	type	"C"	int
204208510e1SDavid du Colombier #pragma	varargck	type	"b"	int
2057dd7cddfSDavid du Colombier #pragma	varargck	type	"d"	uint
2067dd7cddfSDavid du Colombier #pragma	varargck	type	"x"	uint
2077dd7cddfSDavid du Colombier #pragma	varargck	type	"c"	uint
2087dd7cddfSDavid du Colombier #pragma	varargck	type	"C"	uint
209208510e1SDavid du Colombier #pragma	varargck	type	"b"	uint
2107dd7cddfSDavid du Colombier #pragma	varargck	type	"f"	double
2117dd7cddfSDavid du Colombier #pragma	varargck	type	"e"	double
2127dd7cddfSDavid du Colombier #pragma	varargck	type	"g"	double
2137dd7cddfSDavid du Colombier #pragma	varargck	type	"s"	char*
21480ee5cbfSDavid du Colombier #pragma	varargck	type	"q"	char*
2157dd7cddfSDavid du Colombier #pragma	varargck	type	"S"	Rune*
21680ee5cbfSDavid du Colombier #pragma	varargck	type	"Q"	Rune*
2177dd7cddfSDavid du Colombier #pragma	varargck	type	"r"	void
2187dd7cddfSDavid du Colombier #pragma	varargck	type	"%"	void
2199a747e4fSDavid du Colombier #pragma	varargck	type	"n"	int*
2201517f4bcSDavid du Colombier #pragma	varargck	type	"p"	uintptr
2217dd7cddfSDavid du Colombier #pragma	varargck	type	"p"	void*
2229a747e4fSDavid du Colombier #pragma	varargck	flag	','
223a945669bSDavid du Colombier #pragma	varargck	flag	' '
224208510e1SDavid du Colombier #pragma	varargck	flag	'h'
2259a747e4fSDavid du Colombier #pragma varargck	type	"<"	void*
2269a747e4fSDavid du Colombier #pragma varargck	type	"["	void*
2279a747e4fSDavid du Colombier #pragma varargck	type	"H"	void*
228375daca8SDavid du Colombier #pragma varargck	type	"lH"	void*
2297dd7cddfSDavid du Colombier 
2309a747e4fSDavid du Colombier extern	int	fmtinstall(int, int (*)(Fmt*));
2319a747e4fSDavid du Colombier extern	int	dofmt(Fmt*, char*);
2329a747e4fSDavid du Colombier extern	int	dorfmt(Fmt*, Rune*);
2339a747e4fSDavid du Colombier extern	int	fmtprint(Fmt*, char*, ...);
2349a747e4fSDavid du Colombier extern	int	fmtvprint(Fmt*, char*, va_list);
2359a747e4fSDavid du Colombier extern	int	fmtrune(Fmt*, int);
2369a747e4fSDavid du Colombier extern	int	fmtstrcpy(Fmt*, char*);
2379a747e4fSDavid du Colombier extern	int	fmtrunestrcpy(Fmt*, Rune*);
2389a747e4fSDavid du Colombier /*
2399a747e4fSDavid du Colombier  * error string for %r
2409a747e4fSDavid du Colombier  * supplied on per os basis, not part of fmt library
2419a747e4fSDavid du Colombier  */
2429a747e4fSDavid du Colombier extern	int	errfmt(Fmt *f);
24380ee5cbfSDavid du Colombier 
24480ee5cbfSDavid du Colombier /*
24580ee5cbfSDavid du Colombier  * quoted strings
24680ee5cbfSDavid du Colombier  */
24780ee5cbfSDavid du Colombier extern	char	*unquotestrdup(char*);
24880ee5cbfSDavid du Colombier extern	Rune	*unquoterunestrdup(Rune*);
24980ee5cbfSDavid du Colombier extern	char	*quotestrdup(char*);
25080ee5cbfSDavid du Colombier extern	Rune	*quoterunestrdup(Rune*);
2519a747e4fSDavid du Colombier extern	int	quotestrfmt(Fmt*);
2529a747e4fSDavid du Colombier extern	int	quoterunestrfmt(Fmt*);
25380ee5cbfSDavid du Colombier extern	void	quotefmtinstall(void);
25480ee5cbfSDavid du Colombier extern	int	(*doquote)(int);
255d9306527SDavid du Colombier extern	int	needsrcquote(int);
25680ee5cbfSDavid du Colombier 
2573e12c5d1SDavid du Colombier /*
2583e12c5d1SDavid du Colombier  * random number
2593e12c5d1SDavid du Colombier  */
2603e12c5d1SDavid du Colombier extern	void	srand(long);
2613e12c5d1SDavid du Colombier extern	int	rand(void);
2623e12c5d1SDavid du Colombier extern	int	nrand(int);
2633e12c5d1SDavid du Colombier extern	long	lrand(void);
2643e12c5d1SDavid du Colombier extern	long	lnrand(long);
2653e12c5d1SDavid du Colombier extern	double	frand(void);
2667dd7cddfSDavid du Colombier extern	ulong	truerand(void);			/* uses /dev/random */
2679a747e4fSDavid du Colombier extern	ulong	ntruerand(ulong);		/* uses /dev/random */
2683e12c5d1SDavid du Colombier 
2693e12c5d1SDavid du Colombier /*
2703e12c5d1SDavid du Colombier  * math
2713e12c5d1SDavid du Colombier  */
2723e12c5d1SDavid du Colombier extern	ulong	getfcr(void);
2733e12c5d1SDavid du Colombier extern	void	setfsr(ulong);
2743e12c5d1SDavid du Colombier extern	ulong	getfsr(void);
2753e12c5d1SDavid du Colombier extern	void	setfcr(ulong);
2763e12c5d1SDavid du Colombier extern	double	NaN(void);
2773e12c5d1SDavid du Colombier extern	double	Inf(int);
2783e12c5d1SDavid du Colombier extern	int	isNaN(double);
2793e12c5d1SDavid du Colombier extern	int	isInf(double, int);
28059cc4ca5SDavid du Colombier extern	ulong	umuldiv(ulong, ulong, ulong);
28159cc4ca5SDavid du Colombier extern	long	muldiv(long, long, long);
2823e12c5d1SDavid du Colombier 
2833e12c5d1SDavid du Colombier extern	double	pow(double, double);
2843e12c5d1SDavid du Colombier extern	double	atan2(double, double);
2853e12c5d1SDavid du Colombier extern	double	fabs(double);
2863e12c5d1SDavid du Colombier extern	double	atan(double);
2873e12c5d1SDavid du Colombier extern	double	log(double);
2883e12c5d1SDavid du Colombier extern	double	log10(double);
2893e12c5d1SDavid du Colombier extern	double	exp(double);
2903e12c5d1SDavid du Colombier extern	double	floor(double);
2913e12c5d1SDavid du Colombier extern	double	ceil(double);
2923e12c5d1SDavid du Colombier extern	double	hypot(double, double);
2933e12c5d1SDavid du Colombier extern	double	sin(double);
2943e12c5d1SDavid du Colombier extern	double	cos(double);
2953e12c5d1SDavid du Colombier extern	double	tan(double);
2963e12c5d1SDavid du Colombier extern	double	asin(double);
2973e12c5d1SDavid du Colombier extern	double	acos(double);
2983e12c5d1SDavid du Colombier extern	double	sinh(double);
2993e12c5d1SDavid du Colombier extern	double	cosh(double);
3003e12c5d1SDavid du Colombier extern	double	tanh(double);
3013e12c5d1SDavid du Colombier extern	double	sqrt(double);
3023e12c5d1SDavid du Colombier extern	double	fmod(double, double);
3033e12c5d1SDavid du Colombier 
3043e12c5d1SDavid du Colombier #define	HUGE	3.4028234e38
3053e12c5d1SDavid du Colombier #define	PIO2	1.570796326794896619231e0
3063e12c5d1SDavid du Colombier #define	PI	(PIO2+PIO2)
3073e12c5d1SDavid du Colombier 
3083e12c5d1SDavid du Colombier /*
3093e12c5d1SDavid du Colombier  * Time-of-day
3103e12c5d1SDavid du Colombier  */
3113e12c5d1SDavid du Colombier 
3123e12c5d1SDavid du Colombier typedef
3133e12c5d1SDavid du Colombier struct Tm
3143e12c5d1SDavid du Colombier {
3153e12c5d1SDavid du Colombier 	int	sec;
3163e12c5d1SDavid du Colombier 	int	min;
3173e12c5d1SDavid du Colombier 	int	hour;
3183e12c5d1SDavid du Colombier 	int	mday;
3193e12c5d1SDavid du Colombier 	int	mon;
3203e12c5d1SDavid du Colombier 	int	year;
3213e12c5d1SDavid du Colombier 	int	wday;
3223e12c5d1SDavid du Colombier 	int	yday;
3233e12c5d1SDavid du Colombier 	char	zone[4];
3247dd7cddfSDavid du Colombier 	int	tzoff;
3253e12c5d1SDavid du Colombier } Tm;
3263e12c5d1SDavid du Colombier 
3273e12c5d1SDavid du Colombier extern	Tm*	gmtime(long);
3283e12c5d1SDavid du Colombier extern	Tm*	localtime(long);
3293e12c5d1SDavid du Colombier extern	char*	asctime(Tm*);
3303e12c5d1SDavid du Colombier extern	char*	ctime(long);
3313e12c5d1SDavid du Colombier extern	double	cputime(void);
3323e12c5d1SDavid du Colombier extern	long	times(long*);
3337dd7cddfSDavid du Colombier extern	long	tm2sec(Tm*);
3347dd7cddfSDavid du Colombier extern	vlong	nsec(void);
3353e12c5d1SDavid du Colombier 
336e288d156SDavid du Colombier extern	void	cycles(uvlong*);	/* 64-bit value of the cycle counter if there is one, 0 if there isn't */
337e288d156SDavid du Colombier 
3383e12c5d1SDavid du Colombier /*
339b928b27aSDavid du Colombier  * endian conversion
340b928b27aSDavid du Colombier  */
341b928b27aSDavid du Colombier extern u16int	le16get(uchar *t,  uchar **r);
342b928b27aSDavid du Colombier extern u32int	le24get(uchar *t,  uchar **r);
343b928b27aSDavid du Colombier extern u32int	le32get(uchar *t,  uchar **r);
344b928b27aSDavid du Colombier extern u64int	le64get(uchar *t,  uchar **r);
345b928b27aSDavid du Colombier extern uchar*	le16put(uchar *t, u16int r);
346b928b27aSDavid du Colombier extern uchar*	le24put(uchar *t, u32int r);
347b928b27aSDavid du Colombier extern uchar*	le32put(uchar *t, u32int r);
348b928b27aSDavid du Colombier extern uchar*	le64put(uchar *t, u64int r);
349b928b27aSDavid du Colombier extern u16int	be16get(uchar *t,  uchar **r);
350b928b27aSDavid du Colombier extern u32int	be24get(uchar *t,  uchar **r);
351b928b27aSDavid du Colombier extern u32int	be32get(uchar *t,  uchar **r);
352b928b27aSDavid du Colombier extern u64int	be64get(uchar *t,  uchar **r);
353b928b27aSDavid du Colombier extern uchar*	be16put(uchar *t, u16int r);
354b928b27aSDavid du Colombier extern uchar*	be24put(uchar *t, u32int r);
355b928b27aSDavid du Colombier extern uchar*	be32put(uchar *t, u32int r);
356b928b27aSDavid du Colombier extern uchar*	be64put(uchar *t, u64int r);
357b928b27aSDavid du Colombier 
358b928b27aSDavid du Colombier /*
3593e12c5d1SDavid du Colombier  * one-of-a-kind
3603e12c5d1SDavid du Colombier  */
361219b2ee8SDavid du Colombier enum
362219b2ee8SDavid du Colombier {
363219b2ee8SDavid du Colombier 	PNPROC		= 1,
364219b2ee8SDavid du Colombier 	PNGROUP		= 2,
365219b2ee8SDavid du Colombier };
3663e12c5d1SDavid du Colombier 
3677dd7cddfSDavid du Colombier extern	void	_assert(char*);
3683e12c5d1SDavid du Colombier extern	int	abs(int);
3693e12c5d1SDavid du Colombier extern	int	atexit(void(*)(void));
3703e12c5d1SDavid du Colombier extern	void	atexitdont(void(*)(void));
3713e12c5d1SDavid du Colombier extern	int	atnotify(int(*)(void*, char*), int);
3723e12c5d1SDavid du Colombier extern	double	atof(char*);
3733e12c5d1SDavid du Colombier extern	int	atoi(char*);
3743e12c5d1SDavid du Colombier extern	long	atol(char*);
3757dd7cddfSDavid du Colombier extern	vlong	atoll(char*);
3763e12c5d1SDavid du Colombier extern	double	charstod(int(*)(void*), void*);
3777dd7cddfSDavid du Colombier extern	char*	cleanname(char*);
3783e12c5d1SDavid du Colombier extern	int	decrypt(void*, void*, int);
3793e12c5d1SDavid du Colombier extern	int	encrypt(void*, void*, int);
3809a747e4fSDavid du Colombier extern	int	dec64(uchar*, int, char*, int);
3819a747e4fSDavid du Colombier extern	int	enc64(char*, int, uchar*, int);
3829a747e4fSDavid du Colombier extern	int	dec32(uchar*, int, char*, int);
3839a747e4fSDavid du Colombier extern	int	enc32(char*, int, uchar*, int);
3849a747e4fSDavid du Colombier extern	int	dec16(uchar*, int, char*, int);
3859a747e4fSDavid du Colombier extern	int	enc16(char*, int, uchar*, int);
3869a747e4fSDavid du Colombier extern	int	encodefmt(Fmt*);
3873e12c5d1SDavid du Colombier extern	void	exits(char*);
3883e12c5d1SDavid du Colombier extern	double	frexp(double, int*);
38974f16c81SDavid du Colombier extern	uintptr	getcallerpc(void*);
3903e12c5d1SDavid du Colombier extern	char*	getenv(char*);
3917dd7cddfSDavid du Colombier extern	int	getfields(char*, char**, int, int, char*);
3929a747e4fSDavid du Colombier extern	int	gettokens(char *, char **, int, char *);
3933e12c5d1SDavid du Colombier extern	char*	getuser(void);
3943e12c5d1SDavid du Colombier extern	char*	getwd(char*, int);
3959a747e4fSDavid du Colombier extern	int	iounit(int);
3963e12c5d1SDavid du Colombier extern	long	labs(long);
3973e12c5d1SDavid du Colombier extern	double	ldexp(double, int);
3983e12c5d1SDavid du Colombier extern	void	longjmp(jmp_buf, int);
3993e12c5d1SDavid du Colombier extern	char*	mktemp(char*);
4003e12c5d1SDavid du Colombier extern	double	modf(double, double*);
4013e12c5d1SDavid du Colombier extern	int	netcrypt(void*, void*);
4023e12c5d1SDavid du Colombier extern	void	notejmp(void*, jmp_buf, int);
4033e12c5d1SDavid du Colombier extern	void	perror(char*);
404219b2ee8SDavid du Colombier extern	int	postnote(int, int, char *);
4053e12c5d1SDavid du Colombier extern	double	pow10(int);
406*c3b00231SDavid du Colombier extern	void	procsetname(char*, ...);
4073e12c5d1SDavid du Colombier extern	int	putenv(char*, char*);
4083e12c5d1SDavid du Colombier extern	void	qsort(void*, long, long, int (*)(void*, void*));
4093e12c5d1SDavid du Colombier extern	int	setjmp(jmp_buf);
4103e12c5d1SDavid du Colombier extern	double	strtod(char*, char**);
4113e12c5d1SDavid du Colombier extern	long	strtol(char*, char**, int);
4123e12c5d1SDavid du Colombier extern	ulong	strtoul(char*, char**, int);
4137dd7cddfSDavid du Colombier extern	vlong	strtoll(char*, char**, int);
4147dd7cddfSDavid du Colombier extern	uvlong	strtoull(char*, char**, int);
4157dd7cddfSDavid du Colombier extern	void	sysfatal(char*, ...);
4167dd7cddfSDavid du Colombier #pragma	varargck	argpos	sysfatal	1
4173e12c5d1SDavid du Colombier extern	void	syslog(int, char*, char*, ...);
4187dd7cddfSDavid du Colombier #pragma	varargck	argpos	syslog	3
4193e12c5d1SDavid du Colombier extern	long	time(long*);
4203e12c5d1SDavid du Colombier extern	int	tolower(int);
4213e12c5d1SDavid du Colombier extern	int	toupper(int);
4223e12c5d1SDavid du Colombier 
4237dd7cddfSDavid du Colombier /*
424e288d156SDavid du Colombier  *  profiling
425e288d156SDavid du Colombier  */
426e288d156SDavid du Colombier enum {
427e288d156SDavid du Colombier 	Profoff,		/* No profiling */
428e288d156SDavid du Colombier 	Profuser,		/* Measure user time only (default) */
429e288d156SDavid du Colombier 	Profkernel,		/* Measure user + kernel time */
430e288d156SDavid du Colombier 	Proftime,		/* Measure total time */
431e288d156SDavid du Colombier 	Profsample,		/* Use clock interrupt to sample (default when there is no cycle counter) */
432e288d156SDavid du Colombier }; /* what */
433e288d156SDavid du Colombier extern	void	prof(void (*fn)(void*), void *arg, int entries, int what);
434e288d156SDavid du Colombier 
435e288d156SDavid du Colombier /*
43651f48f69SDavid du Colombier  * atomic
43751f48f69SDavid du Colombier  */
43851f48f69SDavid du Colombier long	ainc(long*);
43951f48f69SDavid du Colombier long	adec(long*);
44051f48f69SDavid du Colombier int	cas32(u32int*, u32int, u32int);
44151f48f69SDavid du Colombier int	casp(void**, void*, void*);
44251f48f69SDavid du Colombier int	casl(ulong*, ulong, ulong);
44351f48f69SDavid du Colombier 
44451f48f69SDavid du Colombier /*
4457dd7cddfSDavid du Colombier  *  synchronization
4467dd7cddfSDavid du Colombier  */
4477dd7cddfSDavid du Colombier typedef
4487dd7cddfSDavid du Colombier struct Lock {
44951f48f69SDavid du Colombier 	long	key;
45051f48f69SDavid du Colombier 	long	sem;
4517dd7cddfSDavid du Colombier } Lock;
4527dd7cddfSDavid du Colombier 
4537dd7cddfSDavid du Colombier extern int	_tas(int*);
4547dd7cddfSDavid du Colombier 
4557dd7cddfSDavid du Colombier extern	void	lock(Lock*);
4567dd7cddfSDavid du Colombier extern	void	unlock(Lock*);
4577dd7cddfSDavid du Colombier extern	int	canlock(Lock*);
4587dd7cddfSDavid du Colombier 
4597dd7cddfSDavid du Colombier typedef struct QLp QLp;
4607dd7cddfSDavid du Colombier struct QLp
4617dd7cddfSDavid du Colombier {
4627dd7cddfSDavid du Colombier 	int	inuse;
4637dd7cddfSDavid du Colombier 	QLp	*next;
4647dd7cddfSDavid du Colombier 	char	state;
4657dd7cddfSDavid du Colombier };
4667dd7cddfSDavid du Colombier 
4677dd7cddfSDavid du Colombier typedef
4687dd7cddfSDavid du Colombier struct QLock
4697dd7cddfSDavid du Colombier {
4707dd7cddfSDavid du Colombier 	Lock	lock;
4717dd7cddfSDavid du Colombier 	int	locked;
4727dd7cddfSDavid du Colombier 	QLp	*head;
4737dd7cddfSDavid du Colombier 	QLp 	*tail;
4747dd7cddfSDavid du Colombier } QLock;
4757dd7cddfSDavid du Colombier 
4767dd7cddfSDavid du Colombier extern	void	qlock(QLock*);
4777dd7cddfSDavid du Colombier extern	void	qunlock(QLock*);
4787dd7cddfSDavid du Colombier extern	int	canqlock(QLock*);
47974f16c81SDavid du Colombier extern	void	_qlockinit(void* (*)(void*, void*));	/* called only by the thread library */
4807dd7cddfSDavid du Colombier 
4817dd7cddfSDavid du Colombier typedef
4827dd7cddfSDavid du Colombier struct RWLock
4837dd7cddfSDavid du Colombier {
4847dd7cddfSDavid du Colombier 	Lock	lock;
4857dd7cddfSDavid du Colombier 	int	readers;	/* number of readers */
4867dd7cddfSDavid du Colombier 	int	writer;		/* number of writers */
4877dd7cddfSDavid du Colombier 	QLp	*head;		/* list of waiting processes */
4887dd7cddfSDavid du Colombier 	QLp	*tail;
4897dd7cddfSDavid du Colombier } RWLock;
4907dd7cddfSDavid du Colombier 
4917dd7cddfSDavid du Colombier extern	void	rlock(RWLock*);
4927dd7cddfSDavid du Colombier extern	void	runlock(RWLock*);
4935d459b5aSDavid du Colombier extern	int	canrlock(RWLock*);
4947dd7cddfSDavid du Colombier extern	void	wlock(RWLock*);
4957dd7cddfSDavid du Colombier extern	void	wunlock(RWLock*);
4965d459b5aSDavid du Colombier extern	int	canwlock(RWLock*);
4973e12c5d1SDavid du Colombier 
498679c15e8SDavid du Colombier typedef
499679c15e8SDavid du Colombier struct Rendez
500679c15e8SDavid du Colombier {
501679c15e8SDavid du Colombier 	QLock	*l;
502679c15e8SDavid du Colombier 	QLp	*head;
503679c15e8SDavid du Colombier 	QLp	*tail;
504679c15e8SDavid du Colombier } Rendez;
505679c15e8SDavid du Colombier 
506679c15e8SDavid du Colombier extern	void	rsleep(Rendez*);	/* unlocks r->l, sleeps, locks r->l again */
507679c15e8SDavid du Colombier extern	int	rwakeup(Rendez*);
508679c15e8SDavid du Colombier extern	int	rwakeupall(Rendez*);
50980ee5cbfSDavid du Colombier extern	void**	privalloc(void);
51080ee5cbfSDavid du Colombier extern	void	privfree(void**);
51180ee5cbfSDavid du Colombier 
5123e12c5d1SDavid du Colombier /*
5139a747e4fSDavid du Colombier  *  network dialing
5143e12c5d1SDavid du Colombier  */
5153e12c5d1SDavid du Colombier #define NETPATHLEN 40
5163e12c5d1SDavid du Colombier extern	int	accept(int, char*);
5173e12c5d1SDavid du Colombier extern	int	announce(char*, char*);
5183e12c5d1SDavid du Colombier extern	int	dial(char*, char*, char*, int*);
5197dd7cddfSDavid du Colombier extern	void	setnetmtpt(char*, int, char*);
5203e12c5d1SDavid du Colombier extern	int	hangup(int);
5213e12c5d1SDavid du Colombier extern	int	listen(char*, char*);
5223e12c5d1SDavid du Colombier extern	char*	netmkaddr(char*, char*, char*);
5233e12c5d1SDavid du Colombier extern	int	reject(int, char*, char*);
5249a747e4fSDavid du Colombier 
5259a747e4fSDavid du Colombier /*
5269a747e4fSDavid du Colombier  *  encryption
5279a747e4fSDavid du Colombier  */
5287dd7cddfSDavid du Colombier extern	int	pushssl(int, char*, char*, char*, int*);
5299a747e4fSDavid du Colombier extern	int	pushtls(int, char*, char*, int, char*, char*);
5309a747e4fSDavid du Colombier 
5319a747e4fSDavid du Colombier /*
5329a747e4fSDavid du Colombier  *  network services
5339a747e4fSDavid du Colombier  */
5349a747e4fSDavid du Colombier typedef struct NetConnInfo NetConnInfo;
5359a747e4fSDavid du Colombier struct NetConnInfo
5369a747e4fSDavid du Colombier {
5379a747e4fSDavid du Colombier 	char	*dir;		/* connection directory */
5389a747e4fSDavid du Colombier 	char	*root;		/* network root */
5399a747e4fSDavid du Colombier 	char	*spec;		/* binding spec */
5409a747e4fSDavid du Colombier 	char	*lsys;		/* local system */
5419a747e4fSDavid du Colombier 	char	*lserv;		/* local service */
5429a747e4fSDavid du Colombier 	char	*rsys;		/* remote system */
5439a747e4fSDavid du Colombier 	char	*rserv;		/* remote service */
54413c0d2ddSDavid du Colombier 	char	*laddr;		/* local address */
54513c0d2ddSDavid du Colombier 	char	*raddr;		/* remote address */
5469a747e4fSDavid du Colombier };
5479a747e4fSDavid du Colombier extern	NetConnInfo*	getnetconninfo(char*, int);
5489a747e4fSDavid du Colombier extern	void		freenetconninfo(NetConnInfo*);
5493e12c5d1SDavid du Colombier 
5503e12c5d1SDavid du Colombier /*
5513e12c5d1SDavid du Colombier  * system calls
5523e12c5d1SDavid du Colombier  *
5533e12c5d1SDavid du Colombier  */
5549a747e4fSDavid du Colombier #define	STATMAX	65535U	/* max length of machine-independent stat structure */
5559a747e4fSDavid du Colombier #define	DIRMAX	(sizeof(Dir)+STATMAX)	/* max length of Dir structure */
5569a747e4fSDavid du Colombier #define	ERRMAX	128	/* max length of error string */
5573e12c5d1SDavid du Colombier 
5583e12c5d1SDavid du Colombier #define	MORDER	0x0003	/* mask for bits defining order of mounting */
5593e12c5d1SDavid du Colombier #define	MREPL	0x0000	/* mount replaces object */
5603e12c5d1SDavid du Colombier #define	MBEFORE	0x0001	/* mount goes before others in union directory */
5613e12c5d1SDavid du Colombier #define	MAFTER	0x0002	/* mount goes after others in union directory */
5623e12c5d1SDavid du Colombier #define	MCREATE	0x0004	/* permit creation in mounted directory */
5637dd7cddfSDavid du Colombier #define	MCACHE	0x0010	/* cache some data */
5649a747e4fSDavid du Colombier #define	MMASK	0x0017	/* all bits on */
5653e12c5d1SDavid du Colombier 
5663e12c5d1SDavid du Colombier #define	OREAD	0	/* open for read */
5673e12c5d1SDavid du Colombier #define	OWRITE	1	/* write */
5683e12c5d1SDavid du Colombier #define	ORDWR	2	/* read and write */
5693e12c5d1SDavid du Colombier #define	OEXEC	3	/* execute, == read but check execute permission */
5703e12c5d1SDavid du Colombier #define	OTRUNC	16	/* or'ed in (except for exec), truncate file first */
5713e12c5d1SDavid du Colombier #define	OCEXEC	32	/* or'ed in, close on exec */
5723e12c5d1SDavid du Colombier #define	ORCLOSE	64	/* or'ed in, remove on close */
5739a747e4fSDavid du Colombier #define	OEXCL	0x1000	/* or'ed in, exclusive use (create only) */
57451f48f69SDavid du Colombier // #define	OBEHIND	0x2000	/* use write behind for writes [for 9n] */
5757dd7cddfSDavid du Colombier 
5767dd7cddfSDavid du Colombier #define	AEXIST	0	/* accessible: exists */
5777dd7cddfSDavid du Colombier #define	AEXEC	1	/* execute access */
5787dd7cddfSDavid du Colombier #define	AWRITE	2	/* write access */
5797dd7cddfSDavid du Colombier #define	AREAD	4	/* read access */
5803e12c5d1SDavid du Colombier 
581219b2ee8SDavid du Colombier /* Segattch */
582219b2ee8SDavid du Colombier #define	SG_RONLY	0040	/* read only */
583219b2ee8SDavid du Colombier #define	SG_CEXEC	0100	/* detach on exec */
584219b2ee8SDavid du Colombier 
5853e12c5d1SDavid du Colombier #define	NCONT	0	/* continue after note */
5863e12c5d1SDavid du Colombier #define	NDFLT	1	/* terminate after note */
587219b2ee8SDavid du Colombier #define	NSAVE	2	/* clear note but hold state */
588219b2ee8SDavid du Colombier #define	NRSTR	3	/* restore saved state */
5893e12c5d1SDavid du Colombier 
5909a747e4fSDavid du Colombier /* bits in Qid.type */
5919a747e4fSDavid du Colombier #define QTDIR		0x80		/* type bit for directories */
5929a747e4fSDavid du Colombier #define QTAPPEND	0x40		/* type bit for append only files */
5939a747e4fSDavid du Colombier #define QTEXCL		0x20		/* type bit for exclusive use files */
5949a747e4fSDavid du Colombier #define QTMOUNT		0x10		/* type bit for mounted channel */
5959a747e4fSDavid du Colombier #define QTAUTH		0x08		/* type bit for authentication file */
596e44fe4caSDavid du Colombier #define QTTMP		0x04		/* type bit for not-backed-up file */
5979a747e4fSDavid du Colombier #define QTFILE		0x00		/* plain file */
5989a747e4fSDavid du Colombier 
5999a747e4fSDavid du Colombier /* bits in Dir.mode */
6009a747e4fSDavid du Colombier #define DMDIR		0x80000000	/* mode bit for directories */
6019a747e4fSDavid du Colombier #define DMAPPEND	0x40000000	/* mode bit for append only files */
6029a747e4fSDavid du Colombier #define DMEXCL		0x20000000	/* mode bit for exclusive use files */
6039a747e4fSDavid du Colombier #define DMMOUNT		0x10000000	/* mode bit for mounted channel */
6049a747e4fSDavid du Colombier #define DMAUTH		0x08000000	/* mode bit for authentication file */
605e44fe4caSDavid du Colombier #define DMTMP		0x04000000	/* mode bit for non-backed-up files */
6069a747e4fSDavid du Colombier #define DMREAD		0x4		/* mode bit for read permission */
6079a747e4fSDavid du Colombier #define DMWRITE		0x2		/* mode bit for write permission */
6089a747e4fSDavid du Colombier #define DMEXEC		0x1		/* mode bit for execute permission */
6093e12c5d1SDavid du Colombier 
6103e12c5d1SDavid du Colombier /* rfork */
6113e12c5d1SDavid du Colombier enum
6123e12c5d1SDavid du Colombier {
6133e12c5d1SDavid du Colombier 	RFNAMEG		= (1<<0),
6143e12c5d1SDavid du Colombier 	RFENVG		= (1<<1),
6153e12c5d1SDavid du Colombier 	RFFDG		= (1<<2),
6163e12c5d1SDavid du Colombier 	RFNOTEG		= (1<<3),
6173e12c5d1SDavid du Colombier 	RFPROC		= (1<<4),
6183e12c5d1SDavid du Colombier 	RFMEM		= (1<<5),
6193e12c5d1SDavid du Colombier 	RFNOWAIT	= (1<<6),
6203e12c5d1SDavid du Colombier 	RFCNAMEG	= (1<<10),
6213e12c5d1SDavid du Colombier 	RFCENVG		= (1<<11),
6227dd7cddfSDavid du Colombier 	RFCFDG		= (1<<12),
6237dd7cddfSDavid du Colombier 	RFREND		= (1<<13),
6247dd7cddfSDavid du Colombier 	RFNOMNT		= (1<<14)
6253e12c5d1SDavid du Colombier };
6263e12c5d1SDavid du Colombier 
6273e12c5d1SDavid du Colombier typedef
6283e12c5d1SDavid du Colombier struct Qid
6293e12c5d1SDavid du Colombier {
6309a747e4fSDavid du Colombier 	uvlong	path;
6313e12c5d1SDavid du Colombier 	ulong	vers;
6329a747e4fSDavid du Colombier 	uchar	type;
6333e12c5d1SDavid du Colombier } Qid;
6343e12c5d1SDavid du Colombier 
6353e12c5d1SDavid du Colombier typedef
6369a747e4fSDavid du Colombier struct Dir {
6379a747e4fSDavid du Colombier 	/* system-modified data */
6389a747e4fSDavid du Colombier 	ushort	type;	/* server type */
6399a747e4fSDavid du Colombier 	uint	dev;	/* server subtype */
6409a747e4fSDavid du Colombier 	/* file data */
6419a747e4fSDavid du Colombier 	Qid	qid;	/* unique id from server */
6429a747e4fSDavid du Colombier 	ulong	mode;	/* permissions */
6439a747e4fSDavid du Colombier 	ulong	atime;	/* last read time */
6449a747e4fSDavid du Colombier 	ulong	mtime;	/* last write time */
6459a747e4fSDavid du Colombier 	vlong	length;	/* file length */
6469a747e4fSDavid du Colombier 	char	*name;	/* last element of path */
6479a747e4fSDavid du Colombier 	char	*uid;	/* owner name */
6489a747e4fSDavid du Colombier 	char	*gid;	/* group name */
6499a747e4fSDavid du Colombier 	char	*muid;	/* last modifier name */
6503e12c5d1SDavid du Colombier } Dir;
6513e12c5d1SDavid du Colombier 
6529a747e4fSDavid du Colombier /* keep /sys/src/ape/lib/ap/plan9/sys9.h in sync with this -rsc */
6533e12c5d1SDavid du Colombier typedef
6543e12c5d1SDavid du Colombier struct Waitmsg
6553e12c5d1SDavid du Colombier {
6569a747e4fSDavid du Colombier 	int	pid;		/* of loved one */
6579a747e4fSDavid du Colombier 	ulong	time[3];	/* of loved one & descendants */
6589a747e4fSDavid du Colombier 	char	*msg;
6593e12c5d1SDavid du Colombier } Waitmsg;
6603e12c5d1SDavid du Colombier 
6619a747e4fSDavid du Colombier typedef
6629a747e4fSDavid du Colombier struct IOchunk
6639a747e4fSDavid du Colombier {
6649a747e4fSDavid du Colombier 	void	*addr;
6659a747e4fSDavid du Colombier 	ulong	len;
6669a747e4fSDavid du Colombier } IOchunk;
6679a747e4fSDavid du Colombier 
6683e12c5d1SDavid du Colombier extern	void	_exits(char*);
6693e12c5d1SDavid du Colombier 
6703e12c5d1SDavid du Colombier extern	void	abort(void);
6713e12c5d1SDavid du Colombier extern	int	access(char*, int);
6723e12c5d1SDavid du Colombier extern	long	alarm(ulong);
6739a747e4fSDavid du Colombier extern	int	await(char*, int);
6743e12c5d1SDavid du Colombier extern	int	bind(char*, char*, int);
6753e12c5d1SDavid du Colombier extern	int	brk(void*);
6763e12c5d1SDavid du Colombier extern	int	chdir(char*);
6773e12c5d1SDavid du Colombier extern	int	close(int);
6783e12c5d1SDavid du Colombier extern	int	create(char*, int, ulong);
6793e12c5d1SDavid du Colombier extern	int	dup(int, int);
6809a747e4fSDavid du Colombier extern	int	errstr(char*, uint);
6813e12c5d1SDavid du Colombier extern	int	exec(char*, char*[]);
6823e12c5d1SDavid du Colombier extern	int	execl(char*, ...);
6833e12c5d1SDavid du Colombier extern	int	fork(void);
6843e12c5d1SDavid du Colombier extern	int	rfork(int);
685219b2ee8SDavid du Colombier extern	int	fauth(int, char*);
6869a747e4fSDavid du Colombier extern	int	fstat(int, uchar*, int);
6879a747e4fSDavid du Colombier extern	int	fwstat(int, uchar*, int);
6889a747e4fSDavid du Colombier extern	int	fversion(int, int, char*, int);
6899a747e4fSDavid du Colombier extern	int	mount(int, int, char*, int, char*);
6903e12c5d1SDavid du Colombier extern	int	unmount(char*, char*);
6913e12c5d1SDavid du Colombier extern	int	noted(int);
6923e12c5d1SDavid du Colombier extern	int	notify(void(*)(void*, char*));
6933e12c5d1SDavid du Colombier extern	int	open(char*, int);
6947dd7cddfSDavid du Colombier extern	int	fd2path(int, char*, int);
69551f48f69SDavid du Colombier // extern	int	fdflush(int);
6963e12c5d1SDavid du Colombier extern	int	pipe(int*);
69780ee5cbfSDavid du Colombier extern	long	pread(int, void*, long, vlong);
6989a747e4fSDavid du Colombier extern	long	preadv(int, IOchunk*, int, vlong);
69980ee5cbfSDavid du Colombier extern	long	pwrite(int, void*, long, vlong);
7009a747e4fSDavid du Colombier extern	long	pwritev(int, IOchunk*, int, vlong);
7013e12c5d1SDavid du Colombier extern	long	read(int, void*, long);
702219b2ee8SDavid du Colombier extern	long	readn(int, void*, long);
7039a747e4fSDavid du Colombier extern	long	readv(int, IOchunk*, int);
7043e12c5d1SDavid du Colombier extern	int	remove(char*);
7053e12c5d1SDavid du Colombier extern	void*	sbrk(ulong);
7067dd7cddfSDavid du Colombier extern	long	oseek(int, long, int);
7077dd7cddfSDavid du Colombier extern	vlong	seek(int, vlong, int);
70874f16c81SDavid du Colombier extern	void*	segattach(int, char*, void*, ulong);
70974f16c81SDavid du Colombier extern	void*	segbrk(void*, void*);
7103e12c5d1SDavid du Colombier extern	int	segdetach(void*);
7113e12c5d1SDavid du Colombier extern	int	segflush(void*, ulong);
7123e12c5d1SDavid du Colombier extern	int	segfree(void*, ulong);
7133c2ddefeSDavid du Colombier extern	int	semacquire(long*, int);
7143c2ddefeSDavid du Colombier extern	long	semrelease(long*, long);
7153e12c5d1SDavid du Colombier extern	int	sleep(long);
7169a747e4fSDavid du Colombier extern	int	stat(char*, uchar*, int);
71709525e75SDavid du Colombier extern	int	tsemacquire(long*, ulong);
7189a747e4fSDavid du Colombier extern	Waitmsg*	wait(void);
7199a747e4fSDavid du Colombier extern	int	waitpid(void);
7203e12c5d1SDavid du Colombier extern	long	write(int, void*, long);
7219a747e4fSDavid du Colombier extern	long	writev(int, IOchunk*, int);
7229a747e4fSDavid du Colombier extern	int	wstat(char*, uchar*, int);
72374f16c81SDavid du Colombier extern	void*	rendezvous(void*, void*);
7243e12c5d1SDavid du Colombier 
7259a747e4fSDavid du Colombier extern	Dir*	dirstat(char*);
7269a747e4fSDavid du Colombier extern	Dir*	dirfstat(int);
7273e12c5d1SDavid du Colombier extern	int	dirwstat(char*, Dir*);
7283e12c5d1SDavid du Colombier extern	int	dirfwstat(int, Dir*);
7299a747e4fSDavid du Colombier extern	long	dirread(int, Dir**);
7309a747e4fSDavid du Colombier extern	void	nulldir(Dir*);
7319a747e4fSDavid du Colombier extern	long	dirreadall(int, Dir**);
7323e12c5d1SDavid du Colombier extern	int	getpid(void);
7333e12c5d1SDavid du Colombier extern	int	getppid(void);
7349a747e4fSDavid du Colombier extern	void	rerrstr(char*, uint);
7357dd7cddfSDavid du Colombier extern	char*	sysname(void);
736219b2ee8SDavid du Colombier extern	void	werrstr(char*, ...);
7377dd7cddfSDavid du Colombier #pragma	varargck	argpos	werrstr	1
7383e12c5d1SDavid du Colombier 
7393e12c5d1SDavid du Colombier extern char *argv0;
7407dd7cddfSDavid du Colombier #define	ARGBEGIN	for((argv0||(argv0=*argv)),argv++,argc--;\
7413e12c5d1SDavid du Colombier 			    argv[0] && argv[0][0]=='-' && argv[0][1];\
7423e12c5d1SDavid du Colombier 			    argc--, argv++) {\
7433e12c5d1SDavid du Colombier 				char *_args, *_argt;\
7443e12c5d1SDavid du Colombier 				Rune _argc;\
7453e12c5d1SDavid du Colombier 				_args = &argv[0][1];\
7463e12c5d1SDavid du Colombier 				if(_args[0]=='-' && _args[1]==0){\
7473e12c5d1SDavid du Colombier 					argc--; argv++; break;\
7483e12c5d1SDavid du Colombier 				}\
7493e12c5d1SDavid du Colombier 				_argc = 0;\
7503e12c5d1SDavid du Colombier 				while(*_args && (_args += chartorune(&_argc, _args)))\
7513e12c5d1SDavid du Colombier 				switch(_argc)
7523e12c5d1SDavid du Colombier #define	ARGEND		SET(_argt);USED(_argt,_argc,_args);}USED(argv, argc);
7533e12c5d1SDavid du Colombier #define	ARGF()		(_argt=_args, _args="",\
7543e12c5d1SDavid du Colombier 				(*_argt? _argt: argv[1]? (argc--, *++argv): 0))
75559cc4ca5SDavid du Colombier #define	EARGF(x)	(_argt=_args, _args="",\
75659cc4ca5SDavid du Colombier 				(*_argt? _argt: argv[1]? (argc--, *++argv): ((x), abort(), (char*)0)))
75759cc4ca5SDavid du Colombier 
7583e12c5d1SDavid du Colombier #define	ARGC()		_argc
7597dd7cddfSDavid du Colombier 
7607dd7cddfSDavid du Colombier /* this is used by sbrk and brk,  it's a really bad idea to redefine it */
7617dd7cddfSDavid du Colombier extern	char	end[];
762