140ef9009SDavid du Colombier #define _LOCK_EXTENSION 240ef9009SDavid du Colombier #define _QLOCK_EXTENSION 340ef9009SDavid du Colombier #define _BSD_EXTENSION 440ef9009SDavid du Colombier #include <sys/types.h> 540ef9009SDavid du Colombier #include <lock.h> 640ef9009SDavid du Colombier #include <qlock.h> 740ef9009SDavid du Colombier #include <lib9.h> 840ef9009SDavid du Colombier #include <stdlib.h> 940ef9009SDavid du Colombier #include <string.h> 1040ef9009SDavid du Colombier #include <bsd.h> 1140ef9009SDavid du Colombier #include <unistd.h> 1240ef9009SDavid du Colombier #include <fcntl.h> 1340ef9009SDavid du Colombier #include <assert.h> 1440ef9009SDavid du Colombier #include <utf.h> 1540ef9009SDavid du Colombier #include <fmt.h> 1640ef9009SDavid du Colombier #include <signal.h> 1740ef9009SDavid du Colombier 1840ef9009SDavid du Colombier typedef 1940ef9009SDavid du Colombier struct Qid 2040ef9009SDavid du Colombier { 2140ef9009SDavid du Colombier uvlong path; 2240ef9009SDavid du Colombier ulong vers; 2340ef9009SDavid du Colombier uchar type; 2440ef9009SDavid du Colombier } Qid; 2540ef9009SDavid du Colombier 2640ef9009SDavid du Colombier typedef 2740ef9009SDavid du Colombier struct Dir { 2840ef9009SDavid du Colombier /* system-modified data */ 2940ef9009SDavid du Colombier ushort type; /* server type */ 3040ef9009SDavid du Colombier uint dev; /* server subtype */ 3140ef9009SDavid du Colombier /* file data */ 3240ef9009SDavid du Colombier Qid qid; /* unique id from server */ 3340ef9009SDavid du Colombier ulong mode; /* permissions */ 3440ef9009SDavid du Colombier ulong atime; /* last read time */ 3540ef9009SDavid du Colombier ulong mtime; /* last write time */ 3640ef9009SDavid du Colombier vlong length; /* file length: see <u.h> */ 3740ef9009SDavid du Colombier char *name; /* last element of path */ 3840ef9009SDavid du Colombier char *uid; /* owner name */ 3940ef9009SDavid du Colombier char *gid; /* group name */ 4040ef9009SDavid du Colombier char *muid; /* last modifier name */ 4140ef9009SDavid du Colombier } Dir; 4240ef9009SDavid du Colombier 4340ef9009SDavid du Colombier uint _convM2D(uchar*, uint, Dir*, char*); 4440ef9009SDavid du Colombier uint _convD2M(Dir*, uchar*, uint); 4540ef9009SDavid du Colombier Dir *_dirstat(char*); 4640ef9009SDavid du Colombier int _dirwstat(char*, Dir*); 4740ef9009SDavid du Colombier Dir *_dirfstat(int); 4840ef9009SDavid du Colombier int _dirfwstat(int, Dir*); 4940ef9009SDavid du Colombier long _dirread(int, Dir**); 5040ef9009SDavid du Colombier long _dirreadall(int, Dir**); 5140ef9009SDavid du Colombier void _nulldir(Dir*); 5240ef9009SDavid du Colombier uint _sizeD2M(Dir*); 5340ef9009SDavid du Colombier 5440ef9009SDavid du Colombier typedef 5540ef9009SDavid du Colombier struct Waitmsg 5640ef9009SDavid du Colombier { 5740ef9009SDavid du Colombier int pid; /* of loved one */ 5840ef9009SDavid du Colombier unsigned long time[3]; /* of loved one & descendants */ 5940ef9009SDavid du Colombier char *msg; 6040ef9009SDavid du Colombier } Waitmsg; 6140ef9009SDavid du Colombier 6240ef9009SDavid du Colombier 6340ef9009SDavid du Colombier extern int _AWAIT(char*, int); 6440ef9009SDavid du Colombier extern int _ALARM(unsigned long); 6540ef9009SDavid du Colombier extern int _BIND(const char*, const char*, int); 6640ef9009SDavid du Colombier extern int _CHDIR(const char*); 6740ef9009SDavid du Colombier extern int _CLOSE(int); 6840ef9009SDavid du Colombier extern int _CREATE(char*, int, unsigned long); 6940ef9009SDavid du Colombier extern int _DUP(int, int); 7040ef9009SDavid du Colombier extern int _ERRSTR(char*, unsigned int); 7140ef9009SDavid du Colombier extern int _EXEC(char*, char*[]); 7240ef9009SDavid du Colombier extern void _EXITS(char *); 7340ef9009SDavid du Colombier extern int _FD2PATH(int, char*, int); 7440ef9009SDavid du Colombier extern int _FAUTH(int, char*); 7540ef9009SDavid du Colombier extern int _FSESSION(int, char*, int); 7640ef9009SDavid du Colombier extern int _FSTAT(int, unsigned char*, int); 7740ef9009SDavid du Colombier extern int _FWSTAT(int, unsigned char*, int); 7840ef9009SDavid du Colombier extern int _MOUNT(int, int, const char*, int, const char*); 7940ef9009SDavid du Colombier extern int _NOTED(int); 8040ef9009SDavid du Colombier extern int _NOTIFY(int(*)(void*, char*)); 8140ef9009SDavid du Colombier extern int _OPEN(const char*, int); 8240ef9009SDavid du Colombier extern int _PIPE(int*); 8340ef9009SDavid du Colombier extern long _PREAD(int, void*, long, long long); 8440ef9009SDavid du Colombier extern long _PWRITE(int, void*, long, long long); 8540ef9009SDavid du Colombier extern long _READ(int, void*, long); 8640ef9009SDavid du Colombier extern int _REMOVE(const char*); 8740ef9009SDavid du Colombier extern int _RENDEZVOUS(unsigned long, unsigned long); 8840ef9009SDavid du Colombier extern int _RFORK(int); 8940ef9009SDavid du Colombier extern int _SEGATTACH(int, char*, void*, unsigned long); 9040ef9009SDavid du Colombier extern int _SEGBRK(void*, void*); 9140ef9009SDavid du Colombier extern int _SEGDETACH(void*); 9240ef9009SDavid du Colombier extern int _SEGFLUSH(void*, unsigned long); 9340ef9009SDavid du Colombier extern int _SEGFREE(void*, unsigned long); 9440ef9009SDavid du Colombier extern long long _SEEK(int, long long, int); 9540ef9009SDavid du Colombier extern int _SLEEP(long); 9640ef9009SDavid du Colombier extern int _STAT(const char*, unsigned char*, int); 9740ef9009SDavid du Colombier extern Waitmsg* _WAIT(void); 9840ef9009SDavid du Colombier extern long _WRITE(int, const void*, long); 9940ef9009SDavid du Colombier extern int _WSTAT(const char*, unsigned char*, int); 10040ef9009SDavid du Colombier extern void *_MALLOCZ(int, int); 10140ef9009SDavid du Colombier extern int _WERRSTR(char*, ...); 10240ef9009SDavid du Colombier extern long _READN(int, void*, long); 103711d1557SDavid du Colombier extern int _IOUNIT(int); 10440ef9009SDavid du Colombier 10540ef9009SDavid du Colombier #define dirstat _dirstat 10640ef9009SDavid du Colombier #define dirfstat _dirfstat 10740ef9009SDavid du Colombier 10840ef9009SDavid du Colombier #define OREAD 0 10940ef9009SDavid du Colombier #define OWRITE 1 11040ef9009SDavid du Colombier #define ORDWR 2 11140ef9009SDavid du Colombier #define OCEXEC 32 11240ef9009SDavid du Colombier 11340ef9009SDavid du Colombier #define AREAD 4 11440ef9009SDavid du Colombier #define AWRITE 2 11540ef9009SDavid du Colombier #define AEXEC 1 11640ef9009SDavid du Colombier #define AEXIST 0 11740ef9009SDavid du Colombier 11840ef9009SDavid du Colombier #define open _OPEN 11940ef9009SDavid du Colombier #define close _CLOSE 12040ef9009SDavid du Colombier #define read _READ 12140ef9009SDavid du Colombier #define write _WRITE 12240ef9009SDavid du Colombier #define _exits(s) _exit(s && *(char*)s ? 1 : 0) 12340ef9009SDavid du Colombier #define exits(s) exit(s && *(char*)s ? 1 : 0) 12440ef9009SDavid du Colombier #define create _CREATE 12540ef9009SDavid du Colombier #define pread _PREAD 12640ef9009SDavid du Colombier #define readn _READN 12740ef9009SDavid du Colombier #define mallocz _MALLOCZ 128711d1557SDavid du Colombier #define iounit _IOUNIT 129*58da3067SDavid du Colombier #define bind _BIND 13040ef9009SDavid du Colombier 13140ef9009SDavid du Colombier /* assume being called as in event.c */ 13240ef9009SDavid du Colombier #define postnote(x, pid, msg) kill(pid, SIGTERM) 13340ef9009SDavid du Colombier #define atnotify(x, y) signal(SIGTERM, ekill) 13440ef9009SDavid du Colombier 13540ef9009SDavid du Colombier #define ERRMAX 128 13674f16c81SDavid du Colombier 13774f16c81SDavid du Colombier extern void setmalloctag(void*, ulong); 13874f16c81SDavid du Colombier extern ulong getcallerpc(void*); 139