xref: /plan9-contrib/sys/src/cmd/unix/u9fs/plan9.h (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
1 /* magic to get SUSV2 standard, including pread, pwrite*/
2 #define _XOPEN_SOURCE 500
3 /* magic to get 64-bit pread/pwrite */
4 #define _LARGEFILE64_SOURCE
5 
6 #ifdef sgi
7 #define _BSD_TYPES	1	/* for struct timeval */
8 #include <sys/select.h>
9 #define _BSD_SOURCE	1	/* for ruserok */
10 /*
11  * SGI IRIX 5.x doesn't allow inclusion of both inttypes.h and
12  * sys/types.h.  These definitions are the ones we need from
13  * inttypes.h that aren't in sys/types.h.
14  *
15  * Unlike most of our #ifdef's, IRIX5X must be set in the makefile.
16  */
17 #ifdef IRIX5X
18 #define __inttypes_INCLUDED
19 typedef unsigned int            uint32_t;
20 typedef signed long long int    int64_t;
21 typedef unsigned long long int  uint64_t;
22 #endif /* IRIX5X */
23 #endif /* sgi */
24 
25 #include <inttypes.h>	/* for int64_t et al. */
26 #include <stdarg.h>		/* for va_list, vararg macros */
27 #include <sys/types.h>
28 #include <string.h>		/* for memmove */
29 #include <unistd.h>		/* for write */
30 
31 #define ulong p9ulong	/* because sys/types.h has some of these sometimes */
32 #define ushort p9ushort
33 #define uchar p9uchar
34 #define uint p9uint
35 #define vlong p9vlong
36 #define uvlong p9uvlong
37 #define u32int p9u32int
38 
39 typedef unsigned char uchar;
40 typedef unsigned short ushort;
41 typedef unsigned long ulong;
42 typedef unsigned int uint;
43 typedef int64_t vlong;
44 typedef uint64_t uvlong;
45 typedef uint32_t u32int;
46 typedef uint64_t u64int;
47 typedef ushort Rune;
48 
49 #define nil ((void*)0)
50 #define	nelem(x)	(sizeof(x)/sizeof((x)[0]))
51 #define	offsetof(s, m)	(ulong)(&(((s*)0)->m))
52 #define	assert(x)	if(x);else _assert("x")
53 
54 extern char *argv0;
55 #define	ARGBEGIN	for((void)(argv0||(argv0=*argv)),argv++,argc--;\
56 			    argv[0] && argv[0][0]=='-' && argv[0][1];\
57 			    argc--, argv++) {\
58 				char *_args, *_argt;\
59 				Rune _argc;\
60 				_args = &argv[0][1];\
61 				if(_args[0]=='-' && _args[1]==0){\
62 					argc--; argv++; break;\
63 				}\
64 				_argc = 0;\
65 				while(*_args && (_args += chartorune(&_argc, _args)))\
66 				switch(_argc)
67 #define	ARGEND		SET(_argt);USED(_argt);USED(_argc);USED(_args);}\
68 					USED(argv);USED(argc);
69 #define	ARGF()		(_argt=_args, _args="",\
70 				(*_argt? _argt: argv[1]? (argc--, *++argv): 0))
71 #define	EARGF(x)		(_argt=_args, _args="",\
72 				(*_argt? _argt: argv[1]? (argc--, *++argv): ((x), abort(), (char*)0)))
73 
74 #define	ARGC()		_argc
75 
76 #define	SET(x)	(x) = 0
77 #define	USED(x)	(void)(x)
78 
79 enum
80 {
81 	UTFmax		= 3,		/* maximum bytes per rune */
82 	Runesync	= 0x80,		/* cannot represent part of a UTF sequence (<) */
83 	Runeself	= 0x80,		/* rune and UTF sequences are the same (<) */
84 	Runeerror	= 0x80		/* decoding error in UTF */
85 };
86 
87 extern	int	runetochar(char*, Rune*);
88 extern	int	chartorune(Rune*, char*);
89 extern	int	runelen(long);
90 extern	int	utflen(char*);
91 extern	char*	strecpy(char*, char*, char*);
92 extern	int	tokenize(char*, char**, int);
93 extern	int	getfields(char*, char**, int, int, char*);
94 
95 /*
96  * print routines
97  */
98 typedef	struct	Fconv	Fconv;
99 struct	Fconv
100 {
101 	char*	out;		/* pointer to next output */
102 	char*	eout;		/* pointer to end */
103 	int	f1;
104 	int	f2;
105 	int	f3;
106 	int	chr;
107 };
108 extern	char*	doprint(char*, char*, char*, va_list);
109 extern	int	print(char*, ...);
110 extern	char*	seprint(char*, char*, char*, ...);
111 extern	int	snprint(char*, int, char*, ...);
112 extern	int	sprint(char*, char*, ...);
113 extern	int	fprint(int, char*, ...);
114 
115 extern	int	fmtinstall(int, int (*)(va_list*, Fconv*));
116 extern	int	numbconv(va_list*, Fconv*);
117 extern	void	strconv(char*, Fconv*);
118 extern	int	fltconv(va_list*, Fconv*);
119 
120 #define	OREAD	0	/* open for read */
121 #define	OWRITE	1	/* write */
122 #define	ORDWR	2	/* read and write */
123 #define	OEXEC	3	/* execute, == read but check execute permission */
124 #define	OTRUNC	16	/* or'ed in (except for exec), truncate file first */
125 #define	OCEXEC	32	/* or'ed in, close on exec */
126 #define	ORCLOSE	64	/* or'ed in, remove on close */
127 #define	OEXCL	0x1000	/* or'ed in, exclusive use */
128 
129 /* bits in Qid.type */
130 #define QTDIR		0x80		/* type bit for directories */
131 #define QTAPPEND	0x40		/* type bit for append only files */
132 #define QTEXCL		0x20		/* type bit for exclusive use files */
133 #define QTMOUNT		0x10		/* type bit for mounted channel */
134 #define QTFILE		0x00		/* plain file */
135 
136 /* bits in Dir.mode */
137 #define DMDIR		0x80000000	/* mode bit for directories */
138 #define DMAPPEND	0x40000000	/* mode bit for append only files */
139 #define DMEXCL		0x20000000	/* mode bit for exclusive use files */
140 #define DMMOUNT		0x10000000	/* mode bit for mounted channel */
141 #define DMREAD		0x4		/* mode bit for read permission */
142 #define DMWRITE		0x2		/* mode bit for write permission */
143 #define DMEXEC		0x1		/* mode bit for execute permission */
144 
145 typedef
146 struct Qid
147 {
148 	vlong	path;
149 	ulong	vers;
150 	uchar	type;
151 } Qid;
152 
153 typedef
154 struct Dir {
155 	/* system-modified data */
156 	ushort	type;	/* server type */
157 	uint	dev;	/* server subtype */
158 	/* file data */
159 	Qid	qid;	/* unique id from server */
160 	ulong	mode;	/* permissions */
161 	ulong	atime;	/* last read time */
162 	ulong	mtime;	/* last write time */
163 	vlong	length;	/* file length: see <u.h> */
164 	char	*name;	/* last element of path */
165 	char	*uid;	/* owner name */
166 	char	*gid;	/* group name */
167 	char	*muid;	/* last modifier name */
168 } Dir;
169 
170 long readn(int, void*, long);
171 void remotehost(char*, int);
172 
173 enum {
174 	NAMELEN = 28,
175 	ERRLEN = 64
176 };
177