plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

libc.h (24968B)


      1 // This file originated as Plan 9's /sys/include/libc.h.
      2 // The plan9port-specific changes may be distributed
      3 // using the license in ../src/lib9/LICENSE.
      4 
      5 /*
      6  * Lib9 is miscellany from the Plan 9 C library that doesn't
      7  * fit into libutf or into libfmt, but is still missing from traditional
      8  * Unix C libraries.
      9  */
     10 #ifndef _LIBC_H_
     11 #define _LIBC_H_ 1
     12 #if defined(__cplusplus)
     13 extern "C" {
     14 #endif
     15 
     16 #include <utf.h>
     17 #include <fmt.h>
     18 
     19 /*
     20  * Begin usual libc.h
     21  */
     22 
     23 #ifndef nil
     24 #define	nil	((void*)0)
     25 #endif
     26 #define	nelem(x)	(sizeof(x)/sizeof((x)[0]))
     27 
     28 #ifndef offsetof
     29 #define offsetof(s, m)	(ulong)(&(((s*)0)->m))
     30 #endif
     31 
     32 /*
     33  * mem routines (provided by system <string.h>)
     34  *
     35 extern	void*	memccpy(void*, void*, int, ulong);
     36 extern	void*	memset(void*, int, ulong);
     37 extern	int	memcmp(void*, void*, ulong);
     38 extern	void*	memcpy(void*, void*, ulong);
     39 extern	void*	memmove(void*, void*, ulong);
     40 extern	void*	memchr(void*, int, ulong);
     41  */
     42 
     43 /*
     44  * string routines (provided by system <string.h>)
     45  *
     46 extern	char*	strcat(char*, char*);
     47 extern	char*	strchr(char*, int);
     48 extern	int	strcmp(char*, char*);
     49 extern	char*	strcpy(char*, char*);
     50  */
     51 extern	char*	strecpy(char*, char*, char*);
     52 extern	char*	p9strdup(char*);
     53 /*
     54 extern	char*	strncat(char*, char*, long);
     55 extern	char*	strncpy(char*, char*, long);
     56 extern	int	strncmp(char*, char*, long);
     57 extern	char*	strpbrk(char*, char*);
     58 extern	char*	strrchr(char*, int);
     59 extern	char*	strtok(char*, char*);
     60 extern	long	strlen(char*);
     61 extern	long	strspn(char*, char*);
     62 extern	long	strcspn(char*, char*);
     63 extern	char*	strstr(char*, char*);
     64  */
     65 extern	int	cistrncmp(char*, char*, int);
     66 extern	int	cistrcmp(char*, char*);
     67 extern	char*	cistrstr(char*, char*);
     68 extern	int	tokenize(char*, char**, int);
     69 
     70 /*
     71 enum
     72 {
     73 	UTFmax		= 4,
     74 	Runesync	= 0x80,
     75 	Runeself	= 0x80,
     76 	Runeerror	= 0xFFFD,
     77 	Runemax	= 0x10FFFF,
     78 };
     79 */
     80 
     81 /*
     82  * rune routines (provided by <utf.h>
     83  *
     84 extern	int	runetochar(char*, Rune*);
     85 extern	int	chartorune(Rune*, char*);
     86 extern	int	runelen(long);
     87 extern	int	runenlen(Rune*, int);
     88 extern	int	fullrune(char*, int);
     89 extern	int	utflen(char*);
     90 extern	int	utfnlen(char*, long);
     91 extern	char*	utfrune(char*, long);
     92 extern	char*	utfrrune(char*, long);
     93 extern	char*	utfutf(char*, char*);
     94 extern	char*	utfecpy(char*, char*, char*);
     95 
     96 extern	Rune*	runestrcat(Rune*, Rune*);
     97 extern	Rune*	runestrchr(Rune*, Rune);
     98 extern	int	runestrcmp(Rune*, Rune*);
     99 extern	Rune*	runestrcpy(Rune*, Rune*);
    100 extern	Rune*	runestrncpy(Rune*, Rune*, long);
    101 extern	Rune*	runestrecpy(Rune*, Rune*, Rune*);
    102 extern	Rune*	runestrdup(Rune*);
    103 extern	Rune*	runestrncat(Rune*, Rune*, long);
    104 extern	int	runestrncmp(Rune*, Rune*, long);
    105 extern	Rune*	runestrrchr(Rune*, Rune);
    106 extern	long	runestrlen(Rune*);
    107 extern	Rune*	runestrstr(Rune*, Rune*);
    108 
    109 extern	Rune	tolowerrune(Rune);
    110 extern	Rune	totitlerune(Rune);
    111 extern	Rune	toupperrune(Rune);
    112 extern	int	isalpharune(Rune);
    113 extern	int	islowerrune(Rune);
    114 extern	int	isspacerune(Rune);
    115 extern	int	istitlerune(Rune);
    116 extern	int	isupperrune(Rune);
    117  */
    118 
    119 /*
    120  * malloc (provied by system <stdlib.h>)
    121  *
    122 extern	void*	malloc(ulong);
    123  */
    124 extern	void*	p9malloc(ulong);
    125 extern	void*	mallocz(ulong, int);
    126 extern	void	p9free(void*);
    127 extern	void*	p9calloc(ulong, ulong);
    128 extern	void*	p9realloc(void*, ulong);
    129 extern	void		setmalloctag(void*, ulong);
    130 extern	void		setrealloctag(void*, ulong);
    131 extern	ulong	getmalloctag(void*);
    132 extern	ulong	getrealloctag(void*);
    133 /*
    134 extern	void*	malloctopoolblock(void*);
    135 */
    136 #ifndef NOPLAN9DEFINES
    137 #define	malloc	p9malloc
    138 #define	realloc	p9realloc
    139 #define	calloc	p9calloc
    140 #define	free	p9free
    141 #undef strdup
    142 #define	strdup	p9strdup
    143 #endif
    144 
    145 /*
    146  * print routines (provided by <fmt.h>)
    147  *
    148 typedef struct Fmt	Fmt;
    149 struct Fmt{
    150 	uchar	runes;
    151 	void	*start;
    152 	void	*to;
    153 	void	*stop;
    154 	int	(*flush)(Fmt *);
    155 	void	*farg;
    156 	int	nfmt;
    157 	va_list	args;
    158 	int	r;
    159 	int	width;
    160 	int	prec;
    161 	ulong	flags;
    162 };
    163 
    164 enum{
    165 	FmtWidth	= 1,
    166 	FmtLeft		= FmtWidth << 1,
    167 	FmtPrec		= FmtLeft << 1,
    168 	FmtSharp	= FmtPrec << 1,
    169 	FmtSpace	= FmtSharp << 1,
    170 	FmtSign		= FmtSpace << 1,
    171 	FmtZero		= FmtSign << 1,
    172 	FmtUnsigned	= FmtZero << 1,
    173 	FmtShort	= FmtUnsigned << 1,
    174 	FmtLong		= FmtShort << 1,
    175 	FmtVLong	= FmtLong << 1,
    176 	FmtComma	= FmtVLong << 1,
    177 	FmtByte	= FmtComma << 1,
    178 
    179 	FmtFlag		= FmtByte << 1
    180 };
    181 
    182 extern	int	print(char*, ...);
    183 extern	char*	seprint(char*, char*, char*, ...);
    184 extern	char*	vseprint(char*, char*, char*, va_list);
    185 extern	int	snprint(char*, int, char*, ...);
    186 extern	int	vsnprint(char*, int, char*, va_list);
    187 extern	char*	smprint(char*, ...);
    188 extern	char*	vsmprint(char*, va_list);
    189 extern	int	sprint(char*, char*, ...);
    190 extern	int	fprint(int, char*, ...);
    191 extern	int	vfprint(int, char*, va_list);
    192 
    193 extern	int	runesprint(Rune*, char*, ...);
    194 extern	int	runesnprint(Rune*, int, char*, ...);
    195 extern	int	runevsnprint(Rune*, int, char*, va_list);
    196 extern	Rune*	runeseprint(Rune*, Rune*, char*, ...);
    197 extern	Rune*	runevseprint(Rune*, Rune*, char*, va_list);
    198 extern	Rune*	runesmprint(char*, ...);
    199 extern	Rune*	runevsmprint(char*, va_list);
    200 
    201 extern	int	fmtfdinit(Fmt*, int, char*, int);
    202 extern	int	fmtfdflush(Fmt*);
    203 extern	int	fmtstrinit(Fmt*);
    204 extern	char*	fmtstrflush(Fmt*);
    205 extern	int	runefmtstrinit(Fmt*);
    206 extern	Rune*	runefmtstrflush(Fmt*);
    207 
    208 extern	int	fmtinstall(int, int (*)(Fmt*));
    209 extern	int	dofmt(Fmt*, char*);
    210 extern	int	dorfmt(Fmt*, Rune*);
    211 extern	int	fmtprint(Fmt*, char*, ...);
    212 extern	int	fmtvprint(Fmt*, char*, va_list);
    213 extern	int	fmtrune(Fmt*, int);
    214 extern	int	fmtstrcpy(Fmt*, char*);
    215 extern	int	fmtrunestrcpy(Fmt*, Rune*);
    216  */
    217 
    218 /*
    219  * error string for %r
    220  * supplied on per os basis, not part of fmt library
    221  *
    222  * (provided by lib9, but declared in fmt.h)
    223  *
    224 extern	int	errfmt(Fmt *f);
    225  */
    226 
    227 /*
    228  * quoted strings
    229  */
    230 extern	char	*unquotestrdup(char*);
    231 extern	Rune	*unquoterunestrdup(Rune*);
    232 extern	char	*quotestrdup(char*);
    233 extern	Rune	*quoterunestrdup(Rune*);
    234 /*
    235  * in fmt.h
    236  *
    237 extern	void	quotefmtinstall(void);
    238 extern	int	quotestrfmt(Fmt*);
    239 extern	int	quoterunestrfmt(Fmt*);
    240  */
    241 #ifndef NOPLAN9DEFINES
    242 #define doquote fmtdoquote
    243 #endif
    244 extern	int	needsrcquote(int);
    245 
    246 /*
    247  * random number
    248  */
    249 extern	void	p9srand(long);
    250 extern	int	p9rand(void);
    251 
    252 extern	int	p9nrand(int);
    253 extern	long	p9lrand(void);
    254 extern	long	p9lnrand(long);
    255 extern	double	p9frand(void);
    256 extern	ulong	truerand(void);			/* uses /dev/random */
    257 extern	ulong	ntruerand(ulong);		/* uses /dev/random */
    258 
    259 #ifndef NOPLAN9DEFINES
    260 #define	srand	p9srand
    261 #define	rand	p9rand
    262 #define	nrand	p9nrand
    263 #define	lrand	p9lrand
    264 #define	lnrand	p9lnrand
    265 #define	frand	p9frand
    266 #endif
    267 
    268 /*
    269  * math
    270  */
    271 extern	ulong	getfcr(void);
    272 extern	void	setfsr(ulong);
    273 extern	ulong	getfsr(void);
    274 extern	void	setfcr(ulong);
    275 extern	double	NaN(void);
    276 extern	double	Inf(int);
    277 extern	int	isNaN(double);
    278 extern	int	isInf(double, int);
    279 extern	ulong	umuldiv(ulong, ulong, ulong);
    280 extern	long	muldiv(long, long, long);
    281 
    282 /*
    283  * provided by math.h
    284  *
    285 extern	double	pow(double, double);
    286 extern	double	atan2(double, double);
    287 extern	double	fabs(double);
    288 extern	double	atan(double);
    289 extern	double	log(double);
    290 extern	double	log10(double);
    291 extern	double	exp(double);
    292 extern	double	floor(double);
    293 extern	double	ceil(double);
    294 extern	double	hypot(double, double);
    295 extern	double	sin(double);
    296 extern	double	cos(double);
    297 extern	double	tan(double);
    298 extern	double	asin(double);
    299 extern	double	acos(double);
    300 extern	double	sinh(double);
    301 extern	double	cosh(double);
    302 extern	double	tanh(double);
    303 extern	double	sqrt(double);
    304 extern	double	fmod(double, double);
    305 #define	HUGE	3.4028234e38
    306 #define	PIO2	1.570796326794896619231e0
    307 #define	PI	(PIO2+PIO2)
    308  */
    309 #define PI	M_PI
    310 #define	PIO2	M_PI_2
    311 
    312 /*
    313  * Time-of-day
    314  */
    315 
    316 typedef
    317 struct Tm
    318 {
    319 	int	sec;
    320 	int	min;
    321 	int	hour;
    322 	int	mday;
    323 	int	mon;
    324 	int	year;
    325 	int	wday;
    326 	int	yday;
    327 	char	zone[4];
    328 	int	tzoff;
    329 } Tm;
    330 
    331 extern	Tm*	p9gmtime(long);
    332 extern	Tm*	p9localtime(long);
    333 extern	char*	p9asctime(Tm*);
    334 extern	char*	p9ctime(long);
    335 extern	double	p9cputime(void);
    336 extern	long	p9times(long*);
    337 extern	long	p9tm2sec(Tm*);
    338 extern	vlong	p9nsec(void);
    339 
    340 #ifndef NOPLAN9DEFINES
    341 #define	gmtime		p9gmtime
    342 #define	localtime	p9localtime
    343 #define	asctime		p9asctime
    344 #define	ctime		p9ctime
    345 #define	cputime		p9cputime
    346 #define	times		p9times
    347 #define	tm2sec		p9tm2sec
    348 #define	nsec		p9nsec
    349 #endif
    350 
    351 /*
    352  * one-of-a-kind
    353  */
    354 enum
    355 {
    356 	PNPROC		= 1,
    357 	PNGROUP		= 2
    358 };
    359 
    360 /* extern	int	abs(int); <stdlib.h> */
    361 extern	int	p9atexit(void(*)(void));
    362 extern	void	p9atexitdont(void(*)(void));
    363 extern	int	atnotify(int(*)(void*, char*), int);
    364 /*
    365  * <stdlib.h>
    366 extern	double	atof(char*); <stdlib.h>
    367  */
    368 extern	int	p9atoi(char*);
    369 extern	long	p9atol(char*);
    370 extern	vlong	p9atoll(char*);
    371 extern	double	fmtcharstod(int(*)(void*), void*);
    372 extern	char*	cleanname(char*);
    373 extern	int	p9decrypt(void*, void*, int);
    374 extern	int	p9encrypt(void*, void*, int);
    375 extern	int	netcrypt(void*, void*);
    376 extern	int	dec64(uchar*, int, char*, int);
    377 extern	int	enc64(char*, int, uchar*, int);
    378 extern	int	dec32(uchar*, int, char*, int);
    379 extern	int	enc32(char*, int, uchar*, int);
    380 extern	int	dec16(uchar*, int, char*, int);
    381 extern	int	enc16(char*, int, uchar*, int);
    382 extern	int	encodefmt(Fmt*);
    383 extern	int	dirmodefmt(Fmt*);
    384 extern	int	exitcode(char*);
    385 extern	void	exits(char*);
    386 extern	double	p9frexp(double, int*);
    387 extern	ulong	getcallerpc(void*);
    388 #if defined(__GNUC__) || defined(__clang__) || defined(__IBMC__)
    389 #define getcallerpc(x) ((ulong)__builtin_return_address(0))
    390 #endif
    391 extern	char*	p9getenv(char*);
    392 extern	int	p9putenv(char*, char*);
    393 extern	int	getfields(char*, char**, int, int, char*);
    394 extern	int	gettokens(char *, char **, int, char *);
    395 extern	char*	getuser(void);
    396 extern	char*	p9getwd(char*, int);
    397 extern	int	iounit(int);
    398 /* extern	long	labs(long); <math.h> */
    399 /* extern	double	ldexp(double, int); <math.h> */
    400 extern	void	p9longjmp(p9jmp_buf, int);
    401 extern	char*	mktemp(char*);
    402 extern	int		opentemp(char*, int);
    403 /* extern	double	modf(double, double*); <math.h> */
    404 extern	void	p9notejmp(void*, p9jmp_buf, int);
    405 extern	void	perror(const char*);
    406 extern	int	postnote(int, int, char *);
    407 extern	double	p9pow10(int);
    408 /* extern	int	putenv(char*, char*); <stdlib.h. */
    409 /* extern	void	qsort(void*, long, long, int (*)(void*, void*)); <stdlib.h> */
    410 extern	char*	searchpath(char*);
    411 /* extern	int	p9setjmp(p9jmp_buf); */
    412 #define p9setjmp(b)	sigsetjmp((void*)(b), 1)
    413 /*
    414  * <stdlib.h>
    415 extern	long	strtol(char*, char**, int);
    416 extern	ulong	strtoul(char*, char**, int);
    417 extern	vlong	strtoll(char*, char**, int);
    418 extern	uvlong	strtoull(char*, char**, int);
    419  */
    420 extern	void	sysfatal(char*, ...);
    421 extern	void	p9syslog(int, char*, char*, ...);
    422 extern	long	p9time(long*);
    423 /* extern	int	tolower(int); <ctype.h> */
    424 /* extern	int	toupper(int); <ctype.h> */
    425 extern	void	needstack(int);
    426 extern	char*	readcons(char*, char*, int);
    427 
    428 extern	void	(*_pin)(void);
    429 extern	void	(*_unpin)(void);
    430 
    431 #ifndef NOPLAN9DEFINES
    432 #define atexit		p9atexit
    433 #define atexitdont	p9atexitdont
    434 #define atoi		p9atoi
    435 #define atol		p9atol
    436 #define atoll		p9atoll
    437 #define encrypt		p9encrypt
    438 #define decrypt		p9decrypt
    439 #undef frexp
    440 #define frexp		p9frexp
    441 #define getenv		p9getenv
    442 #define	getwd		p9getwd
    443 #define	longjmp		p9longjmp
    444 #undef  setjmp
    445 #define setjmp		p9setjmp
    446 #define putenv		p9putenv
    447 #define notejmp		p9notejmp
    448 #define jmp_buf		p9jmp_buf
    449 #define time		p9time
    450 #define pow10		p9pow10
    451 #define strtod		fmtstrtod
    452 #define charstod	fmtcharstod
    453 #define syslog		p9syslog
    454 #endif
    455 
    456 /*
    457  *  just enough information so that libc can be
    458  *  properly locked without dragging in all of libthread
    459  */
    460 typedef struct _Thread _Thread;
    461 typedef struct _Threadlist _Threadlist;
    462 struct _Threadlist
    463 {
    464 	_Thread	*head;
    465 	_Thread	*tail;
    466 };
    467 
    468 extern	_Thread	*(*threadnow)(void);
    469 
    470 /*
    471  *  synchronization
    472  */
    473 typedef struct Lock Lock;
    474 struct Lock
    475 {
    476 	int init;
    477 	pthread_mutex_t mutex;
    478 	int held;
    479 };
    480 
    481 extern	void	lock(Lock*);
    482 extern	void	unlock(Lock*);
    483 extern	int	canlock(Lock*);
    484 extern	int	(*_lock)(Lock*, int, ulong);
    485 extern	void	(*_unlock)(Lock*, ulong);
    486 
    487 typedef struct QLock QLock;
    488 struct QLock
    489 {
    490 	Lock		l;
    491 	_Thread	*owner;
    492 	_Threadlist	waiting;
    493 };
    494 
    495 extern	void	qlock(QLock*);
    496 extern	void	qunlock(QLock*);
    497 extern	int	canqlock(QLock*);
    498 extern	int	(*_qlock)(QLock*, int, ulong);	/* do not use */
    499 extern	void	(*_qunlock)(QLock*, ulong);
    500 
    501 typedef struct Rendez Rendez;
    502 struct Rendez
    503 {
    504 	QLock	*l;
    505 	_Threadlist	waiting;
    506 };
    507 
    508 extern	void	rsleep(Rendez*);	/* unlocks r->l, sleeps, locks r->l again */
    509 extern	int	rwakeup(Rendez*);
    510 extern	int	rwakeupall(Rendez*);
    511 extern	void	(*_rsleep)(Rendez*, ulong);	/* do not use */
    512 extern	int	(*_rwakeup)(Rendez*, int, ulong);
    513 
    514 typedef struct RWLock RWLock;
    515 struct RWLock
    516 {
    517 	Lock		l;
    518 	int	readers;
    519 	_Thread	*writer;
    520 	_Threadlist	rwaiting;
    521 	_Threadlist	wwaiting;
    522 };
    523 
    524 extern	void	rlock(RWLock*);
    525 extern	void	runlock(RWLock*);
    526 extern	int		canrlock(RWLock*);
    527 extern	void	wlock(RWLock*);
    528 extern	void	wunlock(RWLock*);
    529 extern	int		canwlock(RWLock*);
    530 extern	int	(*_rlock)(RWLock*, int, ulong);	/* do not use */
    531 extern	int	(*_wlock)(RWLock*, int, ulong);
    532 extern	void	(*_runlock)(RWLock*, ulong);
    533 extern	void	(*_wunlock)(RWLock*, ulong);
    534 
    535 /*
    536  * per-process private data
    537  */
    538 extern	void**	privalloc(void);
    539 extern	void	privfree(void**);
    540 
    541 /*
    542  *  network dialing
    543  */
    544 #define NETPATHLEN 40
    545 extern	int	p9accept(int, char*);
    546 extern	int	p9announce(char*, char*);
    547 extern	int	p9dial(char*, char*, char*, int*);
    548 extern	int	p9dialparse(char *ds, char **net, char **unixa, void *ip, int *port);
    549 extern	void	p9setnetmtpt(char*, int, char*);
    550 extern	int	p9listen(char*, char*);
    551 extern	char*	p9netmkaddr(char*, char*, char*);
    552 extern	int	p9reject(int, char*, char*);
    553 
    554 #ifndef NOPLAN9DEFINES
    555 #define	accept		p9accept
    556 #define	announce	p9announce
    557 #define	dial		p9dial
    558 #define	setnetmtpt	p9setnetmtpt
    559 #define	listen		p9listen
    560 #define	netmkaddr	p9netmkaddr
    561 #define	reject		p9reject
    562 #endif
    563 
    564 /*
    565  *  encryption
    566  */
    567 extern	int	pushssl(int, char*, char*, char*, int*);
    568 extern	int	pushtls(int, char*, char*, int, char*, char*);
    569 
    570 /*
    571  *  network services
    572  */
    573 typedef struct NetConnInfo NetConnInfo;
    574 struct NetConnInfo
    575 {
    576 	char	*dir;		/* connection directory */
    577 	char	*root;		/* network root */
    578 	char	*spec;		/* binding spec */
    579 	char	*lsys;		/* local system */
    580 	char	*lserv;		/* local service */
    581 	char	*rsys;		/* remote system */
    582 	char	*rserv;		/* remote service */
    583 	char *laddr;
    584 	char *raddr;
    585 };
    586 extern	NetConnInfo*	getnetconninfo(char*, int);
    587 extern	void		freenetconninfo(NetConnInfo*);
    588 
    589 /*
    590  * system calls
    591  *
    592  */
    593 #define	STATMAX	65535U	/* max length of machine-independent stat structure */
    594 #define	DIRMAX	(sizeof(Dir)+STATMAX)	/* max length of Dir structure */
    595 #define	ERRMAX	128	/* max length of error string */
    596 
    597 #define	MORDER	0x0003	/* mask for bits defining order of mounting */
    598 #define	MREPL	0x0000	/* mount replaces object */
    599 #define	MBEFORE	0x0001	/* mount goes before others in union directory */
    600 #define	MAFTER	0x0002	/* mount goes after others in union directory */
    601 #define	MCREATE	0x0004	/* permit creation in mounted directory */
    602 #define	MCACHE	0x0010	/* cache some data */
    603 #define	MMASK	0x0017	/* all bits on */
    604 
    605 #define	OREAD	0	/* open for read */
    606 #define	OWRITE	1	/* write */
    607 #define	ORDWR	2	/* read and write */
    608 #define	OEXEC	3	/* execute, == read but check execute permission */
    609 #define	OTRUNC	16	/* or'ed in (except for exec), truncate file first */
    610 #define	OCEXEC	32	/* or'ed in, close on exec */
    611 #define	ORCLOSE	64	/* or'ed in, remove on close */
    612 #define	ODIRECT	128	/* or'ed in, direct access */
    613 #define	ONONBLOCK 256	/* or'ed in, non-blocking call */
    614 #define	OEXCL	0x1000	/* or'ed in, exclusive use (create only) */
    615 #define	OLOCK	0x2000	/* or'ed in, lock after opening */
    616 #define	OAPPEND	0x4000	/* or'ed in, append only */
    617 
    618 #define	AEXIST	0	/* accessible: exists */
    619 #define	AEXEC	1	/* execute access */
    620 #define	AWRITE	2	/* write access */
    621 #define	AREAD	4	/* read access */
    622 
    623 /* Segattch */
    624 #define	SG_RONLY	0040	/* read only */
    625 #define	SG_CEXEC	0100	/* detach on exec */
    626 
    627 #define	NCONT	0	/* continue after note */
    628 #define	NDFLT	1	/* terminate after note */
    629 #define	NSAVE	2	/* clear note but hold state */
    630 #define	NRSTR	3	/* restore saved state */
    631 
    632 /* bits in Qid.type */
    633 #define QTDIR		0x80		/* type bit for directories */
    634 #define QTAPPEND	0x40		/* type bit for append only files */
    635 #define QTEXCL		0x20		/* type bit for exclusive use files */
    636 #define QTMOUNT		0x10		/* type bit for mounted channel */
    637 #define QTAUTH		0x08		/* type bit for authentication file */
    638 #define QTTMP		0x04		/* type bit for non-backed-up file */
    639 #define QTSYMLINK	0x02		/* type bit for symbolic link */
    640 #define QTFILE		0x00		/* type bits for plain file */
    641 
    642 /* bits in Dir.mode */
    643 #define DMDIR		0x80000000	/* mode bit for directories */
    644 #define DMAPPEND	0x40000000	/* mode bit for append only files */
    645 #define DMEXCL		0x20000000	/* mode bit for exclusive use files */
    646 #define DMMOUNT		0x10000000	/* mode bit for mounted channel */
    647 #define DMAUTH		0x08000000	/* mode bit for authentication file */
    648 #define DMTMP		0x04000000	/* mode bit for non-backed-up file */
    649 #define DMSYMLINK	0x02000000	/* mode bit for symbolic link (Unix, 9P2000.u) */
    650 #define DMDEVICE	0x00800000	/* mode bit for device file (Unix, 9P2000.u) */
    651 #define DMNAMEDPIPE	0x00200000	/* mode bit for named pipe (Unix, 9P2000.u) */
    652 #define DMSOCKET	0x00100000	/* mode bit for socket (Unix, 9P2000.u) */
    653 #define DMSETUID	0x00080000	/* mode bit for setuid (Unix, 9P2000.u) */
    654 #define DMSETGID	0x00040000	/* mode bit for setgid (Unix, 9P2000.u) */
    655 
    656 #define DMREAD		0x4		/* mode bit for read permission */
    657 #define DMWRITE		0x2		/* mode bit for write permission */
    658 #define DMEXEC		0x1		/* mode bit for execute permission */
    659 
    660 #ifdef RFMEM	/* FreeBSD, OpenBSD */
    661 #undef RFFDG
    662 #undef RFNOTEG
    663 #undef RFPROC
    664 #undef RFMEM
    665 #undef RFNOWAIT
    666 #undef RFCFDG
    667 #undef RFNAMEG
    668 #undef RFENVG
    669 #undef RFCENVG
    670 #undef RFCFDG
    671 #undef RFCNAMEG
    672 #endif
    673 
    674 enum
    675 {
    676 	RFNAMEG		= (1<<0),
    677 	RFENVG		= (1<<1),
    678 	RFFDG		= (1<<2),
    679 	RFNOTEG		= (1<<3),
    680 	RFPROC		= (1<<4),
    681 	RFMEM		= (1<<5),
    682 	RFNOWAIT	= (1<<6),
    683 	RFCNAMEG	= (1<<10),
    684 	RFCENVG		= (1<<11),
    685 	RFCFDG		= (1<<12)
    686 /*	RFREND		= (1<<13), */
    687 /*	RFNOMNT		= (1<<14) */
    688 };
    689 
    690 typedef
    691 struct Qid
    692 {
    693 	uvlong	path;
    694 	ulong	vers;
    695 	uchar	type;
    696 } Qid;
    697 
    698 typedef
    699 struct Dir {
    700 	/* system-modified data */
    701 	ushort	type;	/* server type */
    702 	uint	dev;	/* server subtype */
    703 	/* file data */
    704 	Qid	qid;	/* unique id from server */
    705 	ulong	mode;	/* permissions */
    706 	ulong	atime;	/* last read time */
    707 	ulong	mtime;	/* last write time */
    708 	vlong	length;	/* file length */
    709 	char	*name;	/* last element of path */
    710 	char	*uid;	/* owner name */
    711 	char	*gid;	/* group name */
    712 	char	*muid;	/* last modifier name */
    713 
    714 	/* 9P2000.u extensions */
    715 	uint	uidnum;		/* numeric uid */
    716 	uint	gidnum;		/* numeric gid */
    717 	uint	muidnum;	/* numeric muid */
    718 	char	*ext;		/* extended info */
    719 } Dir;
    720 
    721 /* keep /sys/src/ape/lib/ap/plan9/sys9.h in sync with this -rsc */
    722 typedef
    723 struct Waitmsg
    724 {
    725 	int pid;	/* of loved one */
    726 	ulong time[3];	/* of loved one & descendants */
    727 	char	*msg;
    728 } Waitmsg;
    729 
    730 typedef
    731 struct IOchunk
    732 {
    733 	void	*addr;
    734 	ulong	len;
    735 } IOchunk;
    736 
    737 extern	void	_exits(char*);
    738 
    739 extern	void	abort(void);
    740 /* extern	int	access(char*, int); */
    741 extern	long	p9alarm(ulong);
    742 extern	int	await(char*, int);
    743 extern	int	awaitfor(int, char*, int);
    744 extern	int	awaitnohang(char*, int);
    745 /* extern	int	bind(char*, char*, int); give up */
    746 /* extern	int	brk(void*); <unistd.h> */
    747 extern	int	p9chdir(char*);
    748 extern	int	p9close(int);
    749 extern	int	p9create(char*, int, ulong);
    750 extern	int	p9dup(int, int);
    751 extern	int	errstr(char*, uint);
    752 extern	int	p9exec(char*, char*[]);
    753 extern	int	p9execl(char*, ...);
    754 /* extern	int	p9fork(void); */
    755 extern	int	p9rfork(int);
    756 /* not implemented
    757 extern	int	fauth(int, char*);
    758 extern	int	fstat(int, uchar*, int);
    759 extern	int	fwstat(int, uchar*, int);
    760 extern	int	fversion(int, int, char*, int);
    761 extern	int	mount(int, int, char*, int, char*);
    762 extern	int	unmount(char*, char*);
    763 */
    764 extern	int	noted(int);
    765 extern	int	notify(void(*)(void*, char*));
    766 extern	int	noteenable(char*);
    767 extern	int	notedisable(char*);
    768 extern	int	notifyon(char*);
    769 extern	int	notifyoff(char*);
    770 extern	int	p9open(char*, int);
    771 extern	int	fd2path(int, char*, int);
    772 extern	int	p9pipe(int*);
    773 /*
    774  * use defs from <unistd.h>
    775 extern	long	pread(int, void*, long, vlong);
    776 extern	long	preadv(int, IOchunk*, int, vlong);
    777 extern	long	pwrite(int, void*, long, vlong);
    778 extern	long	pwritev(int, IOchunk*, int, vlong);
    779 extern	long	read(int, void*, long);
    780  */
    781 extern	long	readn(int, void*, long);
    782 /* extern	long	readv(int, IOchunk*, int); <unistd.h> */
    783 extern	int	remove(const char*);
    784 /* extern	void*	sbrk(ulong); <unistd.h> */
    785 /* extern	long	oseek(int, long, int); */
    786 extern	vlong	p9seek(int, vlong, int);
    787 /* give up
    788 extern	long	segattach(int, char*, void*, ulong);
    789 extern	int	segbrk(void*, void*);
    790 extern	int	segdetach(void*);
    791 extern	int	segflush(void*, ulong);
    792 extern	int	segfree(void*, ulong);
    793 */
    794 extern	int	p9sleep(long);
    795 /* extern	int	stat(char*, uchar*, int); give up */
    796 extern	Waitmsg*	p9wait(void);
    797 extern	Waitmsg*	p9waitfor(int);
    798 extern	Waitmsg*	waitnohang(void);
    799 extern	int	p9waitpid(void);
    800 /* <unistd.h>
    801 extern	long	write(int, void*, long);
    802 extern	long	writev(int, IOchunk*, int);
    803 */
    804 extern	long	p9write(int, void*, long);
    805 /* extern	int	wstat(char*, uchar*, int); give up */
    806 extern	ulong	rendezvous(ulong, ulong);
    807 
    808 #ifndef NOPLAN9DEFINES
    809 #define alarm		p9alarm
    810 #define	dup		p9dup
    811 #define	exec		p9exec
    812 #define	execl	p9execl
    813 #define	seek		p9seek
    814 #define sleep		p9sleep
    815 #define wait		p9wait
    816 #define waitpid		p9waitpid
    817 /* #define fork		p9fork */
    818 #define rfork		p9rfork
    819 /* #define access		p9access */
    820 #define create		p9create
    821 #undef open
    822 #define open		p9open
    823 #undef close
    824 #define close		p9close
    825 #define pipe		p9pipe
    826 #define	waitfor		p9waitfor
    827 #define write		p9write
    828 #endif
    829 
    830 extern	Dir*	dirstat(char*);
    831 extern	Dir*	dirfstat(int);
    832 extern	int	dirwstat(char*, Dir*);
    833 extern	int	dirfwstat(int, Dir*);
    834 extern	long	dirread(int, Dir**);
    835 extern	void	nulldir(Dir*);
    836 extern	long	dirreadall(int, Dir**);
    837 /* extern	int	getpid(void); <unistd.h> */
    838 /* extern	int	getppid(void); */
    839 extern	void	rerrstr(char*, uint);
    840 extern	char*	sysname(void);
    841 extern	void	werrstr(char*, ...);
    842 extern	char*	getns(void);
    843 extern	char*	get9root(void);
    844 extern	char*	unsharp(char*);
    845 extern	int	sendfd(int, int);
    846 extern	int	recvfd(int);
    847 extern	int	post9pservice(int, char*, char*);
    848 extern	int	chattyfuse;
    849 
    850 /* external names that we don't want to step on */
    851 #ifndef NOPLAN9DEFINES
    852 #define main	p9main
    853 #endif
    854 
    855 #ifdef VARARGCK
    856 #pragma	varargck	type	"lld"	vlong
    857 #pragma	varargck	type	"llx"	vlong
    858 #pragma	varargck	type	"lld"	uvlong
    859 #pragma	varargck	type	"llx"	uvlong
    860 #pragma	varargck	type	"ld"	long
    861 #pragma	varargck	type	"lx"	long
    862 #pragma	varargck	type	"ld"	ulong
    863 #pragma	varargck	type	"lx"	ulong
    864 #pragma	varargck	type	"d"	int
    865 #pragma	varargck	type	"x"	int
    866 #pragma	varargck	type	"c"	int
    867 #pragma	varargck	type	"C"	int
    868 #pragma	varargck	type	"d"	uint
    869 #pragma	varargck	type	"x"	uint
    870 #pragma	varargck	type	"c"	uint
    871 #pragma	varargck	type	"C"	uint
    872 #pragma	varargck	type	"f"	double
    873 #pragma	varargck	type	"e"	double
    874 #pragma	varargck	type	"g"	double
    875 #pragma	varargck	type	"lf"	long double
    876 #pragma	varargck	type	"le"	long double
    877 #pragma	varargck	type	"lg"	long double
    878 #pragma	varargck	type	"s"	char*
    879 #pragma	varargck	type	"q"	char*
    880 #pragma	varargck	type	"S"	Rune*
    881 #pragma	varargck	type	"Q"	Rune*
    882 #pragma	varargck	type	"r"	void
    883 #pragma	varargck	type	"%"	void
    884 #pragma	varargck	type	"n"	int*
    885 #pragma	varargck	type	"p"	void*
    886 #pragma	varargck	type	"<"	void*
    887 #pragma	varargck	type	"["	void*
    888 #pragma	varargck	type	"H"	void*
    889 #pragma	varargck	type	"lH"	void*
    890 
    891 #pragma	varargck	flag	' '
    892 #pragma	varargck	flag	'#'
    893 #pragma	varargck	flag	'+'
    894 #pragma	varargck	flag	','
    895 #pragma	varargck	flag	'-'
    896 #pragma	varargck	flag	'u'
    897 
    898 #pragma	varargck	argpos	fmtprint	2
    899 #pragma	varargck	argpos	fprint	2
    900 #pragma	varargck	argpos	print	1
    901 #pragma	varargck	argpos	runeseprint	3
    902 #pragma	varargck	argpos	runesmprint	1
    903 #pragma	varargck	argpos	runesnprint	3
    904 #pragma	varargck	argpos	runesprint	2
    905 #pragma	varargck	argpos	seprint	3
    906 #pragma	varargck	argpos	smprint	1
    907 #pragma	varargck	argpos	snprint	3
    908 #pragma	varargck	argpos	sprint	2
    909 #pragma	varargck	argpos	sysfatal	1
    910 #pragma	varargck	argpos	p9syslog	3
    911 #pragma	varargck	argpos	werrstr	1
    912 #endif
    913 
    914 /* compiler directives on plan 9 */
    915 #define	SET(x)	((x)=0)
    916 #define	USED(x)	if(x){}else{}
    917 #ifdef __GNUC__
    918 #	if __GNUC__ >= 3
    919 #		undef USED
    920 #		define USED(x) ((void)(x))
    921 #	endif
    922 #endif
    923 
    924 /* command line */
    925 extern char	*argv0;
    926 extern void __fixargv0(void);
    927 #define	ARGBEGIN	for((argv0?0:(argv0=(__fixargv0(),*argv))),argv++,argc--;\
    928 			    argv[0] && argv[0][0]=='-' && argv[0][1];\
    929 			    argc--, argv++) {\
    930 				char *_args, *_argt;\
    931 				Rune _argc;\
    932 				_args = &argv[0][1];\
    933 				if(_args[0]=='-' && _args[1]==0){\
    934 					argc--; argv++; break;\
    935 				}\
    936 				_argc = 0;\
    937 				while(*_args && (_args += chartorune(&_argc, _args)))\
    938 				switch(_argc)
    939 #define	ARGEND		SET(_argt);USED(_argt);USED(_argc);USED(_args);}USED(argv);USED(argc);
    940 #define	ARGF()		(_argt=_args, _args="",\
    941 				(*_argt? _argt: argv[1]? (argc--, *++argv): 0))
    942 #define	EARGF(x)	(_argt=_args, _args="",\
    943 				(*_argt? _argt: argv[1]? (argc--, *++argv): ((x), abort(), (char*)0)))
    944 
    945 #define	ARGC()		_argc
    946 
    947 #if defined(__cplusplus)
    948 }
    949 #endif
    950 #endif	/* _LIB9_H_ */