1*46d884bbSDavid du Colombier #define _LOCK_EXTENSION 2*46d884bbSDavid du Colombier #define _QLOCK_EXTENSION 3*46d884bbSDavid du Colombier #define _BSD_EXTENSION 4*46d884bbSDavid du Colombier #include <sys/types.h> 5*46d884bbSDavid du Colombier #include <lock.h> 6*46d884bbSDavid du Colombier #include <qlock.h> 7*46d884bbSDavid du Colombier #include <lib9.h> 8*46d884bbSDavid du Colombier #include <stdlib.h> 9*46d884bbSDavid du Colombier #include <string.h> 10*46d884bbSDavid du Colombier #include <bsd.h> 11*46d884bbSDavid du Colombier #include <unistd.h> 12*46d884bbSDavid du Colombier #include <fcntl.h> 13*46d884bbSDavid du Colombier #include <assert.h> 14*46d884bbSDavid du Colombier #include <utf.h> 15*46d884bbSDavid du Colombier #include <fmt.h> 16*46d884bbSDavid du Colombier #include <signal.h> 17*46d884bbSDavid du Colombier #include <time.h> 18*46d884bbSDavid du Colombier 19*46d884bbSDavid du Colombier #define nelem(x) (sizeof(x)/sizeof((x)[0])) 20*46d884bbSDavid du Colombier 21*46d884bbSDavid du Colombier extern int tokenize(char*, char**, int); 22*46d884bbSDavid du Colombier 23*46d884bbSDavid du Colombier typedef 24*46d884bbSDavid du Colombier struct Qid 25*46d884bbSDavid du Colombier { 26*46d884bbSDavid du Colombier uvlong path; 27*46d884bbSDavid du Colombier ulong vers; 28*46d884bbSDavid du Colombier uchar type; 29*46d884bbSDavid du Colombier } Qid; 30*46d884bbSDavid du Colombier 31*46d884bbSDavid du Colombier typedef 32*46d884bbSDavid du Colombier struct Dir { 33*46d884bbSDavid du Colombier /* system-modified data */ 34*46d884bbSDavid du Colombier ushort type; /* server type */ 35*46d884bbSDavid du Colombier uint dev; /* server subtype */ 36*46d884bbSDavid du Colombier /* file data */ 37*46d884bbSDavid du Colombier Qid qid; /* unique id from server */ 38*46d884bbSDavid du Colombier ulong mode; /* permissions */ 39*46d884bbSDavid du Colombier ulong atime; /* last read time */ 40*46d884bbSDavid du Colombier ulong mtime; /* last write time */ 41*46d884bbSDavid du Colombier vlong length; /* file length: see <u.h> */ 42*46d884bbSDavid du Colombier char *name; /* last element of path */ 43*46d884bbSDavid du Colombier char *uid; /* owner name */ 44*46d884bbSDavid du Colombier char *gid; /* group name */ 45*46d884bbSDavid du Colombier char *muid; /* last modifier name */ 46*46d884bbSDavid du Colombier } Dir; 47*46d884bbSDavid du Colombier 48*46d884bbSDavid du Colombier uint _convM2D(uchar*, uint, Dir*, char*); 49*46d884bbSDavid du Colombier uint _convD2M(Dir*, uchar*, uint); 50*46d884bbSDavid du Colombier Dir *_dirstat(char*); 51*46d884bbSDavid du Colombier int _dirwstat(char*, Dir*); 52*46d884bbSDavid du Colombier Dir *_dirfstat(int); 53*46d884bbSDavid du Colombier int _dirfwstat(int, Dir*); 54*46d884bbSDavid du Colombier long _dirread(int, Dir**); 55*46d884bbSDavid du Colombier long _dirreadall(int, Dir**); 56*46d884bbSDavid du Colombier void _nulldir(Dir*); 57*46d884bbSDavid du Colombier uint _sizeD2M(Dir*); 58*46d884bbSDavid du Colombier 59*46d884bbSDavid du Colombier typedef 60*46d884bbSDavid du Colombier struct Waitmsg 61*46d884bbSDavid du Colombier { 62*46d884bbSDavid du Colombier int pid; /* of loved one */ 63*46d884bbSDavid du Colombier unsigned long time[3]; /* of loved one & descendants */ 64*46d884bbSDavid du Colombier char *msg; 65*46d884bbSDavid du Colombier } Waitmsg; 66*46d884bbSDavid du Colombier 67*46d884bbSDavid du Colombier 68*46d884bbSDavid du Colombier extern int _AWAIT(char*, int); 69*46d884bbSDavid du Colombier extern int _ALARM(unsigned long); 70*46d884bbSDavid du Colombier extern int _BIND(const char*, const char*, int); 71*46d884bbSDavid du Colombier extern int _CHDIR(const char*); 72*46d884bbSDavid du Colombier extern int _CLOSE(int); 73*46d884bbSDavid du Colombier extern int _CREATE(char*, int, unsigned long); 74*46d884bbSDavid du Colombier extern int _DUP(int, int); 75*46d884bbSDavid du Colombier extern int _ERRSTR(char*, unsigned int); 76*46d884bbSDavid du Colombier extern int _EXEC(char*, char*[]); 77*46d884bbSDavid du Colombier extern void _EXITS(char *); 78*46d884bbSDavid du Colombier extern int _FD2PATH(int, char*, int); 79*46d884bbSDavid du Colombier extern int _FAUTH(int, char*); 80*46d884bbSDavid du Colombier extern int _FSESSION(int, char*, int); 81*46d884bbSDavid du Colombier extern int _FSTAT(int, unsigned char*, int); 82*46d884bbSDavid du Colombier extern int _FWSTAT(int, unsigned char*, int); 83*46d884bbSDavid du Colombier extern int _MOUNT(int, int, const char*, int, const char*); 84*46d884bbSDavid du Colombier extern int _NOTED(int); 85*46d884bbSDavid du Colombier extern int _NOTIFY(int(*)(void*, char*)); 86*46d884bbSDavid du Colombier extern int _OPEN(const char*, int); 87*46d884bbSDavid du Colombier extern int _PIPE(int*); 88*46d884bbSDavid du Colombier extern long _PREAD(int, void*, long, long long); 89*46d884bbSDavid du Colombier extern long _PWRITE(int, void*, long, long long); 90*46d884bbSDavid du Colombier extern long _READ(int, void*, long); 91*46d884bbSDavid du Colombier extern int _REMOVE(const char*); 92*46d884bbSDavid du Colombier extern int _RENDEZVOUS(unsigned long, unsigned long); 93*46d884bbSDavid du Colombier extern int _RFORK(int); 94*46d884bbSDavid du Colombier extern int _SEGATTACH(int, char*, void*, unsigned long); 95*46d884bbSDavid du Colombier extern int _SEGBRK(void*, void*); 96*46d884bbSDavid du Colombier extern int _SEGDETACH(void*); 97*46d884bbSDavid du Colombier extern int _SEGFLUSH(void*, unsigned long); 98*46d884bbSDavid du Colombier extern int _SEGFREE(void*, unsigned long); 99*46d884bbSDavid du Colombier extern long long _SEEK(int, long long, int); 100*46d884bbSDavid du Colombier extern int _SLEEP(long); 101*46d884bbSDavid du Colombier extern int _STAT(const char*, unsigned char*, int); 102*46d884bbSDavid du Colombier extern Waitmsg* _WAIT(void); 103*46d884bbSDavid du Colombier extern long _WRITE(int, const void*, long); 104*46d884bbSDavid du Colombier extern int _WSTAT(const char*, unsigned char*, int); 105*46d884bbSDavid du Colombier extern void *_MALLOCZ(int, int); 106*46d884bbSDavid du Colombier extern int _WERRSTR(char*, ...); 107*46d884bbSDavid du Colombier extern long _READN(int, void*, long); 108*46d884bbSDavid du Colombier extern int _IOUNIT(int); 109*46d884bbSDavid du Colombier 110*46d884bbSDavid du Colombier #define dirstat _dirstat 111*46d884bbSDavid du Colombier #define dirfstat _dirfstat 112*46d884bbSDavid du Colombier 113*46d884bbSDavid du Colombier #define OREAD 0 114*46d884bbSDavid du Colombier #define OWRITE 1 115*46d884bbSDavid du Colombier #define ORDWR 2 116*46d884bbSDavid du Colombier #define OCEXEC 32 117*46d884bbSDavid du Colombier 118*46d884bbSDavid du Colombier #define AREAD 4 119*46d884bbSDavid du Colombier #define AWRITE 2 120*46d884bbSDavid du Colombier #define AEXEC 1 121*46d884bbSDavid du Colombier #define AEXIST 0 122*46d884bbSDavid du Colombier 123*46d884bbSDavid du Colombier #define open _OPEN 124*46d884bbSDavid du Colombier #define close _CLOSE 125*46d884bbSDavid du Colombier #define read _READ 126*46d884bbSDavid du Colombier #define write _WRITE 127*46d884bbSDavid du Colombier #define _exits(s) _exit(s && *(char*)s ? 1 : 0) 128*46d884bbSDavid du Colombier #define exits(s) exit(s && *(char*)s ? 1 : 0) 129*46d884bbSDavid du Colombier #define create _CREATE 130*46d884bbSDavid du Colombier #define pread _PREAD 131*46d884bbSDavid du Colombier #define readn _READN 132*46d884bbSDavid du Colombier #define mallocz _MALLOCZ 133*46d884bbSDavid du Colombier #define iounit _IOUNIT 134*46d884bbSDavid du Colombier 135*46d884bbSDavid du Colombier /* assume being called as in event.c */ 136*46d884bbSDavid du Colombier #define postnote(x, pid, msg) kill(pid, SIGTERM) 137*46d884bbSDavid du Colombier #define atnotify(x, y) signal(SIGTERM, ekill) 138*46d884bbSDavid du Colombier 139*46d884bbSDavid du Colombier #define ERRMAX 128 140*46d884bbSDavid du Colombier 141*46d884bbSDavid du Colombier extern void setmalloctag(void*, ulong); 142*46d884bbSDavid du Colombier extern ulong getcallerpc(void*); 143*46d884bbSDavid du Colombier 144*46d884bbSDavid du Colombier /* Used in libsec.h and not picked up in earlier type definitions */ 145*46d884bbSDavid du Colombier typedef unsigned int u32int; 146*46d884bbSDavid du Colombier typedef unsigned long long u64int; 147*46d884bbSDavid du Colombier 148*46d884bbSDavid du Colombier int dec16(uchar *, int, char *, int); 149*46d884bbSDavid du Colombier int enc16(char *, int, uchar *, int); 150*46d884bbSDavid du Colombier int dec32(uchar *, int, char *, int); 151*46d884bbSDavid du Colombier int enc32(char *, int, uchar *, int); 152*46d884bbSDavid du Colombier int dec64(uchar *, int, char *, int); 153*46d884bbSDavid du Colombier int enc64(char *, int, uchar *, int); 154*46d884bbSDavid du Colombier 155*46d884bbSDavid du Colombier extern vlong nsec(void); 156*46d884bbSDavid du Colombier 157*46d884bbSDavid du Colombier extern void sysfatal(char*, ...); 158*46d884bbSDavid du Colombier 159*46d884bbSDavid du Colombier extern ulong truerand(void); /* uses /dev/random */ 160*46d884bbSDavid du Colombier extern int getfields(char*, char**, int, int, char*); 161