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