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