1 #define _LOCK_EXTENSION 2 #define _QLOCK_EXTENSION 3 #define _BSD_EXTENSION 4 #include <sys/types.h> 5 #include <lock.h> 6 #include <qlock.h> 7 #include <lib9.h> 8 #include <stdlib.h> 9 #include <string.h> 10 #include <bsd.h> 11 #include <unistd.h> 12 #include <fcntl.h> 13 #include <assert.h> 14 #include <utf.h> 15 #include <fmt.h> 16 #include <signal.h> 17 // #include <time.h> 18 19 #define nelem(x) (sizeof(x)/sizeof((x)[0])) 20 21 extern int tokenize(char*, char**, int); 22 23 typedef 24 struct Qid 25 { 26 uvlong path; 27 ulong vers; 28 uchar type; 29 } Qid; 30 31 typedef 32 struct Dir { 33 /* system-modified data */ 34 ushort type; /* server type */ 35 uint dev; /* server subtype */ 36 /* file data */ 37 Qid qid; /* unique id from server */ 38 ulong mode; /* permissions */ 39 ulong atime; /* last read time */ 40 ulong mtime; /* last write time */ 41 vlong length; /* file length: see <u.h> */ 42 char *name; /* last element of path */ 43 char *uid; /* owner name */ 44 char *gid; /* group name */ 45 char *muid; /* last modifier name */ 46 } Dir; 47 48 uint _convM2D(uchar*, uint, Dir*, char*); 49 uint _convD2M(Dir*, uchar*, uint); 50 Dir *_dirstat(char*); 51 int _dirwstat(char*, Dir*); 52 Dir *_dirfstat(int); 53 int _dirfwstat(int, Dir*); 54 long _dirread(int, Dir**); 55 long _dirreadall(int, Dir**); 56 void _nulldir(Dir*); 57 uint _sizeD2M(Dir*); 58 59 typedef 60 struct Waitmsg 61 { 62 int pid; /* of loved one */ 63 unsigned long time[3]; /* of loved one & descendants */ 64 char *msg; 65 } Waitmsg; 66 67 /* 68 * Time-of-day 69 */ 70 71 typedef 72 struct Tm 73 { 74 int sec; 75 int min; 76 int hour; 77 int mday; 78 int mon; 79 int year; 80 int wday; 81 int yday; 82 char zone[4]; 83 int tzoff; 84 } Tm; 85 86 extern Tm* gmtime(long); 87 extern Tm* localtime(long); 88 extern char* asctime(Tm*); 89 extern char* ctime(long); 90 extern double cputime(void); 91 extern long times(long*); 92 extern long tm2sec(Tm*); 93 extern vlong nsec(void); 94 95 extern void cycles(uvlong*); /* 64-bit value of the cycle counter if there is one, 0 if there isn't */ 96 97 extern long time(long*); 98 99 extern int _AWAIT(char*, int); 100 extern int _ALARM(unsigned long); 101 extern int _BIND(const char*, const char*, int); 102 extern int _CHDIR(const char*); 103 extern int _CLOSE(int); 104 extern int _CREATE(char*, int, unsigned long); 105 extern int _DUP(int, int); 106 extern int _ERRSTR(char*, unsigned int); 107 extern int _EXEC(char*, char*[]); 108 extern void _EXITS(char *); 109 extern int _FD2PATH(int, char*, int); 110 extern int _FAUTH(int, char*); 111 extern int _FSESSION(int, char*, int); 112 extern int _FSTAT(int, unsigned char*, int); 113 extern int _FWSTAT(int, unsigned char*, int); 114 extern int _MOUNT(int, int, const char*, int, const char*); 115 extern int _NOTED(int); 116 extern int _NOTIFY(int(*)(void*, char*)); 117 extern int _OPEN(const char*, int); 118 extern int _PIPE(int*); 119 extern long _PREAD(int, void*, long, long long); 120 extern long _PWRITE(int, void*, long, long long); 121 extern long _READ(int, void*, long); 122 extern int _REMOVE(const char*); 123 extern int _RENDEZVOUS(unsigned long, unsigned long); 124 extern int _RFORK(int); 125 extern int _SEGATTACH(int, char*, void*, unsigned long); 126 extern int _SEGBRK(void*, void*); 127 extern int _SEGDETACH(void*); 128 extern int _SEGFLUSH(void*, unsigned long); 129 extern int _SEGFREE(void*, unsigned long); 130 extern long long _SEEK(int, long long, int); 131 extern int _SLEEP(long); 132 extern int _STAT(const char*, unsigned char*, int); 133 extern Waitmsg* _WAIT(void); 134 extern long _WRITE(int, const void*, long); 135 extern int _WSTAT(const char*, unsigned char*, int); 136 extern void *_MALLOCZ(int, int); 137 extern int _WERRSTR(char*, ...); 138 extern long _READN(int, void*, long); 139 extern int _IOUNIT(int); 140 141 #define dirstat _dirstat 142 #define dirfstat _dirfstat 143 144 #define OREAD 0 145 #define OWRITE 1 146 #define ORDWR 2 147 #define OCEXEC 32 148 149 #define AREAD 4 150 #define AWRITE 2 151 #define AEXEC 1 152 #define AEXIST 0 153 154 #define open _OPEN 155 #define close _CLOSE 156 #define read _READ 157 #define write _WRITE 158 #define _exits(s) _exit(s && *(char*)s ? 1 : 0) 159 #define exits(s) exit(s && *(char*)s ? 1 : 0) 160 #define create _CREATE 161 #define pread _PREAD 162 #define readn _READN 163 #define mallocz _MALLOCZ 164 #define iounit _IOUNIT 165 166 /* assume being called as in event.c */ 167 #define postnote(x, pid, msg) kill(pid, SIGTERM) 168 #define atnotify(x, y) signal(SIGTERM, ekill) 169 170 #define ERRMAX 128 171 172 extern void setmalloctag(void*, ulong); 173 extern ulong getcallerpc(void*); 174 175 /* Used in libsec.h and not picked up in earlier type definitions */ 176 typedef unsigned int u32int; 177 typedef unsigned long long u64int; 178 179 int dec16(uchar *, int, char *, int); 180 int enc16(char *, int, uchar *, int); 181 int dec32(uchar *, int, char *, int); 182 int enc32(char *, int, uchar *, int); 183 int dec64(uchar *, int, char *, int); 184 int enc64(char *, int, uchar *, int); 185 186 extern vlong nsec(void); 187 188 extern void sysfatal(char*, ...); 189 190 extern ulong truerand(void); /* uses /dev/random */ 191 extern int getfields(char*, char**, int, int, char*); 192 193 #pragma varargck type "lld" vlong 194 #pragma varargck type "llo" vlong 195 #pragma varargck type "llx" vlong 196 #pragma varargck type "llb" vlong 197 #pragma varargck type "lld" uvlong 198 #pragma varargck type "llo" uvlong 199 #pragma varargck type "llx" uvlong 200 #pragma varargck type "llb" uvlong 201 #pragma varargck type "ld" long 202 #pragma varargck type "lo" long 203 #pragma varargck type "lx" long 204 #pragma varargck type "lb" long 205 #pragma varargck type "ld" ulong 206 #pragma varargck type "lo" ulong 207 #pragma varargck type "lx" ulong 208 #pragma varargck type "lb" ulong 209 #pragma varargck type "d" int 210 #pragma varargck type "o" int 211 #pragma varargck type "x" int 212 #pragma varargck type "c" int 213 #pragma varargck type "C" int 214 #pragma varargck type "b" int 215 #pragma varargck type "d" uint 216 #pragma varargck type "x" uint 217 #pragma varargck type "c" uint 218 #pragma varargck type "C" uint 219 #pragma varargck type "b" uint 220 #pragma varargck type "f" double 221 #pragma varargck type "e" double 222 #pragma varargck type "g" double 223 #pragma varargck type "s" char* 224 #pragma varargck type "q" char* 225 #pragma varargck type "S" Rune* 226 #pragma varargck type "Q" Rune* 227 #pragma varargck type "r" void 228 #pragma varargck type "%" void 229 #pragma varargck type "n" int* 230 #pragma varargck type "p" ulong /* uintptr */ 231 #pragma varargck type "p" void* 232 #pragma varargck flag ',' 233 #pragma varargck flag ' ' 234 #pragma varargck flag 'h' 235 #pragma varargck type "<" void* 236 #pragma varargck type "[" void* 237 #pragma varargck type "H" void* 238 #pragma varargck type "lH" void* 239