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