1*9ef1f84bSDavid du Colombier /* 2*9ef1f84bSDavid du Colombier * functions (possibly) linked in, complete, from libc. 3*9ef1f84bSDavid du Colombier */ 4*9ef1f84bSDavid du Colombier #define nelem(x) (sizeof(x)/sizeof((x)[0])) 5*9ef1f84bSDavid du Colombier #define offsetof(s, m) (ulong)(&(((s*)0)->m)) 6*9ef1f84bSDavid du Colombier #define assert(x) if(x){}else _assert("x") 7*9ef1f84bSDavid du Colombier 8*9ef1f84bSDavid du Colombier /* 9*9ef1f84bSDavid du Colombier * mem routines 10*9ef1f84bSDavid du Colombier */ 11*9ef1f84bSDavid du Colombier extern void* memccpy(void*, void*, int, ulong); 12*9ef1f84bSDavid du Colombier extern void* memset(void*, int, ulong); 13*9ef1f84bSDavid du Colombier extern int memcmp(void*, void*, ulong); 14*9ef1f84bSDavid du Colombier extern void* memmove(void*, void*, ulong); 15*9ef1f84bSDavid du Colombier extern void* memchr(void*, int, ulong); 16*9ef1f84bSDavid du Colombier 17*9ef1f84bSDavid du Colombier /* 18*9ef1f84bSDavid du Colombier * string routines 19*9ef1f84bSDavid du Colombier */ 20*9ef1f84bSDavid du Colombier extern char* strcat(char*, char*); 21*9ef1f84bSDavid du Colombier extern char* strchr(char*, int); 22*9ef1f84bSDavid du Colombier extern int strcmp(char*, char*); 23*9ef1f84bSDavid du Colombier extern char* strcpy(char*, char*); 24*9ef1f84bSDavid du Colombier extern char* strecpy(char*, char*, char*); 25*9ef1f84bSDavid du Colombier extern char* strncat(char*, char*, long); 26*9ef1f84bSDavid du Colombier extern char* strncpy(char*, char*, long); 27*9ef1f84bSDavid du Colombier extern int strncmp(char*, char*, long); 28*9ef1f84bSDavid du Colombier extern char* strrchr(char*, int); 29*9ef1f84bSDavid du Colombier extern long strlen(char*); 30*9ef1f84bSDavid du Colombier extern char* strstr(char*, char*); 31*9ef1f84bSDavid du Colombier extern int cistrncmp(char*, char*, int); 32*9ef1f84bSDavid du Colombier extern int cistrcmp(char*, char*); 33*9ef1f84bSDavid du Colombier extern int tokenize(char*, char**, int); 34*9ef1f84bSDavid du Colombier 35*9ef1f84bSDavid du Colombier enum 36*9ef1f84bSDavid du Colombier { 37*9ef1f84bSDavid du Colombier UTFmax = 4, /* maximum bytes per rune */ 38*9ef1f84bSDavid du Colombier Runesync = 0x80, /* cannot represent part of a UTF sequence (<) */ 39*9ef1f84bSDavid du Colombier Runeself = 0x80, /* rune and UTF sequences are the same (<) */ 40*9ef1f84bSDavid du Colombier Runeerror = 0xFFFD, /* decoding error in UTF */ 41*9ef1f84bSDavid du Colombier Runemax = 0x10FFFF, /* 24 bit rune */ 42*9ef1f84bSDavid du Colombier Runemask = 0x1FFFFF, /* bits used by runes (see grep) */ 43*9ef1f84bSDavid du Colombier }; 44*9ef1f84bSDavid du Colombier 45*9ef1f84bSDavid du Colombier /* 46*9ef1f84bSDavid du Colombier * rune routines 47*9ef1f84bSDavid du Colombier */ 48*9ef1f84bSDavid du Colombier extern int runetochar(char*, Rune*); 49*9ef1f84bSDavid du Colombier extern int chartorune(Rune*, char*); 50*9ef1f84bSDavid du Colombier extern int runelen(long); 51*9ef1f84bSDavid du Colombier extern int fullrune(char*, int); 52*9ef1f84bSDavid du Colombier extern int utflen(char*); 53*9ef1f84bSDavid du Colombier extern int utfnlen(char*, long); 54*9ef1f84bSDavid du Colombier extern char* utfrune(char*, long); 55*9ef1f84bSDavid du Colombier 56*9ef1f84bSDavid du Colombier /* 57*9ef1f84bSDavid du Colombier * malloc 58*9ef1f84bSDavid du Colombier */ 59*9ef1f84bSDavid du Colombier extern void* malloc(ulong); 60*9ef1f84bSDavid du Colombier extern void* mallocz(ulong, int); 61*9ef1f84bSDavid du Colombier extern void free(void*); 62*9ef1f84bSDavid du Colombier extern void* mallocalign(ulong, ulong, long, ulong); 63*9ef1f84bSDavid du Colombier extern void* realloc(void*, ulong); 64*9ef1f84bSDavid du Colombier extern void setmalloctag(void*, ulong); 65*9ef1f84bSDavid du Colombier extern void setrealloctag(void*, ulong); 66*9ef1f84bSDavid du Colombier extern ulong getmalloctag(void*); 67*9ef1f84bSDavid du Colombier extern ulong getrealloctag(void*); 68*9ef1f84bSDavid du Colombier 69*9ef1f84bSDavid du Colombier /* 70*9ef1f84bSDavid du Colombier * print routines 71*9ef1f84bSDavid du Colombier */ 72*9ef1f84bSDavid du Colombier typedef struct Fmt Fmt; 73*9ef1f84bSDavid du Colombier struct Fmt{ 74*9ef1f84bSDavid du Colombier uchar runes; /* output buffer is runes or chars? */ 75*9ef1f84bSDavid du Colombier void *start; /* of buffer */ 76*9ef1f84bSDavid du Colombier void *to; /* current place in the buffer */ 77*9ef1f84bSDavid du Colombier void *stop; /* end of the buffer; overwritten if flush fails */ 78*9ef1f84bSDavid du Colombier int (*flush)(Fmt *); /* called when to == stop */ 79*9ef1f84bSDavid du Colombier void *farg; /* to make flush a closure */ 80*9ef1f84bSDavid du Colombier int nfmt; /* num chars formatted so far */ 81*9ef1f84bSDavid du Colombier va_list args; /* args passed to dofmt */ 82*9ef1f84bSDavid du Colombier int r; /* % format Rune */ 83*9ef1f84bSDavid du Colombier int width; 84*9ef1f84bSDavid du Colombier int prec; 85*9ef1f84bSDavid du Colombier ulong flags; 86*9ef1f84bSDavid du Colombier }; 87*9ef1f84bSDavid du Colombier 88*9ef1f84bSDavid du Colombier enum { 89*9ef1f84bSDavid du Colombier FmtWidth = 1, 90*9ef1f84bSDavid du Colombier FmtLeft = FmtWidth<<1, 91*9ef1f84bSDavid du Colombier FmtPrec = FmtLeft<<1, 92*9ef1f84bSDavid du Colombier FmtSharp = FmtPrec<<1, 93*9ef1f84bSDavid du Colombier FmtSpace = FmtSharp<<1, 94*9ef1f84bSDavid du Colombier FmtSign = FmtSpace<<1, 95*9ef1f84bSDavid du Colombier FmtZero = FmtSign<<1, 96*9ef1f84bSDavid du Colombier FmtUnsigned = FmtZero<<1, 97*9ef1f84bSDavid du Colombier FmtShort = FmtUnsigned<<1, 98*9ef1f84bSDavid du Colombier FmtLong = FmtShort<<1, 99*9ef1f84bSDavid du Colombier FmtVLong = FmtLong<<1, 100*9ef1f84bSDavid du Colombier FmtComma = FmtVLong<<1, 101*9ef1f84bSDavid du Colombier FmtByte = FmtComma<<1, 102*9ef1f84bSDavid du Colombier 103*9ef1f84bSDavid du Colombier FmtFlag = FmtByte<<1 104*9ef1f84bSDavid du Colombier }; 105*9ef1f84bSDavid du Colombier 106*9ef1f84bSDavid du Colombier extern int print(char*, ...); 107*9ef1f84bSDavid du Colombier extern char* seprint(char*, char*, char*, ...); 108*9ef1f84bSDavid du Colombier extern char* vseprint(char*, char*, char*, va_list); 109*9ef1f84bSDavid du Colombier extern int snprint(char*, int, char*, ...); 110*9ef1f84bSDavid du Colombier extern int vsnprint(char*, int, char*, va_list); 111*9ef1f84bSDavid du Colombier extern int sprint(char*, char*, ...); 112*9ef1f84bSDavid du Colombier 113*9ef1f84bSDavid du Colombier #pragma varargck argpos fmtprint 2 114*9ef1f84bSDavid du Colombier #pragma varargck argpos print 1 115*9ef1f84bSDavid du Colombier #pragma varargck argpos seprint 3 116*9ef1f84bSDavid du Colombier #pragma varargck argpos snprint 3 117*9ef1f84bSDavid du Colombier #pragma varargck argpos sprint 2 118*9ef1f84bSDavid du Colombier 119*9ef1f84bSDavid du Colombier #pragma varargck type "lld" vlong 120*9ef1f84bSDavid du Colombier #pragma varargck type "llx" vlong 121*9ef1f84bSDavid du Colombier #pragma varargck type "lld" uvlong 122*9ef1f84bSDavid du Colombier #pragma varargck type "llx" uvlong 123*9ef1f84bSDavid du Colombier #pragma varargck type "ld" long 124*9ef1f84bSDavid du Colombier #pragma varargck type "lx" long 125*9ef1f84bSDavid du Colombier #pragma varargck type "ld" ulong 126*9ef1f84bSDavid du Colombier #pragma varargck type "lx" ulong 127*9ef1f84bSDavid du Colombier #pragma varargck type "d" int 128*9ef1f84bSDavid du Colombier #pragma varargck type "x" int 129*9ef1f84bSDavid du Colombier #pragma varargck type "c" int 130*9ef1f84bSDavid du Colombier #pragma varargck type "C" int 131*9ef1f84bSDavid du Colombier #pragma varargck type "d" uint 132*9ef1f84bSDavid du Colombier #pragma varargck type "x" uint 133*9ef1f84bSDavid du Colombier #pragma varargck type "c" uint 134*9ef1f84bSDavid du Colombier #pragma varargck type "C" uint 135*9ef1f84bSDavid du Colombier #pragma varargck type "s" char* 136*9ef1f84bSDavid du Colombier #pragma varargck type "q" char* 137*9ef1f84bSDavid du Colombier #pragma varargck type "S" Rune* 138*9ef1f84bSDavid du Colombier #pragma varargck type "%" void 139*9ef1f84bSDavid du Colombier #pragma varargck type "p" uintptr 140*9ef1f84bSDavid du Colombier #pragma varargck type "p" void* 141*9ef1f84bSDavid du Colombier #pragma varargck flag ',' 142*9ef1f84bSDavid du Colombier 143*9ef1f84bSDavid du Colombier extern int fmtinstall(int, int (*)(Fmt*)); 144*9ef1f84bSDavid du Colombier extern int fmtprint(Fmt*, char*, ...); 145*9ef1f84bSDavid du Colombier extern int fmtstrcpy(Fmt*, char*); 146*9ef1f84bSDavid du Colombier extern char* fmtstrflush(Fmt*); 147*9ef1f84bSDavid du Colombier extern int fmtstrinit(Fmt*); 148*9ef1f84bSDavid du Colombier 149*9ef1f84bSDavid du Colombier /* 150*9ef1f84bSDavid du Colombier * quoted strings 151*9ef1f84bSDavid du Colombier */ 152*9ef1f84bSDavid du Colombier extern void quotefmtinstall(void); 153*9ef1f84bSDavid du Colombier 154*9ef1f84bSDavid du Colombier /* 155*9ef1f84bSDavid du Colombier * Time-of-day 156*9ef1f84bSDavid du Colombier */ 157*9ef1f84bSDavid du Colombier extern void cycles(uvlong*); /* 64-bit value of the cycle counter if there is one, 0 if there isn't */ 158*9ef1f84bSDavid du Colombier 159*9ef1f84bSDavid du Colombier /* 160*9ef1f84bSDavid du Colombier * one-of-a-kind 161*9ef1f84bSDavid du Colombier */ 162*9ef1f84bSDavid du Colombier extern int abs(int); 163*9ef1f84bSDavid du Colombier extern int atoi(char*); 164*9ef1f84bSDavid du Colombier extern char* cleanname(char*); 165*9ef1f84bSDavid du Colombier extern int dec64(uchar*, int, char*, int); 166*9ef1f84bSDavid du Colombier extern uintptr getcallerpc(void*); 167*9ef1f84bSDavid du Colombier extern int getfields(char*, char**, int, int, char*); 168*9ef1f84bSDavid du Colombier extern int gettokens(char *, char **, int, char *); 169*9ef1f84bSDavid du Colombier extern void qsort(void*, long, long, int (*)(void*, void*)); 170*9ef1f84bSDavid du Colombier extern long strtol(char*, char**, int); 171*9ef1f84bSDavid du Colombier extern ulong strtoul(char*, char**, int); 172*9ef1f84bSDavid du Colombier extern vlong strtoll(char*, char**, int); 173*9ef1f84bSDavid du Colombier extern uvlong strtoull(char*, char**, int); 174*9ef1f84bSDavid du Colombier 175*9ef1f84bSDavid du Colombier /* 176*9ef1f84bSDavid du Colombier * Syscall data structures 177*9ef1f84bSDavid du Colombier */ 178*9ef1f84bSDavid du Colombier #define MORDER 0x0003 /* mask for bits defining order of mounting */ 179*9ef1f84bSDavid du Colombier #define MREPL 0x0000 /* mount replaces object */ 180*9ef1f84bSDavid du Colombier #define MBEFORE 0x0001 /* mount goes before others in union directory */ 181*9ef1f84bSDavid du Colombier #define MAFTER 0x0002 /* mount goes after others in union directory */ 182*9ef1f84bSDavid du Colombier #define MCREATE 0x0004 /* permit creation in mounted directory */ 183*9ef1f84bSDavid du Colombier #define MCACHE 0x0010 /* cache some data */ 184*9ef1f84bSDavid du Colombier #define MMASK 0x0017 /* all bits on */ 185*9ef1f84bSDavid du Colombier 186*9ef1f84bSDavid du Colombier #define OREAD 0 /* open for read */ 187*9ef1f84bSDavid du Colombier #define OWRITE 1 /* write */ 188*9ef1f84bSDavid du Colombier #define ORDWR 2 /* read and write */ 189*9ef1f84bSDavid du Colombier #define OEXEC 3 /* execute, == read but check execute permission */ 190*9ef1f84bSDavid du Colombier #define OTRUNC 16 /* or'ed in (except for exec), truncate file first */ 191*9ef1f84bSDavid du Colombier #define OCEXEC 32 /* or'ed in, close on exec */ 192*9ef1f84bSDavid du Colombier #define ORCLOSE 64 /* or'ed in, remove on close */ 193*9ef1f84bSDavid du Colombier #define OEXCL 0x1000 /* or'ed in, exclusive create */ 194*9ef1f84bSDavid du Colombier 195*9ef1f84bSDavid du Colombier #define NCONT 0 /* continue after note */ 196*9ef1f84bSDavid du Colombier #define NDFLT 1 /* terminate after note */ 197*9ef1f84bSDavid du Colombier #define NSAVE 2 /* clear note but hold state */ 198*9ef1f84bSDavid du Colombier #define NRSTR 3 /* restore saved state */ 199*9ef1f84bSDavid du Colombier 200*9ef1f84bSDavid du Colombier typedef struct Qid Qid; 201*9ef1f84bSDavid du Colombier typedef struct Dir Dir; 202*9ef1f84bSDavid du Colombier typedef struct OWaitmsg OWaitmsg; 203*9ef1f84bSDavid du Colombier typedef struct Waitmsg Waitmsg; 204*9ef1f84bSDavid du Colombier 205*9ef1f84bSDavid du Colombier #define ERRMAX 128 /* max length of error string */ 206*9ef1f84bSDavid du Colombier #define KNAMELEN 28 /* max length of name held in kernel */ 207*9ef1f84bSDavid du Colombier 208*9ef1f84bSDavid du Colombier /* bits in Qid.type */ 209*9ef1f84bSDavid du Colombier #define QTDIR 0x80 /* type bit for directories */ 210*9ef1f84bSDavid du Colombier #define QTAPPEND 0x40 /* type bit for append only files */ 211*9ef1f84bSDavid du Colombier #define QTEXCL 0x20 /* type bit for exclusive use files */ 212*9ef1f84bSDavid du Colombier #define QTMOUNT 0x10 /* type bit for mounted channel */ 213*9ef1f84bSDavid du Colombier #define QTAUTH 0x08 /* type bit for authentication file */ 214*9ef1f84bSDavid du Colombier #define QTFILE 0x00 /* plain file */ 215*9ef1f84bSDavid du Colombier 216*9ef1f84bSDavid du Colombier /* bits in Dir.mode */ 217*9ef1f84bSDavid du Colombier #define DMDIR 0x80000000 /* mode bit for directories */ 218*9ef1f84bSDavid du Colombier #define DMAPPEND 0x40000000 /* mode bit for append only files */ 219*9ef1f84bSDavid du Colombier #define DMEXCL 0x20000000 /* mode bit for exclusive use files */ 220*9ef1f84bSDavid du Colombier #define DMMOUNT 0x10000000 /* mode bit for mounted channel */ 221*9ef1f84bSDavid du Colombier #define DMREAD 0x4 /* mode bit for read permission */ 222*9ef1f84bSDavid du Colombier #define DMWRITE 0x2 /* mode bit for write permission */ 223*9ef1f84bSDavid du Colombier #define DMEXEC 0x1 /* mode bit for execute permission */ 224*9ef1f84bSDavid du Colombier 225*9ef1f84bSDavid du Colombier struct Qid 226*9ef1f84bSDavid du Colombier { 227*9ef1f84bSDavid du Colombier uvlong path; 228*9ef1f84bSDavid du Colombier ulong vers; 229*9ef1f84bSDavid du Colombier uchar type; 230*9ef1f84bSDavid du Colombier }; 231*9ef1f84bSDavid du Colombier 232*9ef1f84bSDavid du Colombier struct Dir { 233*9ef1f84bSDavid du Colombier /* system-modified data */ 234*9ef1f84bSDavid du Colombier ushort type; /* server type */ 235*9ef1f84bSDavid du Colombier uint dev; /* server subtype */ 236*9ef1f84bSDavid du Colombier /* file data */ 237*9ef1f84bSDavid du Colombier Qid qid; /* unique id from server */ 238*9ef1f84bSDavid du Colombier ulong mode; /* permissions */ 239*9ef1f84bSDavid du Colombier ulong atime; /* last read time */ 240*9ef1f84bSDavid du Colombier ulong mtime; /* last write time */ 241*9ef1f84bSDavid du Colombier vlong length; /* file length: see <u.h> */ 242*9ef1f84bSDavid du Colombier char *name; /* last element of path */ 243*9ef1f84bSDavid du Colombier char *uid; /* owner name */ 244*9ef1f84bSDavid du Colombier char *gid; /* group name */ 245*9ef1f84bSDavid du Colombier char *muid; /* last modifier name */ 246*9ef1f84bSDavid du Colombier }; 247*9ef1f84bSDavid du Colombier 248*9ef1f84bSDavid du Colombier struct OWaitmsg 249*9ef1f84bSDavid du Colombier { 250*9ef1f84bSDavid du Colombier char pid[12]; /* of loved one */ 251*9ef1f84bSDavid du Colombier char time[3*12]; /* of loved one and descendants */ 252*9ef1f84bSDavid du Colombier char msg[64]; /* compatibility BUG */ 253*9ef1f84bSDavid du Colombier }; 254*9ef1f84bSDavid du Colombier 255*9ef1f84bSDavid du Colombier struct Waitmsg 256*9ef1f84bSDavid du Colombier { 257*9ef1f84bSDavid du Colombier int pid; /* of loved one */ 258*9ef1f84bSDavid du Colombier ulong time[3]; /* of loved one and descendants */ 259*9ef1f84bSDavid du Colombier char msg[ERRMAX]; /* actually variable-size in user mode */ 260*9ef1f84bSDavid du Colombier }; 261*9ef1f84bSDavid du Colombier 262*9ef1f84bSDavid du Colombier extern char etext[]; 263*9ef1f84bSDavid du Colombier extern char edata[]; 264*9ef1f84bSDavid du Colombier extern char end[]; 265