13e12c5d1SDavid du Colombier /* 23e12c5d1SDavid du Colombier * functions (possibly) linked in, complete, from libc. 33e12c5d1SDavid du Colombier */ 44de34a7eSDavid du Colombier #define nelem(x) (sizeof(x)/sizeof((x)[0])) 54de34a7eSDavid du Colombier #define offsetof(s, m) (ulong)(&(((s*)0)->m)) 64de34a7eSDavid du Colombier #define assert(x) if(x){}else _assert("x") 73e12c5d1SDavid du Colombier 83e12c5d1SDavid du Colombier /* 93e12c5d1SDavid du Colombier * mem routines 103e12c5d1SDavid du Colombier */ 119a747e4fSDavid du Colombier extern void* memccpy(void*, void*, int, ulong); 129a747e4fSDavid du Colombier extern void* memset(void*, int, ulong); 139a747e4fSDavid du Colombier extern int memcmp(void*, void*, ulong); 149a747e4fSDavid du Colombier extern void* memmove(void*, void*, ulong); 159a747e4fSDavid du Colombier extern void* memchr(void*, int, ulong); 163e12c5d1SDavid du Colombier 173e12c5d1SDavid du Colombier /* 183e12c5d1SDavid du Colombier * string routines 193e12c5d1SDavid du Colombier */ 203e12c5d1SDavid du Colombier extern char* strcat(char*, char*); 21061a3f44SDavid du Colombier extern char* strchr(char*, int); 22061a3f44SDavid du Colombier extern char* strrchr(char*, int); 233e12c5d1SDavid du Colombier extern int strcmp(char*, char*); 243e12c5d1SDavid du Colombier extern char* strcpy(char*, char*); 259a747e4fSDavid du Colombier extern char* strecpy(char*, char*, char*); 263e12c5d1SDavid du Colombier extern char* strncat(char*, char*, long); 273e12c5d1SDavid du Colombier extern char* strncpy(char*, char*, long); 283e12c5d1SDavid du Colombier extern int strncmp(char*, char*, long); 293e12c5d1SDavid du Colombier extern long strlen(char*); 3080ee5cbfSDavid du Colombier extern char* strstr(char*, char*); 313e12c5d1SDavid du Colombier extern int atoi(char*); 329a747e4fSDavid du Colombier extern int fullrune(char*, int); 334de34a7eSDavid du Colombier extern int cistrcmp(char*, char*); 344de34a7eSDavid du Colombier extern int cistrncmp(char*, char*, int); 353e12c5d1SDavid du Colombier 36bd389b36SDavid du Colombier enum 37bd389b36SDavid du Colombier { 38*e94a8e9bSDavid du Colombier UTFmax = 4, /* maximum bytes per rune */ 39*e94a8e9bSDavid du Colombier Runesync = 0x80, /* cannot represent part of a UTF sequence (<) */ 40bd389b36SDavid du Colombier Runeself = 0x80, /* rune and UTF sequences are the same (<) */ 41*e94a8e9bSDavid du Colombier Runeerror = 0xFFFD, /* decoding error in UTF */ 42*e94a8e9bSDavid du Colombier Runemax = 0x10FFFF, /* 24 bit rune */ 43*e94a8e9bSDavid du Colombier Runemask = 0x1FFFFF, /* bits used by runes (see grep) */ 44bd389b36SDavid du Colombier }; 45bd389b36SDavid du Colombier 463e12c5d1SDavid du Colombier /* 473e12c5d1SDavid du Colombier * rune routines 483e12c5d1SDavid du Colombier */ 493e12c5d1SDavid du Colombier extern int runetochar(char*, Rune*); 503e12c5d1SDavid du Colombier extern int chartorune(Rune*, char*); 513e12c5d1SDavid du Colombier extern char* utfrune(char*, long); 523e12c5d1SDavid du Colombier extern int utflen(char*); 535741f218SDavid du Colombier extern int utfnlen(char*, long); 547dd7cddfSDavid du Colombier extern int runelen(long); 553e12c5d1SDavid du Colombier 563e12c5d1SDavid du Colombier extern int abs(int); 573e12c5d1SDavid du Colombier 583e12c5d1SDavid du Colombier /* 593e12c5d1SDavid du Colombier * print routines 603e12c5d1SDavid du Colombier */ 619a747e4fSDavid du Colombier typedef struct Fmt Fmt; 629a747e4fSDavid du Colombier typedef int (*Fmts)(Fmt*); 639a747e4fSDavid du Colombier struct Fmt{ 649a747e4fSDavid du Colombier uchar runes; /* output buffer is runes or chars? */ 659a747e4fSDavid du Colombier void *start; /* of buffer */ 669a747e4fSDavid du Colombier void *to; /* current place in the buffer */ 679a747e4fSDavid du Colombier void *stop; /* end of the buffer; overwritten if flush fails */ 689a747e4fSDavid du Colombier int (*flush)(Fmt *); /* called when to == stop */ 699a747e4fSDavid du Colombier void *farg; /* to make flush a closure */ 709a747e4fSDavid du Colombier int nfmt; /* num chars formatted so far */ 719a747e4fSDavid du Colombier va_list args; /* args passed to dofmt */ 729a747e4fSDavid du Colombier int r; /* % format Rune */ 739a747e4fSDavid du Colombier int width; 749a747e4fSDavid du Colombier int prec; 759a747e4fSDavid du Colombier ulong flags; 769a747e4fSDavid du Colombier }; 773e12c5d1SDavid du Colombier extern int print(char*, ...); 789a747e4fSDavid du Colombier extern char* seprint(char*, char*, char*, ...); 799a747e4fSDavid du Colombier extern char* vseprint(char*, char*, char*, va_list); 809a747e4fSDavid du Colombier extern int snprint(char*, int, char*, ...); 819a747e4fSDavid du Colombier extern int vsnprint(char*, int, char*, va_list); 829a747e4fSDavid du Colombier extern int sprint(char*, char*, ...); 839a747e4fSDavid du Colombier 849a747e4fSDavid du Colombier #pragma varargck argpos fmtprint 2 859a747e4fSDavid du Colombier #pragma varargck argpos print 1 869a747e4fSDavid du Colombier #pragma varargck argpos seprint 3 879a747e4fSDavid du Colombier #pragma varargck argpos snprint 3 889a747e4fSDavid du Colombier #pragma varargck argpos sprint 2 89567483c8SDavid du Colombier 90567483c8SDavid du Colombier #pragma varargck type "lld" vlong 91567483c8SDavid du Colombier #pragma varargck type "llx" vlong 92567483c8SDavid du Colombier #pragma varargck type "lld" uvlong 93567483c8SDavid du Colombier #pragma varargck type "llx" uvlong 94567483c8SDavid du Colombier #pragma varargck type "ld" long 95567483c8SDavid du Colombier #pragma varargck type "lx" long 96567483c8SDavid du Colombier #pragma varargck type "ld" ulong 97567483c8SDavid du Colombier #pragma varargck type "lx" ulong 98567483c8SDavid du Colombier #pragma varargck type "d" int 99567483c8SDavid du Colombier #pragma varargck type "x" int 100567483c8SDavid du Colombier #pragma varargck type "c" int 101567483c8SDavid du Colombier #pragma varargck type "C" int 102567483c8SDavid du Colombier #pragma varargck type "d" uint 103567483c8SDavid du Colombier #pragma varargck type "x" uint 104567483c8SDavid du Colombier #pragma varargck type "c" uint 105567483c8SDavid du Colombier #pragma varargck type "C" uint 106567483c8SDavid du Colombier #pragma varargck type "s" char* 107567483c8SDavid du Colombier #pragma varargck type "q" char* 108567483c8SDavid du Colombier #pragma varargck type "S" Rune* 109567483c8SDavid du Colombier #pragma varargck type "%" void 110567483c8SDavid du Colombier #pragma varargck type "p" uintptr 111567483c8SDavid du Colombier #pragma varargck type "p" void* 112567483c8SDavid du Colombier #pragma varargck flag ',' 113567483c8SDavid du Colombier 114fcbb35d1SDavid du Colombier extern int fmtstrinit(Fmt*); 115567483c8SDavid du Colombier extern int fmtinstall(int, int (*)(Fmt*)); 116567483c8SDavid du Colombier extern void quotefmtinstall(void); 117567483c8SDavid du Colombier extern int fmtprint(Fmt*, char*, ...); 118567483c8SDavid du Colombier extern int fmtstrcpy(Fmt*, char*); 119fcbb35d1SDavid du Colombier extern char* fmtstrflush(Fmt*); 1203e12c5d1SDavid du Colombier 1213e12c5d1SDavid du Colombier /* 1223e12c5d1SDavid du Colombier * one-of-a-kind 1233e12c5d1SDavid du Colombier */ 1247dd7cddfSDavid du Colombier extern char* cleanname(char*); 1257dd7cddfSDavid du Colombier extern ulong getcallerpc(void*); 1269a747e4fSDavid du Colombier 1273e12c5d1SDavid du Colombier extern long strtol(char*, char**, int); 1283e12c5d1SDavid du Colombier extern ulong strtoul(char*, char**, int); 1297dd7cddfSDavid du Colombier extern vlong strtoll(char*, char**, int); 1307dd7cddfSDavid du Colombier extern uvlong strtoull(char*, char**, int); 1313e12c5d1SDavid du Colombier extern char etext[]; 1323e12c5d1SDavid du Colombier extern char edata[]; 1333e12c5d1SDavid du Colombier extern char end[]; 1347dd7cddfSDavid du Colombier extern int getfields(char*, char**, int, int, char*); 1359a747e4fSDavid du Colombier extern int tokenize(char*, char**, int); 1369a747e4fSDavid du Colombier extern int dec64(uchar*, int, char*, int); 137567483c8SDavid du Colombier extern int encodefmt(Fmt*); 1384de34a7eSDavid du Colombier extern void qsort(void*, long, long, int (*)(void*, void*)); 1397dd7cddfSDavid du Colombier 1403e12c5d1SDavid du Colombier /* 1413e12c5d1SDavid du Colombier * Syscall data structures 1423e12c5d1SDavid du Colombier */ 1433e12c5d1SDavid du Colombier #define MORDER 0x0003 /* mask for bits defining order of mounting */ 1443e12c5d1SDavid du Colombier #define MREPL 0x0000 /* mount replaces object */ 1453e12c5d1SDavid du Colombier #define MBEFORE 0x0001 /* mount goes before others in union directory */ 1463e12c5d1SDavid du Colombier #define MAFTER 0x0002 /* mount goes after others in union directory */ 1473e12c5d1SDavid du Colombier #define MCREATE 0x0004 /* permit creation in mounted directory */ 1487dd7cddfSDavid du Colombier #define MCACHE 0x0010 /* cache some data */ 1499a747e4fSDavid du Colombier #define MMASK 0x0017 /* all bits on */ 1503e12c5d1SDavid du Colombier 1513e12c5d1SDavid du Colombier #define OREAD 0 /* open for read */ 1523e12c5d1SDavid du Colombier #define OWRITE 1 /* write */ 1533e12c5d1SDavid du Colombier #define ORDWR 2 /* read and write */ 1543e12c5d1SDavid du Colombier #define OEXEC 3 /* execute, == read but check execute permission */ 1553e12c5d1SDavid du Colombier #define OTRUNC 16 /* or'ed in (except for exec), truncate file first */ 1563e12c5d1SDavid du Colombier #define OCEXEC 32 /* or'ed in, close on exec */ 1573e12c5d1SDavid du Colombier #define ORCLOSE 64 /* or'ed in, remove on close */ 1589a747e4fSDavid du Colombier #define OEXCL 0x1000 /* or'ed in, exclusive create */ 1593e12c5d1SDavid du Colombier 1603e12c5d1SDavid du Colombier #define NCONT 0 /* continue after note */ 1613e12c5d1SDavid du Colombier #define NDFLT 1 /* terminate after note */ 162219b2ee8SDavid du Colombier #define NSAVE 2 /* clear note but hold state */ 163219b2ee8SDavid du Colombier #define NRSTR 3 /* restore saved state */ 1643e12c5d1SDavid du Colombier 1653e12c5d1SDavid du Colombier typedef struct Qid Qid; 1663e12c5d1SDavid du Colombier typedef struct Dir Dir; 1679a747e4fSDavid du Colombier typedef struct OWaitmsg OWaitmsg; 1683e12c5d1SDavid du Colombier typedef struct Waitmsg Waitmsg; 1693e12c5d1SDavid du Colombier 1709a747e4fSDavid du Colombier #define ERRMAX 128 /* max length of error string */ 1719a747e4fSDavid du Colombier #define KNAMELEN 28 /* max length of name held in kernel */ 1729a747e4fSDavid du Colombier 1739a747e4fSDavid du Colombier /* bits in Qid.type */ 1749a747e4fSDavid du Colombier #define QTDIR 0x80 /* type bit for directories */ 1759a747e4fSDavid du Colombier #define QTAPPEND 0x40 /* type bit for append only files */ 1769a747e4fSDavid du Colombier #define QTEXCL 0x20 /* type bit for exclusive use files */ 1779a747e4fSDavid du Colombier #define QTMOUNT 0x10 /* type bit for mounted channel */ 1789a747e4fSDavid du Colombier #define QTAUTH 0x08 /* type bit for authentication file */ 1799a747e4fSDavid du Colombier #define QTFILE 0x00 /* plain file */ 1809a747e4fSDavid du Colombier 1819a747e4fSDavid du Colombier /* bits in Dir.mode */ 1829a747e4fSDavid du Colombier #define DMDIR 0x80000000 /* mode bit for directories */ 1839a747e4fSDavid du Colombier #define DMAPPEND 0x40000000 /* mode bit for append only files */ 1849a747e4fSDavid du Colombier #define DMEXCL 0x20000000 /* mode bit for exclusive use files */ 1859a747e4fSDavid du Colombier #define DMMOUNT 0x10000000 /* mode bit for mounted channel */ 1869a747e4fSDavid du Colombier #define DMREAD 0x4 /* mode bit for read permission */ 1879a747e4fSDavid du Colombier #define DMWRITE 0x2 /* mode bit for write permission */ 1889a747e4fSDavid du Colombier #define DMEXEC 0x1 /* mode bit for execute permission */ 1893e12c5d1SDavid du Colombier 1903e12c5d1SDavid du Colombier struct Qid 1913e12c5d1SDavid du Colombier { 192061a3f44SDavid du Colombier uvlong path; 1933e12c5d1SDavid du Colombier ulong vers; 1949a747e4fSDavid du Colombier uchar type; 1953e12c5d1SDavid du Colombier }; 1963e12c5d1SDavid du Colombier 1979a747e4fSDavid du Colombier struct Dir { 1989a747e4fSDavid du Colombier /* system-modified data */ 1999a747e4fSDavid du Colombier ushort type; /* server type */ 2009a747e4fSDavid du Colombier uint dev; /* server subtype */ 2019a747e4fSDavid du Colombier /* file data */ 2029a747e4fSDavid du Colombier Qid qid; /* unique id from server */ 2039a747e4fSDavid du Colombier ulong mode; /* permissions */ 2049a747e4fSDavid du Colombier ulong atime; /* last read time */ 2059a747e4fSDavid du Colombier ulong mtime; /* last write time */ 2069a747e4fSDavid du Colombier vlong length; /* file length: see <u.h> */ 2079a747e4fSDavid du Colombier char *name; /* last element of path */ 2089a747e4fSDavid du Colombier char *uid; /* owner name */ 2099a747e4fSDavid du Colombier char *gid; /* group name */ 2109a747e4fSDavid du Colombier char *muid; /* last modifier name */ 2119a747e4fSDavid du Colombier }; 2129a747e4fSDavid du Colombier 2139a747e4fSDavid du Colombier struct OWaitmsg 2143e12c5d1SDavid du Colombier { 2159a747e4fSDavid du Colombier char pid[12]; /* of loved one */ 2169a747e4fSDavid du Colombier char time[3*12]; /* of loved one and descendants */ 2179a747e4fSDavid du Colombier char msg[64]; /* compatibility BUG */ 2183e12c5d1SDavid du Colombier }; 2193e12c5d1SDavid du Colombier 2203e12c5d1SDavid du Colombier struct Waitmsg 2213e12c5d1SDavid du Colombier { 2229a747e4fSDavid du Colombier int pid; /* of loved one */ 2239a747e4fSDavid du Colombier ulong time[3]; /* of loved one and descendants */ 2249a747e4fSDavid du Colombier char msg[ERRMAX]; /* actually variable-size in user mode */ 2253e12c5d1SDavid du Colombier }; 226