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