mirror of
				https://github.com/golang/go.git
				synced 2025-11-04 02:30:57 +00:00 
			
		
		
		
	
		
			
	
	
		
			365 lines
		
	
	
	
		
			10 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			365 lines
		
	
	
	
		
			10 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								Derived from Inferno include/kern.h and
							 | 
						||
| 
								 | 
							
								Plan 9 from User Space include/libc.h
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								http://code.google.com/p/inferno-os/source/browse/include/kern.h
							 | 
						||
| 
								 | 
							
								http://code.swtch.com/plan9port/src/tip/include/libc.h
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
							 | 
						||
| 
								 | 
							
									Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com).  All rights reserved.
							 | 
						||
| 
								 | 
							
									Portions Copyright © 2001-2007 Russ Cox.  All rights reserved.
							 | 
						||
| 
								 | 
							
									Portions Copyright © 2009 The Go Authors.  All rights reserved.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Permission is hereby granted, free of charge, to any person obtaining a copy
							 | 
						||
| 
								 | 
							
								of this software and associated documentation files (the "Software"), to deal
							 | 
						||
| 
								 | 
							
								in the Software without restriction, including without limitation the rights
							 | 
						||
| 
								 | 
							
								to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
							 | 
						||
| 
								 | 
							
								copies of the Software, and to permit persons to whom the Software is
							 | 
						||
| 
								 | 
							
								furnished to do so, subject to the following conditions:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The above copyright notice and this permission notice shall be included in
							 | 
						||
| 
								 | 
							
								all copies or substantial portions of the Software.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
							 | 
						||
| 
								 | 
							
								IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
							 | 
						||
| 
								 | 
							
								FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
							 | 
						||
| 
								 | 
							
								AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
							 | 
						||
| 
								 | 
							
								LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
							 | 
						||
| 
								 | 
							
								OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
							 | 
						||
| 
								 | 
							
								THE SOFTWARE.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * Lib9 is miscellany from the Plan 9 C library that doesn't
							 | 
						||
| 
								 | 
							
								 * fit into libutf or into libfmt, but is still missing from traditional
							 | 
						||
| 
								 | 
							
								 * Unix C libraries.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								#ifndef _LIBC_H_
							 | 
						||
| 
								 | 
							
								#define _LIBC_H_ 1
							 | 
						||
| 
								 | 
							
								#if defined(__cplusplus)
							 | 
						||
| 
								 | 
							
								extern "C" {
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <utf.h>
							 | 
						||
| 
								 | 
							
								#include <fmt.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * Begin trimmed down usual libc.h
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef nil
							 | 
						||
| 
								 | 
							
								#define	nil	((void*)0)
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								#define	nelem(x)	(sizeof(x)/sizeof((x)[0]))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef offsetof
							 | 
						||
| 
								 | 
							
								#define offsetof(s, m)	(ulong)(&(((s*)0)->m))
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								extern	char*	strecpy(char*, char*, char*);
							 | 
						||
| 
								 | 
							
								extern  int tokenize(char*, char**, int);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								extern  double  p9cputime(void);
							 | 
						||
| 
								 | 
							
								#ifndef NOPLAN9DEFINES
							 | 
						||
| 
								 | 
							
								#define cputime     p9cputime
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * one-of-a-kind
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								enum
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									PNPROC		= 1,
							 | 
						||
| 
								 | 
							
									PNGROUP		= 2
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								int isInf(double, int);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								extern	int	p9atoi(char*);
							 | 
						||
| 
								 | 
							
								extern	long	p9atol(char*);
							 | 
						||
| 
								 | 
							
								extern	vlong	p9atoll(char*);
							 | 
						||
| 
								 | 
							
								extern	double	fmtcharstod(int(*)(void*), void*);
							 | 
						||
| 
								 | 
							
								extern	char*	cleanname(char*);
							 | 
						||
| 
								 | 
							
								extern	int	exitcode(char*);
							 | 
						||
| 
								 | 
							
								extern	void	exits(char*);
							 | 
						||
| 
								 | 
							
								extern	double	frexp(double, int*);
							 | 
						||
| 
								 | 
							
								extern	char*	p9getenv(char*);
							 | 
						||
| 
								 | 
							
								extern	int	p9putenv(char*, char*);
							 | 
						||
| 
								 | 
							
								extern	int	getfields(char*, char**, int, int, char*);
							 | 
						||
| 
								 | 
							
								extern	int	gettokens(char *, char **, int, char *);
							 | 
						||
| 
								 | 
							
								extern	char*	getuser(void);
							 | 
						||
| 
								 | 
							
								extern	char*	p9getwd(char*, int);
							 | 
						||
| 
								 | 
							
								extern	void	p9longjmp(p9jmp_buf, int);
							 | 
						||
| 
								 | 
							
								extern	char*	mktemp(char*);
							 | 
						||
| 
								 | 
							
								extern	int		opentemp(char*);
							 | 
						||
| 
								 | 
							
								extern	void	p9notejmp(void*, p9jmp_buf, int);
							 | 
						||
| 
								 | 
							
								extern	void	perror(const char*);
							 | 
						||
| 
								 | 
							
								extern	int	postnote(int, int, char *);
							 | 
						||
| 
								 | 
							
								extern	double	p9pow10(int);
							 | 
						||
| 
								 | 
							
								extern	char*	searchpath(char*);
							 | 
						||
| 
								 | 
							
								#define p9setjmp(b)	sigsetjmp((void*)(b), 1)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								extern	void	sysfatal(char*, ...);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef NOPLAN9DEFINES
							 | 
						||
| 
								 | 
							
								#define atoi		p9atoi
							 | 
						||
| 
								 | 
							
								#define atol		p9atol
							 | 
						||
| 
								 | 
							
								#define atoll		p9atoll
							 | 
						||
| 
								 | 
							
								#define getenv		p9getenv
							 | 
						||
| 
								 | 
							
								#define	getwd		p9getwd
							 | 
						||
| 
								 | 
							
								#define	longjmp		p9longjmp
							 | 
						||
| 
								 | 
							
								#undef  setjmp
							 | 
						||
| 
								 | 
							
								#define setjmp		p9setjmp
							 | 
						||
| 
								 | 
							
								#define putenv		p9putenv
							 | 
						||
| 
								 | 
							
								#define notejmp		p9notejmp
							 | 
						||
| 
								 | 
							
								#define jmp_buf		p9jmp_buf
							 | 
						||
| 
								 | 
							
								#define pow10		p9pow10
							 | 
						||
| 
								 | 
							
								#define strtod		fmtstrtod
							 | 
						||
| 
								 | 
							
								#define charstod	fmtcharstod
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * system calls
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								#define	STATMAX	65535U	/* max length of machine-independent stat structure */
							 | 
						||
| 
								 | 
							
								#define	DIRMAX	(sizeof(Dir)+STATMAX)	/* max length of Dir structure */
							 | 
						||
| 
								 | 
							
								#define	ERRMAX	128	/* max length of error string */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define	MORDER	0x0003	/* mask for bits defining order of mounting */
							 | 
						||
| 
								 | 
							
								#define	MREPL	0x0000	/* mount replaces object */
							 | 
						||
| 
								 | 
							
								#define	MBEFORE	0x0001	/* mount goes before others in union directory */
							 | 
						||
| 
								 | 
							
								#define	MAFTER	0x0002	/* mount goes after others in union directory */
							 | 
						||
| 
								 | 
							
								#define	MCREATE	0x0004	/* permit creation in mounted directory */
							 | 
						||
| 
								 | 
							
								#define	MCACHE	0x0010	/* cache some data */
							 | 
						||
| 
								 | 
							
								#define	MMASK	0x0017	/* all bits on */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define	OREAD	0	/* open for read */
							 | 
						||
| 
								 | 
							
								#define	OWRITE	1	/* write */
							 | 
						||
| 
								 | 
							
								#define	ORDWR	2	/* read and write */
							 | 
						||
| 
								 | 
							
								#define	OEXEC	3	/* execute, == read but check execute permission */
							 | 
						||
| 
								 | 
							
								#define	OTRUNC	16	/* or'ed in (except for exec), truncate file first */
							 | 
						||
| 
								 | 
							
								#define	OCEXEC	32	/* or'ed in, close on exec */
							 | 
						||
| 
								 | 
							
								#define	ORCLOSE	64	/* or'ed in, remove on close */
							 | 
						||
| 
								 | 
							
								#define	ODIRECT	128	/* or'ed in, direct access */
							 | 
						||
| 
								 | 
							
								#define	ONONBLOCK 256	/* or'ed in, non-blocking call */
							 | 
						||
| 
								 | 
							
								#define	OEXCL	0x1000	/* or'ed in, exclusive use (create only) */
							 | 
						||
| 
								 | 
							
								#define	OLOCK	0x2000	/* or'ed in, lock after opening */
							 | 
						||
| 
								 | 
							
								#define	OAPPEND	0x4000	/* or'ed in, append only */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define	AEXIST	0	/* accessible: exists */
							 | 
						||
| 
								 | 
							
								#define	AEXEC	1	/* execute access */
							 | 
						||
| 
								 | 
							
								#define	AWRITE	2	/* write access */
							 | 
						||
| 
								 | 
							
								#define	AREAD	4	/* read access */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Segattch */
							 | 
						||
| 
								 | 
							
								#define	SG_RONLY	0040	/* read only */
							 | 
						||
| 
								 | 
							
								#define	SG_CEXEC	0100	/* detach on exec */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define	NCONT	0	/* continue after note */
							 | 
						||
| 
								 | 
							
								#define	NDFLT	1	/* terminate after note */
							 | 
						||
| 
								 | 
							
								#define	NSAVE	2	/* clear note but hold state */
							 | 
						||
| 
								 | 
							
								#define	NRSTR	3	/* restore saved state */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* bits in Qid.type */
							 | 
						||
| 
								 | 
							
								#define QTDIR		0x80		/* type bit for directories */
							 | 
						||
| 
								 | 
							
								#define QTAPPEND	0x40		/* type bit for append only files */
							 | 
						||
| 
								 | 
							
								#define QTEXCL		0x20		/* type bit for exclusive use files */
							 | 
						||
| 
								 | 
							
								#define QTMOUNT		0x10		/* type bit for mounted channel */
							 | 
						||
| 
								 | 
							
								#define QTAUTH		0x08		/* type bit for authentication file */
							 | 
						||
| 
								 | 
							
								#define QTTMP		0x04		/* type bit for non-backed-up file */
							 | 
						||
| 
								 | 
							
								#define QTSYMLINK	0x02		/* type bit for symbolic link */
							 | 
						||
| 
								 | 
							
								#define QTFILE		0x00		/* type bits for plain file */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* bits in Dir.mode */
							 | 
						||
| 
								 | 
							
								#define DMDIR		0x80000000	/* mode bit for directories */
							 | 
						||
| 
								 | 
							
								#define DMAPPEND	0x40000000	/* mode bit for append only files */
							 | 
						||
| 
								 | 
							
								#define DMEXCL		0x20000000	/* mode bit for exclusive use files */
							 | 
						||
| 
								 | 
							
								#define DMMOUNT		0x10000000	/* mode bit for mounted channel */
							 | 
						||
| 
								 | 
							
								#define DMAUTH		0x08000000	/* mode bit for authentication file */
							 | 
						||
| 
								 | 
							
								#define DMTMP		0x04000000	/* mode bit for non-backed-up file */
							 | 
						||
| 
								 | 
							
								#define DMSYMLINK	0x02000000	/* mode bit for symbolic link (Unix, 9P2000.u) */
							 | 
						||
| 
								 | 
							
								#define DMDEVICE	0x00800000	/* mode bit for device file (Unix, 9P2000.u) */
							 | 
						||
| 
								 | 
							
								#define DMNAMEDPIPE	0x00200000	/* mode bit for named pipe (Unix, 9P2000.u) */
							 | 
						||
| 
								 | 
							
								#define DMSOCKET	0x00100000	/* mode bit for socket (Unix, 9P2000.u) */
							 | 
						||
| 
								 | 
							
								#define DMSETUID	0x00080000	/* mode bit for setuid (Unix, 9P2000.u) */
							 | 
						||
| 
								 | 
							
								#define DMSETGID	0x00040000	/* mode bit for setgid (Unix, 9P2000.u) */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define DMREAD		0x4		/* mode bit for read permission */
							 | 
						||
| 
								 | 
							
								#define DMWRITE		0x2		/* mode bit for write permission */
							 | 
						||
| 
								 | 
							
								#define DMEXEC		0x1		/* mode bit for execute permission */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef RFMEM	/* FreeBSD, OpenBSD */
							 | 
						||
| 
								 | 
							
								#undef RFFDG
							 | 
						||
| 
								 | 
							
								#undef RFNOTEG
							 | 
						||
| 
								 | 
							
								#undef RFPROC
							 | 
						||
| 
								 | 
							
								#undef RFMEM
							 | 
						||
| 
								 | 
							
								#undef RFNOWAIT
							 | 
						||
| 
								 | 
							
								#undef RFCFDG
							 | 
						||
| 
								 | 
							
								#undef RFNAMEG
							 | 
						||
| 
								 | 
							
								#undef RFENVG
							 | 
						||
| 
								 | 
							
								#undef RFCENVG
							 | 
						||
| 
								 | 
							
								#undef RFCFDG
							 | 
						||
| 
								 | 
							
								#undef RFCNAMEG
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								enum
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									RFNAMEG		= (1<<0),
							 | 
						||
| 
								 | 
							
									RFENVG		= (1<<1),
							 | 
						||
| 
								 | 
							
									RFFDG		= (1<<2),
							 | 
						||
| 
								 | 
							
									RFNOTEG		= (1<<3),
							 | 
						||
| 
								 | 
							
									RFPROC		= (1<<4),
							 | 
						||
| 
								 | 
							
									RFMEM		= (1<<5),
							 | 
						||
| 
								 | 
							
									RFNOWAIT	= (1<<6),
							 | 
						||
| 
								 | 
							
									RFCNAMEG	= (1<<10),
							 | 
						||
| 
								 | 
							
									RFCENVG		= (1<<11),
							 | 
						||
| 
								 | 
							
									RFCFDG		= (1<<12)
							 | 
						||
| 
								 | 
							
								/*	RFREND		= (1<<13), */
							 | 
						||
| 
								 | 
							
								/*	RFNOMNT		= (1<<14) */
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef
							 | 
						||
| 
								 | 
							
								struct Qid
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									uvlong	path;
							 | 
						||
| 
								 | 
							
									ulong	vers;
							 | 
						||
| 
								 | 
							
									uchar	type;
							 | 
						||
| 
								 | 
							
								} Qid;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef
							 | 
						||
| 
								 | 
							
								struct Dir {
							 | 
						||
| 
								 | 
							
									/* system-modified data */
							 | 
						||
| 
								 | 
							
									ushort	type;	/* server type */
							 | 
						||
| 
								 | 
							
									uint	dev;	/* server subtype */
							 | 
						||
| 
								 | 
							
									/* file data */
							 | 
						||
| 
								 | 
							
									Qid	qid;	/* unique id from server */
							 | 
						||
| 
								 | 
							
									ulong	mode;	/* permissions */
							 | 
						||
| 
								 | 
							
									ulong	atime;	/* last read time */
							 | 
						||
| 
								 | 
							
									ulong	mtime;	/* last write time */
							 | 
						||
| 
								 | 
							
									vlong	length;	/* file length */
							 | 
						||
| 
								 | 
							
									char	*name;	/* last element of path */
							 | 
						||
| 
								 | 
							
									char	*uid;	/* owner name */
							 | 
						||
| 
								 | 
							
									char	*gid;	/* group name */
							 | 
						||
| 
								 | 
							
									char	*muid;	/* last modifier name */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/* 9P2000.u extensions */
							 | 
						||
| 
								 | 
							
									uint	uidnum;		/* numeric uid */
							 | 
						||
| 
								 | 
							
									uint	gidnum;		/* numeric gid */
							 | 
						||
| 
								 | 
							
									uint	muidnum;	/* numeric muid */
							 | 
						||
| 
								 | 
							
									char	*ext;		/* extended info */
							 | 
						||
| 
								 | 
							
								} Dir;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef
							 | 
						||
| 
								 | 
							
								struct Waitmsg
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									int pid;	/* of loved one */
							 | 
						||
| 
								 | 
							
									ulong time[3];	/* of loved one & descendants */
							 | 
						||
| 
								 | 
							
									char	*msg;
							 | 
						||
| 
								 | 
							
								} Waitmsg;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								extern	void	_exits(char*);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								extern	void	abort(void);
							 | 
						||
| 
								 | 
							
								extern	long	p9alarm(ulong);
							 | 
						||
| 
								 | 
							
								extern	int	await(char*, int);
							 | 
						||
| 
								 | 
							
								extern	int	awaitfor(int, char*, int);
							 | 
						||
| 
								 | 
							
								extern	int	awaitnohang(char*, int);
							 | 
						||
| 
								 | 
							
								extern	int	p9chdir(char*);
							 | 
						||
| 
								 | 
							
								extern	int	close(int);
							 | 
						||
| 
								 | 
							
								extern	int	p9create(char*, int, ulong);
							 | 
						||
| 
								 | 
							
								extern	int	p9dup(int, int);
							 | 
						||
| 
								 | 
							
								extern	int	errstr(char*, uint);
							 | 
						||
| 
								 | 
							
								extern	int	p9exec(char*, char*[]);
							 | 
						||
| 
								 | 
							
								extern	int	p9execl(char*, ...);
							 | 
						||
| 
								 | 
							
								extern	int	p9rfork(int);
							 | 
						||
| 
								 | 
							
								extern	int	noted(int);
							 | 
						||
| 
								 | 
							
								extern	int	notify(void(*)(void*, char*));
							 | 
						||
| 
								 | 
							
								extern	int	noteenable(char*);
							 | 
						||
| 
								 | 
							
								extern	int	notedisable(char*);
							 | 
						||
| 
								 | 
							
								extern	int	notifyon(char*);
							 | 
						||
| 
								 | 
							
								extern	int	notifyoff(char*);
							 | 
						||
| 
								 | 
							
								extern	int	p9open(char*, int);
							 | 
						||
| 
								 | 
							
								extern	int	fd2path(int, char*, int);
							 | 
						||
| 
								 | 
							
								extern	int	p9pipe(int*);
							 | 
						||
| 
								 | 
							
								extern	long	readn(int, void*, long);
							 | 
						||
| 
								 | 
							
								extern	int	remove(const char*);
							 | 
						||
| 
								 | 
							
								extern	vlong	p9seek(int, vlong, int);
							 | 
						||
| 
								 | 
							
								extern	int	p9sleep(long);
							 | 
						||
| 
								 | 
							
								extern	Waitmsg*	p9wait(void);
							 | 
						||
| 
								 | 
							
								extern	Waitmsg*	p9waitfor(int);
							 | 
						||
| 
								 | 
							
								extern	Waitmsg*	waitnohang(void);
							 | 
						||
| 
								 | 
							
								extern	int	p9waitpid(void);
							 | 
						||
| 
								 | 
							
								extern	ulong	rendezvous(ulong, ulong);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef NOPLAN9DEFINES
							 | 
						||
| 
								 | 
							
								#define alarm		p9alarm
							 | 
						||
| 
								 | 
							
								#define	dup		p9dup
							 | 
						||
| 
								 | 
							
								#define	exec		p9exec
							 | 
						||
| 
								 | 
							
								#define	execl	p9execl
							 | 
						||
| 
								 | 
							
								#define	seek		p9seek
							 | 
						||
| 
								 | 
							
								#define sleep		p9sleep
							 | 
						||
| 
								 | 
							
								#define wait		p9wait
							 | 
						||
| 
								 | 
							
								#define waitpid		p9waitpid
							 | 
						||
| 
								 | 
							
								#define rfork		p9rfork
							 | 
						||
| 
								 | 
							
								#define create		p9create
							 | 
						||
| 
								 | 
							
								#undef open
							 | 
						||
| 
								 | 
							
								#define open		p9open
							 | 
						||
| 
								 | 
							
								#define pipe		p9pipe
							 | 
						||
| 
								 | 
							
								#define	waitfor		p9waitfor
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								extern	Dir*	dirstat(char*);
							 | 
						||
| 
								 | 
							
								extern	Dir*	dirfstat(int);
							 | 
						||
| 
								 | 
							
								extern	int	dirwstat(char*, Dir*);
							 | 
						||
| 
								 | 
							
								extern	int	dirfwstat(int, Dir*);
							 | 
						||
| 
								 | 
							
								extern	void	nulldir(Dir*);
							 | 
						||
| 
								 | 
							
								extern	long	dirreadall(int, Dir**);
							 | 
						||
| 
								 | 
							
								extern	void	rerrstr(char*, uint);
							 | 
						||
| 
								 | 
							
								extern	char*	sysname(void);
							 | 
						||
| 
								 | 
							
								extern	void	werrstr(char*, ...);
							 | 
						||
| 
								 | 
							
								extern	char*	getns(void);
							 | 
						||
| 
								 | 
							
								extern	char*	get9root(void);
							 | 
						||
| 
								 | 
							
								extern	char*	unsharp(char*);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* external names that we don't want to step on */
							 | 
						||
| 
								 | 
							
								#ifndef NOPLAN9DEFINES
							 | 
						||
| 
								 | 
							
								#define main	p9main
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* compiler directives on plan 9 */
							 | 
						||
| 
								 | 
							
								#define	SET(x)	((x)=0)
							 | 
						||
| 
								 | 
							
								#define	USED(x)	if(x){}else{}
							 | 
						||
| 
								 | 
							
								#ifdef __GNUC__
							 | 
						||
| 
								 | 
							
								#	if __GNUC__ >= 3
							 | 
						||
| 
								 | 
							
								#		undef USED
							 | 
						||
| 
								 | 
							
								#		define USED(x) ((void)(x))
							 | 
						||
| 
								 | 
							
								#	endif
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* command line */
							 | 
						||
| 
								 | 
							
								extern char	*argv0;
							 | 
						||
| 
								 | 
							
								extern void __fixargv0(void);
							 | 
						||
| 
								 | 
							
								#define	ARGBEGIN	for((argv0?0:(argv0=(__fixargv0(),*argv))),argv++,argc--;\
							 | 
						||
| 
								 | 
							
											    argv[0] && argv[0][0]=='-' && argv[0][1];\
							 | 
						||
| 
								 | 
							
											    argc--, argv++) {\
							 | 
						||
| 
								 | 
							
												char *_args, *_argt;\
							 | 
						||
| 
								 | 
							
												Rune _argc;\
							 | 
						||
| 
								 | 
							
												_args = &argv[0][1];\
							 | 
						||
| 
								 | 
							
												if(_args[0]=='-' && _args[1]==0){\
							 | 
						||
| 
								 | 
							
													argc--; argv++; break;\
							 | 
						||
| 
								 | 
							
												}\
							 | 
						||
| 
								 | 
							
												_argc = 0;\
							 | 
						||
| 
								 | 
							
												while(*_args && (_args += chartorune(&_argc, _args)))\
							 | 
						||
| 
								 | 
							
												switch(_argc)
							 | 
						||
| 
								 | 
							
								#define	ARGEND		SET(_argt);USED(_argt);USED(_argc);USED(_args);}USED(argv);USED(argc);
							 | 
						||
| 
								 | 
							
								#define	ARGF()		(_argt=_args, _args="",\
							 | 
						||
| 
								 | 
							
												(*_argt? _argt: argv[1]? (argc--, *++argv): 0))
							 | 
						||
| 
								 | 
							
								#define	EARGF(x)	(_argt=_args, _args="",\
							 | 
						||
| 
								 | 
							
												(*_argt? _argt: argv[1]? (argc--, *++argv): ((x), abort(), (char*)0)))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define	ARGC()		_argc
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if defined(__cplusplus)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								#endif	/* _LIB9_H_ */
							 |