xref: /plan9/sys/src/cmd/unix/u9fs/plan9.h (revision b94bb474148e9d24a82a427863d9c9eb4c20f4ae)
19a747e4fSDavid du Colombier /* magic to get SUSV2 standard, including pread, pwrite*/
29a747e4fSDavid du Colombier #define _XOPEN_SOURCE 500
39a747e4fSDavid du Colombier /* magic to get 64-bit pread/pwrite */
49a747e4fSDavid du Colombier #define _LARGEFILE64_SOURCE
563dc73a9SDavid du Colombier /* magic to get 64-bit stat on Linux, maybe others */
663dc73a9SDavid du Colombier #define _FILE_OFFSET_BITS 64
79a747e4fSDavid du Colombier 
89a747e4fSDavid du Colombier #ifdef sgi
99a747e4fSDavid du Colombier #define _BSD_TYPES	1	/* for struct timeval */
109a747e4fSDavid du Colombier #include <sys/select.h>
119a747e4fSDavid du Colombier #define _BSD_SOURCE	1	/* for ruserok */
129a747e4fSDavid du Colombier /*
139a747e4fSDavid du Colombier  * SGI IRIX 5.x doesn't allow inclusion of both inttypes.h and
149a747e4fSDavid du Colombier  * sys/types.h.  These definitions are the ones we need from
159a747e4fSDavid du Colombier  * inttypes.h that aren't in sys/types.h.
169a747e4fSDavid du Colombier  *
179a747e4fSDavid du Colombier  * Unlike most of our #ifdef's, IRIX5X must be set in the makefile.
189a747e4fSDavid du Colombier  */
199a747e4fSDavid du Colombier #ifdef IRIX5X
209a747e4fSDavid du Colombier #define __inttypes_INCLUDED
219a747e4fSDavid du Colombier typedef unsigned int            uint32_t;
229a747e4fSDavid du Colombier typedef signed long long int    int64_t;
239a747e4fSDavid du Colombier typedef unsigned long long int  uint64_t;
249a747e4fSDavid du Colombier #endif /* IRIX5X */
259a747e4fSDavid du Colombier #endif /* sgi */
269a747e4fSDavid du Colombier 
27d9306527SDavid du Colombier 
28d9306527SDavid du Colombier #ifdef sun	/* sparc and __svr4__ are also defined on the offending machine */
29d9306527SDavid du Colombier #define __EXTENSIONS__	1	/* for struct timeval */
30d9306527SDavid du Colombier #endif
31d9306527SDavid du Colombier 
329a747e4fSDavid du Colombier #include <inttypes.h>		/* for int64_t et al. */
33*b94bb474SDavid du Colombier #include <stdlib.h>
349a747e4fSDavid du Colombier #include <stdarg.h>		/* for va_list, vararg macros */
359df35464SDavid du Colombier #ifndef va_copy
369df35464SDavid du Colombier #ifdef __va_copy
379df35464SDavid du Colombier #define va_copy	__va_copy
389df35464SDavid du Colombier #else
399df35464SDavid du Colombier #define va_copy(d, s)	memmove(&(d), &(s), sizeof(va_list))
409df35464SDavid du Colombier #endif /* __va_copy */
419df35464SDavid du Colombier #endif /* va_copy */
429a747e4fSDavid du Colombier #include <sys/types.h>
439a747e4fSDavid du Colombier #include <string.h>		/* for memmove */
449a747e4fSDavid du Colombier #include <unistd.h>		/* for write */
45*b94bb474SDavid du Colombier #include <fcntl.h>
469a747e4fSDavid du Colombier 
479a747e4fSDavid du Colombier #define ulong p9ulong		/* because sys/types.h has some of these sometimes */
489a747e4fSDavid du Colombier #define ushort p9ushort
499a747e4fSDavid du Colombier #define uchar p9uchar
509a747e4fSDavid du Colombier #define uint p9uint
519a747e4fSDavid du Colombier #define vlong p9vlong
529a747e4fSDavid du Colombier #define uvlong p9uvlong
539a747e4fSDavid du Colombier #define u32int p9u32int
549a747e4fSDavid du Colombier 
559a747e4fSDavid du Colombier typedef unsigned char uchar;
569a747e4fSDavid du Colombier typedef unsigned short ushort;
579a747e4fSDavid du Colombier typedef unsigned long ulong;
589a747e4fSDavid du Colombier typedef unsigned int uint;
599a747e4fSDavid du Colombier typedef int64_t vlong;
609a747e4fSDavid du Colombier typedef uint64_t uvlong;
619a747e4fSDavid du Colombier typedef uint32_t u32int;
629a747e4fSDavid du Colombier typedef uint64_t u64int;
639a747e4fSDavid du Colombier typedef ushort Rune;
649a747e4fSDavid du Colombier 
659a747e4fSDavid du Colombier #define nil ((void*)0)
669a747e4fSDavid du Colombier #define	nelem(x)	(sizeof(x)/sizeof((x)[0]))
67dfda52d8SDavid du Colombier #ifndef offsetof
689a747e4fSDavid du Colombier #define	offsetof(s, m)	(ulong)(&(((s*)0)->m))
69dfda52d8SDavid du Colombier #endif
709a747e4fSDavid du Colombier #define	assert(x)	if(x);else _assert("x")
719a747e4fSDavid du Colombier 
729a747e4fSDavid du Colombier extern char *argv0;
739a747e4fSDavid du Colombier #define	ARGBEGIN	for((void)(argv0||(argv0=*argv)),argv++,argc--;\
749a747e4fSDavid du Colombier 			    argv[0] && argv[0][0]=='-' && argv[0][1];\
759a747e4fSDavid du Colombier 			    argc--, argv++) {\
769a747e4fSDavid du Colombier 				char *_args, *_argt;\
779a747e4fSDavid du Colombier 				Rune _argc;\
789a747e4fSDavid du Colombier 				_args = &argv[0][1];\
799a747e4fSDavid du Colombier 				if(_args[0]=='-' && _args[1]==0){\
809a747e4fSDavid du Colombier 					argc--; argv++; break;\
819a747e4fSDavid du Colombier 				}\
829a747e4fSDavid du Colombier 				_argc = 0;\
839a747e4fSDavid du Colombier 				while(*_args && (_args += chartorune(&_argc, _args)))\
849a747e4fSDavid du Colombier 				switch(_argc)
859a747e4fSDavid du Colombier #define	ARGEND		SET(_argt);USED(_argt);USED(_argc);USED(_args);}\
869a747e4fSDavid du Colombier 					USED(argv);USED(argc);
879a747e4fSDavid du Colombier #define	ARGF()		(_argt=_args, _args="",\
889a747e4fSDavid du Colombier 				(*_argt? _argt: argv[1]? (argc--, *++argv): 0))
899a747e4fSDavid du Colombier #define	EARGF(x)		(_argt=_args, _args="",\
909a747e4fSDavid du Colombier 				(*_argt? _argt: argv[1]? (argc--, *++argv): ((x), abort(), (char*)0)))
919a747e4fSDavid du Colombier 
929a747e4fSDavid du Colombier #define	ARGC()		_argc
939a747e4fSDavid du Colombier 
949a747e4fSDavid du Colombier #define	SET(x)	(x) = 0
959a747e4fSDavid du Colombier #define	USED(x)	(void)(x)
969a747e4fSDavid du Colombier 
979a747e4fSDavid du Colombier enum
989a747e4fSDavid du Colombier {
999a747e4fSDavid du Colombier 	UTFmax		= 3,		/* maximum bytes per rune */
1009a747e4fSDavid du Colombier 	Runesync	= 0x80,		/* cannot represent part of a UTF sequence (<) */
1019a747e4fSDavid du Colombier 	Runeself	= 0x80,		/* rune and UTF sequences are the same (<) */
1029a747e4fSDavid du Colombier 	Runeerror	= 0x80		/* decoding error in UTF */
1039a747e4fSDavid du Colombier };
1049a747e4fSDavid du Colombier 
1059a747e4fSDavid du Colombier extern	int	runetochar(char*, Rune*);
1069a747e4fSDavid du Colombier extern	int	chartorune(Rune*, char*);
1079a747e4fSDavid du Colombier extern	int	runelen(long);
1089a747e4fSDavid du Colombier extern	int	utflen(char*);
1099a747e4fSDavid du Colombier extern	char*	strecpy(char*, char*, char*);
1109a747e4fSDavid du Colombier extern	int	tokenize(char*, char**, int);
1119a747e4fSDavid du Colombier extern	int	getfields(char*, char**, int, int, char*);
1129a747e4fSDavid du Colombier 
1139a747e4fSDavid du Colombier /*
1149a747e4fSDavid du Colombier  * print routines
1159a747e4fSDavid du Colombier  */
1169a747e4fSDavid du Colombier typedef	struct	Fconv	Fconv;
1179a747e4fSDavid du Colombier struct	Fconv
1189a747e4fSDavid du Colombier {
1199a747e4fSDavid du Colombier 	char*	out;		/* pointer to next output */
1209a747e4fSDavid du Colombier 	char*	eout;		/* pointer to end */
1219a747e4fSDavid du Colombier 	int	f1;
1229a747e4fSDavid du Colombier 	int	f2;
1239a747e4fSDavid du Colombier 	int	f3;
1249a747e4fSDavid du Colombier 	int	chr;
1259a747e4fSDavid du Colombier };
1269df35464SDavid du Colombier extern	char*	doprint(char*, char*, char*, va_list *argp);
1279a747e4fSDavid du Colombier extern	int	print(char*, ...);
1289a747e4fSDavid du Colombier extern	char*	seprint(char*, char*, char*, ...);
1299a747e4fSDavid du Colombier extern	int	snprint(char*, int, char*, ...);
1309a747e4fSDavid du Colombier extern	int	sprint(char*, char*, ...);
1319a747e4fSDavid du Colombier extern	int	fprint(int, char*, ...);
1329a747e4fSDavid du Colombier 
1339a747e4fSDavid du Colombier extern	int	fmtinstall(int, int (*)(va_list*, Fconv*));
1349a747e4fSDavid du Colombier extern	int	numbconv(va_list*, Fconv*);
1359a747e4fSDavid du Colombier extern	void	strconv(char*, Fconv*);
1369a747e4fSDavid du Colombier extern	int	fltconv(va_list*, Fconv*);
1379a747e4fSDavid du Colombier 
1389a747e4fSDavid du Colombier #define	OREAD	0	/* open for read */
1399a747e4fSDavid du Colombier #define	OWRITE	1	/* write */
1409a747e4fSDavid du Colombier #define	ORDWR	2	/* read and write */
1419a747e4fSDavid du Colombier #define	OEXEC	3	/* execute, == read but check execute permission */
1429a747e4fSDavid du Colombier #define	OTRUNC	16	/* or'ed in (except for exec), truncate file first */
1439a747e4fSDavid du Colombier #define	OCEXEC	32	/* or'ed in, close on exec */
1449a747e4fSDavid du Colombier #define	ORCLOSE	64	/* or'ed in, remove on close */
1459a747e4fSDavid du Colombier #define	OEXCL	0x1000	/* or'ed in, exclusive use */
1469a747e4fSDavid du Colombier 
1479a747e4fSDavid du Colombier /* bits in Qid.type */
1489a747e4fSDavid du Colombier #define QTDIR		0x80		/* type bit for directories */
1499a747e4fSDavid du Colombier #define QTAPPEND	0x40		/* type bit for append only files */
1509a747e4fSDavid du Colombier #define QTEXCL		0x20		/* type bit for exclusive use files */
1519a747e4fSDavid du Colombier #define QTMOUNT		0x10		/* type bit for mounted channel */
15250a9bdd4SDavid du Colombier #define QTAUTH		0x08
1539a747e4fSDavid du Colombier #define QTFILE		0x00		/* plain file */
1549a747e4fSDavid du Colombier 
1559a747e4fSDavid du Colombier /* bits in Dir.mode */
1569a747e4fSDavid du Colombier #define DMDIR		0x80000000	/* mode bit for directories */
1579a747e4fSDavid du Colombier #define DMAPPEND	0x40000000	/* mode bit for append only files */
1589a747e4fSDavid du Colombier #define DMEXCL		0x20000000	/* mode bit for exclusive use files */
1599a747e4fSDavid du Colombier #define DMMOUNT		0x10000000	/* mode bit for mounted channel */
1609a747e4fSDavid du Colombier #define DMREAD		0x4		/* mode bit for read permission */
1619a747e4fSDavid du Colombier #define DMWRITE		0x2		/* mode bit for write permission */
1629a747e4fSDavid du Colombier #define DMEXEC		0x1		/* mode bit for execute permission */
1639a747e4fSDavid du Colombier 
1649a747e4fSDavid du Colombier typedef
1659a747e4fSDavid du Colombier struct Qid
1669a747e4fSDavid du Colombier {
1679a747e4fSDavid du Colombier 	vlong	path;
1689a747e4fSDavid du Colombier 	ulong	vers;
1699a747e4fSDavid du Colombier 	uchar	type;
1709a747e4fSDavid du Colombier } Qid;
1719a747e4fSDavid du Colombier 
1729a747e4fSDavid du Colombier typedef
1739a747e4fSDavid du Colombier struct Dir {
1749a747e4fSDavid du Colombier 	/* system-modified data */
1759a747e4fSDavid du Colombier 	ushort	type;	/* server type */
1769a747e4fSDavid du Colombier 	uint	dev;	/* server subtype */
1779a747e4fSDavid du Colombier 	/* file data */
1789a747e4fSDavid du Colombier 	Qid	qid;	/* unique id from server */
1799a747e4fSDavid du Colombier 	ulong	mode;	/* permissions */
1809a747e4fSDavid du Colombier 	ulong	atime;	/* last read time */
1819a747e4fSDavid du Colombier 	ulong	mtime;	/* last write time */
1829a747e4fSDavid du Colombier 	vlong	length;	/* file length: see <u.h> */
1839a747e4fSDavid du Colombier 	char	*name;	/* last element of path */
1849a747e4fSDavid du Colombier 	char	*uid;	/* owner name */
1859a747e4fSDavid du Colombier 	char	*gid;	/* group name */
1869a747e4fSDavid du Colombier 	char	*muid;	/* last modifier name */
1879a747e4fSDavid du Colombier } Dir;
1889a747e4fSDavid du Colombier 
1899a747e4fSDavid du Colombier long readn(int, void*, long);
1909a747e4fSDavid du Colombier void remotehost(char*, int);
1919a747e4fSDavid du Colombier 
1929a747e4fSDavid du Colombier enum {
1939a747e4fSDavid du Colombier 	NAMELEN = 28,
1949a747e4fSDavid du Colombier 	ERRLEN = 64
1959a747e4fSDavid du Colombier };
1966b6b9ac8SDavid du Colombier 
1976b6b9ac8SDavid du Colombier /* DES */
19863dc73a9SDavid du Colombier #define DESKEYLEN 7
1996b6b9ac8SDavid du Colombier void	key_setup(char key[DESKEYLEN], char expandedkey[128]);
2006b6b9ac8SDavid du Colombier void	block_cipher(char expandedkey[128], char buf[8], int decrypting);
201