1 /* avoid name conflicts */ 2 #define accept pm_accept 3 #define listen pm_listen 4 #define sleep ksleep 5 #define wakeup kwakeup 6 #define strtod fmtstrtod 7 8 /* conflicts on some os's */ 9 #define encrypt libencrypt 10 #define decrypt libdecrypt 11 #define oserror liboserror 12 #define clone libclone 13 #define atexit libatexit 14 #define log2 liblog2 15 #define log liblog 16 #define reboot libreboot 17 #undef timeradd 18 #define timeradd xtimeradd 19 20 21 #define nil ((void*)0) 22 23 typedef unsigned char p9_uchar; 24 typedef unsigned int p9_uint; 25 typedef unsigned int p9_ulong; 26 typedef int p9_long; 27 typedef signed char p9_schar; 28 typedef unsigned short p9_ushort; 29 typedef unsigned short Rune; 30 typedef unsigned int p9_u32int; 31 typedef p9_u32int mpdigit; 32 33 /* make sure we don't conflict with predefined types */ 34 #define schar p9_schar 35 #define uchar p9_uchar 36 #define ushort p9_ushort 37 #define uint p9_uint 38 #define u32int p9_u32int 39 40 /* #define long int rather than p9_long so that "unsigned long" is valid */ 41 #define long int 42 #define ulong p9_ulong 43 #define vlong p9_vlong 44 #define uvlong p9_uvlong 45 46 #define nelem(x) (sizeof(x)/sizeof((x)[0])) 47 #define SET(x) ((x)=0) 48 #define USED(x) if(x);else 49 50 enum 51 { 52 UTFmax = 3, /* maximum bytes per rune */ 53 Runesync = 0x80, /* cannot represent part of a UTF sequence (<) */ 54 Runeself = 0x80, /* rune and UTF sequences are the same (<) */ 55 Runeerror = 0x80 /* decoding error in UTF */ 56 }; 57 58 /* 59 * all rune routines, from utf.h 60 */ 61 extern int runetochar(char*, Rune*); 62 extern int chartorune(Rune*, char*); 63 extern int runelen(long); 64 extern int runenlen(Rune*, int); 65 extern int fullrune(char*, int); 66 extern int utflen(char*); 67 extern int utfnlen(char*, long); 68 extern char* utfrune(char*, long); 69 extern char* utfrrune(char*, long); 70 extern char* utfutf(char*, char*); 71 extern char* utfecpy(char*, char*, char*); 72 73 extern Rune* runestrcat(Rune*, Rune*); 74 extern Rune* runestrchr(Rune*, Rune); 75 extern int runestrcmp(Rune*, Rune*); 76 extern Rune* runestrcpy(Rune*, Rune*); 77 extern Rune* runestrncpy(Rune*, Rune*, long); 78 extern Rune* runestrecpy(Rune*, Rune*, Rune*); 79 extern Rune* runestrdup(Rune*); 80 extern Rune* runestrncat(Rune*, Rune*, long); 81 extern int runestrncmp(Rune*, Rune*, long); 82 extern Rune* runestrrchr(Rune*, Rune); 83 extern long runestrlen(Rune*); 84 extern Rune* runestrstr(Rune*, Rune*); 85 86 extern Rune tolowerrune(Rune); 87 extern Rune totitlerune(Rune); 88 extern Rune toupperrune(Rune); 89 extern int isalpharune(Rune); 90 extern int islowerrune(Rune); 91 extern int isspacerune(Rune); 92 extern int istitlerune(Rune); 93 extern int isupperrune(Rune); 94 95 /* 96 * Syscall data structures 97 */ 98 #define MORDER 0x0003 /* mask for bits defining order of mounting */ 99 #define MREPL 0x0000 /* mount replaces object */ 100 #define MBEFORE 0x0001 /* mount goes before others in union directory */ 101 #define MAFTER 0x0002 /* mount goes after others in union directory */ 102 #define MCREATE 0x0004 /* permit creation in mounted directory */ 103 #define MCACHE 0x0010 /* cache some data */ 104 #define MMASK 0x0017 /* all bits on */ 105 106 #define OREAD 0 /* open for read */ 107 #define OWRITE 1 /* write */ 108 #define ORDWR 2 /* read and write */ 109 #define OEXEC 3 /* execute, == read but check execute permission */ 110 #define OTRUNC 16 /* or'ed in (except for exec), truncate file first */ 111 #define OCEXEC 32 /* or'ed in, close on exec */ 112 #define ORCLOSE 64 /* or'ed in, remove on close */ 113 #define OEXCL 0x1000 /* or'ed in, exclusive create */ 114 115 #define NCONT 0 /* continue after note */ 116 #define NDFLT 1 /* terminate after note */ 117 #define NSAVE 2 /* clear note but hold state */ 118 #define NRSTR 3 /* restore saved state */ 119 120 #define ERRMAX 128 /* max length of error string */ 121 #define KNAMELEN 28 /* max length of name held in kernel */ 122 123 /* bits in Qid.type */ 124 #define QTDIR 0x80 /* type bit for directories */ 125 #define QTAPPEND 0x40 /* type bit for append only files */ 126 #define QTEXCL 0x20 /* type bit for exclusive use files */ 127 #define QTMOUNT 0x10 /* type bit for mounted channel */ 128 #define QTAUTH 0x08 /* type bit for authentication file */ 129 #define QTFILE 0x00 /* plain file */ 130 131 /* bits in Dir.mode */ 132 #define DMDIR 0x80000000 /* mode bit for directories */ 133 #define DMAPPEND 0x40000000 /* mode bit for append only files */ 134 #define DMEXCL 0x20000000 /* mode bit for exclusive use files */ 135 #define DMMOUNT 0x10000000 /* mode bit for mounted channel */ 136 #define DMAUTH 0x08000000 /* mode bit for authentication files */ 137 #define DMREAD 0x4 /* mode bit for read permission */ 138 #define DMWRITE 0x2 /* mode bit for write permission */ 139 #define DMEXEC 0x1 /* mode bit for execute permission */ 140 141 typedef struct Lock 142 { 143 long key; 144 } Lock; 145 146 typedef struct QLock 147 { 148 Lock lk; 149 struct Proc *hold; 150 struct Proc *first; 151 struct Proc *last; 152 } QLock; 153 154 typedef 155 struct Qid 156 { 157 uvlong path; 158 ulong vers; 159 uchar type; 160 } Qid; 161 162 typedef 163 struct Dir { 164 /* system-modified data */ 165 ushort type; /* server type */ 166 uint dev; /* server subtype */ 167 /* file data */ 168 Qid qid; /* unique id from server */ 169 ulong mode; /* permissions */ 170 ulong atime; /* last read time */ 171 ulong mtime; /* last write time */ 172 vlong length; /* file length */ 173 char *name; /* last element of path */ 174 char *uid; /* owner name */ 175 char *gid; /* group name */ 176 char *muid; /* last modifier name */ 177 } Dir; 178 179 typedef 180 struct Waitmsg 181 { 182 int pid; /* of loved one */ 183 ulong time[3]; /* of loved one & descendants */ 184 char *msg; 185 } Waitmsg; 186 187 /* 188 * print routines 189 */ 190 typedef struct Fmt Fmt; 191 struct Fmt{ 192 uchar runes; /* output buffer is runes or chars? */ 193 void *start; /* of buffer */ 194 void *to; /* current place in the buffer */ 195 void *stop; /* end of the buffer; overwritten if flush fails */ 196 int (*flush)(Fmt *); /* called when to == stop */ 197 void *farg; /* to make flush a closure */ 198 int nfmt; /* num chars formatted so far */ 199 va_list args; /* args passed to dofmt */ 200 int r; /* % format Rune */ 201 int width; 202 int prec; 203 ulong flags; 204 }; 205 206 enum{ 207 FmtWidth = 1, 208 FmtLeft = FmtWidth << 1, 209 FmtPrec = FmtLeft << 1, 210 FmtSharp = FmtPrec << 1, 211 FmtSpace = FmtSharp << 1, 212 FmtSign = FmtSpace << 1, 213 FmtZero = FmtSign << 1, 214 FmtUnsigned = FmtZero << 1, 215 FmtShort = FmtUnsigned << 1, 216 FmtLong = FmtShort << 1, 217 FmtVLong = FmtLong << 1, 218 FmtComma = FmtVLong << 1, 219 FmtByte = FmtComma << 1, 220 221 FmtFlag = FmtByte << 1, 222 FmtLDouble = FmtFlag << 1 223 }; 224 225 extern int print(char*, ...); 226 extern char* seprint(char*, char*, char*, ...); 227 extern char* vseprint(char*, char*, char*, va_list); 228 extern int snprint(char*, int, char*, ...); 229 extern int vsnprint(char*, int, char*, va_list); 230 extern char* smprint(char*, ...); 231 extern char* vsmprint(char*, va_list); 232 extern int sprint(char*, char*, ...); 233 extern int fprint(int, char*, ...); 234 extern int vfprint(int, char*, va_list); 235 236 extern int (*doquote)(int); 237 extern int runesprint(Rune*, char*, ...); 238 extern int runesnprint(Rune*, int, char*, ...); 239 extern int runevsnprint(Rune*, int, char*, va_list); 240 extern Rune* runeseprint(Rune*, Rune*, char*, ...); 241 extern Rune* runevseprint(Rune*, Rune*, char*, va_list); 242 extern Rune* runesmprint(char*, ...); 243 extern Rune* runevsmprint(char*, va_list); 244 245 extern int fmtfdinit(Fmt*, int, char*, int); 246 extern int fmtfdflush(Fmt*); 247 extern int fmtstrinit(Fmt*); 248 extern int fmtinstall(int, int (*)(Fmt*)); 249 extern char* fmtstrflush(Fmt*); 250 extern int runefmtstrinit(Fmt*); 251 extern Rune* runefmtstrflush(Fmt*); 252 extern int encodefmt(Fmt*); 253 extern int fmtstrcpy(Fmt*, char*); 254 extern int fmtprint(Fmt*, char*, ...); 255 extern int fmtvprint(Fmt*, char*, va_list); 256 extern void* mallocz(ulong, int); 257 258 extern uintptr getcallerpc(void*); 259 extern char* cleanname(char*); 260 extern void sysfatal(char*, ...); 261 extern char* strecpy(char*, char*, char*); 262 263 extern int tokenize(char*, char**, int); 264 extern int getfields(char*, char**, int, int, char*); 265 extern char* utfecpy(char*, char*, char*); 266 extern long tas(long*); 267 extern void quotefmtinstall(void); 268 extern int dec64(uchar*, int, char*, int); 269 extern int enc64(char*, int, uchar*, int); 270 extern int dec32(uchar*, int, char*, int); 271 extern int enc32(char*, int, uchar*, int); 272 extern int enc16(char*, int, uchar*, int); 273 void hnputs(void *p, unsigned short v); 274 extern int dofmt(Fmt*, char*); 275 extern double __NaN(void); 276 extern int __isNaN(double); 277 extern double strtod(const char*, char**); 278 extern int utfnlen(char*, long); 279 extern double __Inf(int); 280 extern int __isInf(double, int); 281 282 extern int (*fmtdoquote)(int); 283 284