xref: /plan9/sys/src/ape/lib/sec/port/libc.h (revision f591d9710fae2220cec09da2812fd6db952f1a27)
146d884bbSDavid du Colombier #define _LOCK_EXTENSION
246d884bbSDavid du Colombier #define _QLOCK_EXTENSION
346d884bbSDavid du Colombier #define _BSD_EXTENSION
446d884bbSDavid du Colombier #include <sys/types.h>
546d884bbSDavid du Colombier #include <lock.h>
646d884bbSDavid du Colombier #include <qlock.h>
746d884bbSDavid du Colombier #include <lib9.h>
846d884bbSDavid du Colombier #include <stdlib.h>
946d884bbSDavid du Colombier #include <string.h>
1046d884bbSDavid du Colombier #include <bsd.h>
1146d884bbSDavid du Colombier #include <unistd.h>
1246d884bbSDavid du Colombier #include <fcntl.h>
1346d884bbSDavid du Colombier #include <assert.h>
1446d884bbSDavid du Colombier #include <utf.h>
1546d884bbSDavid du Colombier #include <fmt.h>
1646d884bbSDavid du Colombier #include <signal.h>
17*f591d971SDavid du Colombier // #include <time.h>
1846d884bbSDavid du Colombier 
1946d884bbSDavid du Colombier #define	nelem(x)	(sizeof(x)/sizeof((x)[0]))
2046d884bbSDavid du Colombier 
2146d884bbSDavid du Colombier extern	int	tokenize(char*, char**, int);
2246d884bbSDavid du Colombier 
2346d884bbSDavid du Colombier typedef
2446d884bbSDavid du Colombier struct Qid
2546d884bbSDavid du Colombier {
2646d884bbSDavid du Colombier 	uvlong	path;
2746d884bbSDavid du Colombier 	ulong	vers;
2846d884bbSDavid du Colombier 	uchar	type;
2946d884bbSDavid du Colombier } Qid;
3046d884bbSDavid du Colombier 
3146d884bbSDavid du Colombier typedef
3246d884bbSDavid du Colombier struct Dir {
3346d884bbSDavid du Colombier 	/* system-modified data */
3446d884bbSDavid du Colombier 	ushort	type;	/* server type */
3546d884bbSDavid du Colombier 	uint	dev;	/* server subtype */
3646d884bbSDavid du Colombier 	/* file data */
3746d884bbSDavid du Colombier 	Qid	qid;	/* unique id from server */
3846d884bbSDavid du Colombier 	ulong	mode;	/* permissions */
3946d884bbSDavid du Colombier 	ulong	atime;	/* last read time */
4046d884bbSDavid du Colombier 	ulong	mtime;	/* last write time */
4146d884bbSDavid du Colombier 	vlong	length;	/* file length: see <u.h> */
4246d884bbSDavid du Colombier 	char	*name;	/* last element of path */
4346d884bbSDavid du Colombier 	char	*uid;	/* owner name */
4446d884bbSDavid du Colombier 	char	*gid;	/* group name */
4546d884bbSDavid du Colombier 	char	*muid;	/* last modifier name */
4646d884bbSDavid du Colombier } Dir;
4746d884bbSDavid du Colombier 
4846d884bbSDavid du Colombier uint	_convM2D(uchar*, uint, Dir*, char*);
4946d884bbSDavid du Colombier uint	_convD2M(Dir*, uchar*, uint);
5046d884bbSDavid du Colombier Dir	*_dirstat(char*);
5146d884bbSDavid du Colombier int	_dirwstat(char*, Dir*);
5246d884bbSDavid du Colombier Dir	*_dirfstat(int);
5346d884bbSDavid du Colombier int	_dirfwstat(int, Dir*);
5446d884bbSDavid du Colombier long	_dirread(int, Dir**);
5546d884bbSDavid du Colombier long _dirreadall(int, Dir**);
5646d884bbSDavid du Colombier void _nulldir(Dir*);
5746d884bbSDavid du Colombier uint _sizeD2M(Dir*);
5846d884bbSDavid du Colombier 
5946d884bbSDavid du Colombier typedef
6046d884bbSDavid du Colombier struct Waitmsg
6146d884bbSDavid du Colombier {
6246d884bbSDavid du Colombier 	int pid;	/* of loved one */
6346d884bbSDavid du Colombier 	unsigned long time[3];	/* of loved one & descendants */
6446d884bbSDavid du Colombier 	char	*msg;
6546d884bbSDavid du Colombier } Waitmsg;
6646d884bbSDavid du Colombier 
67*f591d971SDavid du Colombier /*
68*f591d971SDavid du Colombier  * Time-of-day
69*f591d971SDavid du Colombier  */
70*f591d971SDavid du Colombier 
71*f591d971SDavid du Colombier typedef
72*f591d971SDavid du Colombier struct Tm
73*f591d971SDavid du Colombier {
74*f591d971SDavid du Colombier 	int	sec;
75*f591d971SDavid du Colombier 	int	min;
76*f591d971SDavid du Colombier 	int	hour;
77*f591d971SDavid du Colombier 	int	mday;
78*f591d971SDavid du Colombier 	int	mon;
79*f591d971SDavid du Colombier 	int	year;
80*f591d971SDavid du Colombier 	int	wday;
81*f591d971SDavid du Colombier 	int	yday;
82*f591d971SDavid du Colombier 	char	zone[4];
83*f591d971SDavid du Colombier 	int	tzoff;
84*f591d971SDavid du Colombier } Tm;
85*f591d971SDavid du Colombier 
86*f591d971SDavid du Colombier extern	Tm*	gmtime(long);
87*f591d971SDavid du Colombier extern	Tm*	localtime(long);
88*f591d971SDavid du Colombier extern	char*	asctime(Tm*);
89*f591d971SDavid du Colombier extern	char*	ctime(long);
90*f591d971SDavid du Colombier extern	double	cputime(void);
91*f591d971SDavid du Colombier extern	long	times(long*);
92*f591d971SDavid du Colombier extern	long	tm2sec(Tm*);
93*f591d971SDavid du Colombier extern	vlong	nsec(void);
94*f591d971SDavid du Colombier 
95*f591d971SDavid du Colombier extern	void	cycles(uvlong*);	/* 64-bit value of the cycle counter if there is one, 0 if there isn't */
96*f591d971SDavid du Colombier 
97*f591d971SDavid du Colombier extern	long	time(long*);
9846d884bbSDavid du Colombier 
9946d884bbSDavid du Colombier extern	int	_AWAIT(char*, int);
10046d884bbSDavid du Colombier extern	int	_ALARM(unsigned long);
10146d884bbSDavid du Colombier extern	int	_BIND(const char*, const char*, int);
10246d884bbSDavid du Colombier extern	int	_CHDIR(const char*);
10346d884bbSDavid du Colombier extern	int	_CLOSE(int);
10446d884bbSDavid du Colombier extern	int	_CREATE(char*, int, unsigned long);
10546d884bbSDavid du Colombier extern	int	_DUP(int, int);
10646d884bbSDavid du Colombier extern	int	_ERRSTR(char*, unsigned int);
10746d884bbSDavid du Colombier extern	int	_EXEC(char*, char*[]);
10846d884bbSDavid du Colombier extern	void	_EXITS(char *);
10946d884bbSDavid du Colombier extern	int	_FD2PATH(int, char*, int);
11046d884bbSDavid du Colombier extern	int	_FAUTH(int, char*);
11146d884bbSDavid du Colombier extern	int	_FSESSION(int, char*, int);
11246d884bbSDavid du Colombier extern	int	_FSTAT(int, unsigned char*, int);
11346d884bbSDavid du Colombier extern	int	_FWSTAT(int, unsigned char*, int);
11446d884bbSDavid du Colombier extern	int	_MOUNT(int, int, const char*, int, const char*);
11546d884bbSDavid du Colombier extern	int	_NOTED(int);
11646d884bbSDavid du Colombier extern	int	_NOTIFY(int(*)(void*, char*));
11746d884bbSDavid du Colombier extern	int	_OPEN(const char*, int);
11846d884bbSDavid du Colombier extern	int	_PIPE(int*);
11946d884bbSDavid du Colombier extern	long	_PREAD(int, void*, long, long long);
12046d884bbSDavid du Colombier extern	long	_PWRITE(int, void*, long, long long);
12146d884bbSDavid du Colombier extern	long	_READ(int, void*, long);
12246d884bbSDavid du Colombier extern	int	_REMOVE(const char*);
12346d884bbSDavid du Colombier extern	int	_RENDEZVOUS(unsigned long, unsigned long);
12446d884bbSDavid du Colombier extern	int	_RFORK(int);
12546d884bbSDavid du Colombier extern	int	_SEGATTACH(int, char*, void*, unsigned long);
12646d884bbSDavid du Colombier extern	int	_SEGBRK(void*, void*);
12746d884bbSDavid du Colombier extern	int	_SEGDETACH(void*);
12846d884bbSDavid du Colombier extern	int	_SEGFLUSH(void*, unsigned long);
12946d884bbSDavid du Colombier extern	int	_SEGFREE(void*, unsigned long);
13046d884bbSDavid du Colombier extern	long long	_SEEK(int, long long, int);
13146d884bbSDavid du Colombier extern	int	_SLEEP(long);
13246d884bbSDavid du Colombier extern	int	_STAT(const char*, unsigned char*, int);
13346d884bbSDavid du Colombier extern	Waitmsg*	_WAIT(void);
13446d884bbSDavid du Colombier extern	long	_WRITE(int, const void*, long);
13546d884bbSDavid du Colombier extern	int	_WSTAT(const char*, unsigned char*, int);
13646d884bbSDavid du Colombier extern 	void *_MALLOCZ(int, int);
13746d884bbSDavid du Colombier extern	int	_WERRSTR(char*, ...);
13846d884bbSDavid du Colombier extern	long	_READN(int, void*, long);
13946d884bbSDavid du Colombier extern	int	_IOUNIT(int);
14046d884bbSDavid du Colombier 
14146d884bbSDavid du Colombier #define dirstat _dirstat
14246d884bbSDavid du Colombier #define dirfstat _dirfstat
14346d884bbSDavid du Colombier 
14446d884bbSDavid du Colombier #define OREAD 0
14546d884bbSDavid du Colombier #define OWRITE 1
14646d884bbSDavid du Colombier #define ORDWR 2
14746d884bbSDavid du Colombier #define OCEXEC 32
14846d884bbSDavid du Colombier 
14946d884bbSDavid du Colombier #define AREAD 4
15046d884bbSDavid du Colombier #define AWRITE 2
15146d884bbSDavid du Colombier #define AEXEC 1
15246d884bbSDavid du Colombier #define AEXIST 0
15346d884bbSDavid du Colombier 
15446d884bbSDavid du Colombier #define open _OPEN
15546d884bbSDavid du Colombier #define close _CLOSE
15646d884bbSDavid du Colombier #define read _READ
15746d884bbSDavid du Colombier #define write _WRITE
15846d884bbSDavid du Colombier #define _exits(s) _exit(s && *(char*)s ? 1 : 0)
15946d884bbSDavid du Colombier #define exits(s) exit(s && *(char*)s ? 1 : 0)
16046d884bbSDavid du Colombier #define create _CREATE
16146d884bbSDavid du Colombier #define pread _PREAD
16246d884bbSDavid du Colombier #define readn _READN
16346d884bbSDavid du Colombier #define mallocz _MALLOCZ
16446d884bbSDavid du Colombier #define iounit	_IOUNIT
16546d884bbSDavid du Colombier 
16646d884bbSDavid du Colombier /* assume being called as in event.c */
16746d884bbSDavid du Colombier #define postnote(x, pid, msg) kill(pid, SIGTERM)
16846d884bbSDavid du Colombier #define atnotify(x, y) signal(SIGTERM, ekill)
16946d884bbSDavid du Colombier 
17046d884bbSDavid du Colombier #define ERRMAX 128
17146d884bbSDavid du Colombier 
17246d884bbSDavid du Colombier extern	void	setmalloctag(void*, ulong);
17346d884bbSDavid du Colombier extern	ulong	getcallerpc(void*);
17446d884bbSDavid du Colombier 
17546d884bbSDavid du Colombier /* Used in libsec.h and not picked up in earlier type definitions */
17646d884bbSDavid du Colombier typedef unsigned int u32int;
17746d884bbSDavid du Colombier typedef unsigned long long u64int;
17846d884bbSDavid du Colombier 
17946d884bbSDavid du Colombier int  dec16(uchar *, int, char *, int);
18046d884bbSDavid du Colombier int  enc16(char *, int, uchar *, int);
18146d884bbSDavid du Colombier int  dec32(uchar *, int, char *, int);
18246d884bbSDavid du Colombier int  enc32(char *, int, uchar *, int);
18346d884bbSDavid du Colombier int  dec64(uchar *, int, char *, int);
18446d884bbSDavid du Colombier int  enc64(char *, int, uchar *, int);
18546d884bbSDavid du Colombier 
18646d884bbSDavid du Colombier extern	vlong	nsec(void);
18746d884bbSDavid du Colombier 
18846d884bbSDavid du Colombier extern void sysfatal(char*, ...);
18946d884bbSDavid du Colombier 
19046d884bbSDavid du Colombier extern	ulong	truerand(void);			/* uses /dev/random */
19146d884bbSDavid du Colombier extern	int	getfields(char*, char**, int, int, char*);
192781103c4SDavid du Colombier 
193781103c4SDavid du Colombier #pragma	varargck	type	"lld"	vlong
194781103c4SDavid du Colombier #pragma	varargck	type	"llo"	vlong
195781103c4SDavid du Colombier #pragma	varargck	type	"llx"	vlong
196781103c4SDavid du Colombier #pragma	varargck	type	"llb"	vlong
197781103c4SDavid du Colombier #pragma	varargck	type	"lld"	uvlong
198781103c4SDavid du Colombier #pragma	varargck	type	"llo"	uvlong
199781103c4SDavid du Colombier #pragma	varargck	type	"llx"	uvlong
200781103c4SDavid du Colombier #pragma	varargck	type	"llb"	uvlong
201781103c4SDavid du Colombier #pragma	varargck	type	"ld"	long
202781103c4SDavid du Colombier #pragma	varargck	type	"lo"	long
203781103c4SDavid du Colombier #pragma	varargck	type	"lx"	long
204781103c4SDavid du Colombier #pragma	varargck	type	"lb"	long
205781103c4SDavid du Colombier #pragma	varargck	type	"ld"	ulong
206781103c4SDavid du Colombier #pragma	varargck	type	"lo"	ulong
207781103c4SDavid du Colombier #pragma	varargck	type	"lx"	ulong
208781103c4SDavid du Colombier #pragma	varargck	type	"lb"	ulong
209781103c4SDavid du Colombier #pragma	varargck	type	"d"	int
210781103c4SDavid du Colombier #pragma	varargck	type	"o"	int
211781103c4SDavid du Colombier #pragma	varargck	type	"x"	int
212781103c4SDavid du Colombier #pragma	varargck	type	"c"	int
213781103c4SDavid du Colombier #pragma	varargck	type	"C"	int
214781103c4SDavid du Colombier #pragma	varargck	type	"b"	int
215781103c4SDavid du Colombier #pragma	varargck	type	"d"	uint
216781103c4SDavid du Colombier #pragma	varargck	type	"x"	uint
217781103c4SDavid du Colombier #pragma	varargck	type	"c"	uint
218781103c4SDavid du Colombier #pragma	varargck	type	"C"	uint
219781103c4SDavid du Colombier #pragma	varargck	type	"b"	uint
220781103c4SDavid du Colombier #pragma	varargck	type	"f"	double
221781103c4SDavid du Colombier #pragma	varargck	type	"e"	double
222781103c4SDavid du Colombier #pragma	varargck	type	"g"	double
223781103c4SDavid du Colombier #pragma	varargck	type	"s"	char*
224781103c4SDavid du Colombier #pragma	varargck	type	"q"	char*
225781103c4SDavid du Colombier #pragma	varargck	type	"S"	Rune*
226781103c4SDavid du Colombier #pragma	varargck	type	"Q"	Rune*
227781103c4SDavid du Colombier #pragma	varargck	type	"r"	void
228781103c4SDavid du Colombier #pragma	varargck	type	"%"	void
229781103c4SDavid du Colombier #pragma	varargck	type	"n"	int*
230781103c4SDavid du Colombier #pragma	varargck	type	"p"	ulong		/* uintptr */
231781103c4SDavid du Colombier #pragma	varargck	type	"p"	void*
232781103c4SDavid du Colombier #pragma	varargck	flag	','
233781103c4SDavid du Colombier #pragma	varargck	flag	' '
234781103c4SDavid du Colombier #pragma	varargck	flag	'h'
235781103c4SDavid du Colombier #pragma varargck	type	"<"	void*
236781103c4SDavid du Colombier #pragma varargck	type	"["	void*
237781103c4SDavid du Colombier #pragma varargck	type	"H"	void*
238781103c4SDavid du Colombier #pragma varargck	type	"lH"	void*
239