174a4d8c2SCharles.Forsyth 274a4d8c2SCharles.Forsyth /* 374a4d8c2SCharles.Forsyth * functions (possibly) linked in, complete, from libc. 474a4d8c2SCharles.Forsyth */ 5e1bd49a1SCharles.Forsyth #define nelem(x) (sizeof(x)/sizeof((x)[0])) 6b5eeadadSCharles.Forsyth #define offsetof(s, m) (ulong)(&(((s*)0)->m)) 7b5eeadadSCharles.Forsyth #define assert(x) if(x){}else _assert("x") 874a4d8c2SCharles.Forsyth 974a4d8c2SCharles.Forsyth /* 1074a4d8c2SCharles.Forsyth * mem routines 1174a4d8c2SCharles.Forsyth */ 1274a4d8c2SCharles.Forsyth extern void* memccpy(void*, void*, int, ulong); 1374a4d8c2SCharles.Forsyth extern void* memset(void*, int, ulong); 1474a4d8c2SCharles.Forsyth extern int memcmp(void*, void*, ulong); 1574a4d8c2SCharles.Forsyth extern void* memmove(void*, void*, ulong); 1674a4d8c2SCharles.Forsyth extern void* memchr(void*, int, ulong); 1774a4d8c2SCharles.Forsyth 1874a4d8c2SCharles.Forsyth /* 1974a4d8c2SCharles.Forsyth * string routines 2074a4d8c2SCharles.Forsyth */ 2174a4d8c2SCharles.Forsyth extern char* strcat(char*, char*); 2274a4d8c2SCharles.Forsyth extern char* strchr(char*, int); 2374a4d8c2SCharles.Forsyth extern char* strrchr(char*, int); 2474a4d8c2SCharles.Forsyth extern int strcmp(char*, char*); 2574a4d8c2SCharles.Forsyth extern char* strcpy(char*, char*); 2674a4d8c2SCharles.Forsyth extern char* strecpy(char*, char*, char*); 2774a4d8c2SCharles.Forsyth extern char* strncat(char*, char*, long); 2874a4d8c2SCharles.Forsyth extern char* strncpy(char*, char*, long); 2974a4d8c2SCharles.Forsyth extern int strncmp(char*, char*, long); 3074a4d8c2SCharles.Forsyth extern long strlen(char*); 3174a4d8c2SCharles.Forsyth extern char* strdup(char*); 3274a4d8c2SCharles.Forsyth extern char* strstr(char*, char*); 3374a4d8c2SCharles.Forsyth extern int cistrncmp(char*, char*, int); 3474a4d8c2SCharles.Forsyth extern int cistrcmp(char*, char*); 3574a4d8c2SCharles.Forsyth extern char* cistrstr(char*, char*); 3674a4d8c2SCharles.Forsyth extern int atoi(char*); 3774a4d8c2SCharles.Forsyth extern int fullrune(char*, int); 3874a4d8c2SCharles.Forsyth 3974a4d8c2SCharles.Forsyth enum 4074a4d8c2SCharles.Forsyth { 41*db76ee8dSCharles Forsyth UTFmax = 4, /* maximum bytes per rune */ 42*db76ee8dSCharles Forsyth Runesync = 0x80, /* cannot represent part of a UTF sequence (<) */ 4374a4d8c2SCharles.Forsyth Runeself = 0x80, /* rune and UTF sequences are the same (<) */ 44*db76ee8dSCharles Forsyth Runeerror = 0xFFFD, /* decoding error in UTF */ 45*db76ee8dSCharles Forsyth Runemax = 0x10FFFF, /* 21-bit rune */ 46*db76ee8dSCharles Forsyth Runemask = 0x1FFFFF, /* bits used by runes (see grep) */ 4774a4d8c2SCharles.Forsyth }; 4874a4d8c2SCharles.Forsyth 4974a4d8c2SCharles.Forsyth /* 5074a4d8c2SCharles.Forsyth * rune routines 5174a4d8c2SCharles.Forsyth */ 5274a4d8c2SCharles.Forsyth extern int runetochar(char*, Rune*); 5374a4d8c2SCharles.Forsyth extern int chartorune(Rune*, char*); 5474a4d8c2SCharles.Forsyth extern char* utfrune(char*, long); 5574a4d8c2SCharles.Forsyth extern int utflen(char*); 5674a4d8c2SCharles.Forsyth extern int runelen(long); 5774a4d8c2SCharles.Forsyth 5874a4d8c2SCharles.Forsyth extern int abs(int); 5974a4d8c2SCharles.Forsyth 6074a4d8c2SCharles.Forsyth /* 6174a4d8c2SCharles.Forsyth * print routines 6274a4d8c2SCharles.Forsyth */ 6374a4d8c2SCharles.Forsyth typedef struct Fmt Fmt; 6474a4d8c2SCharles.Forsyth typedef int (*Fmts)(Fmt*); 6574a4d8c2SCharles.Forsyth struct Fmt{ 6674a4d8c2SCharles.Forsyth uchar runes; /* output buffer is runes or chars? */ 6774a4d8c2SCharles.Forsyth void *start; /* of buffer */ 6874a4d8c2SCharles.Forsyth void *to; /* current place in the buffer */ 6974a4d8c2SCharles.Forsyth void *stop; /* end of the buffer; overwritten if flush fails */ 7074a4d8c2SCharles.Forsyth int (*flush)(Fmt *); /* called when to == stop */ 7174a4d8c2SCharles.Forsyth void *farg; /* to make flush a closure */ 7274a4d8c2SCharles.Forsyth int nfmt; /* num chars formatted so far */ 7374a4d8c2SCharles.Forsyth va_list args; /* args passed to dofmt */ 7474a4d8c2SCharles.Forsyth int r; /* % format Rune */ 7574a4d8c2SCharles.Forsyth int width; 7674a4d8c2SCharles.Forsyth int prec; 7774a4d8c2SCharles.Forsyth ulong flags; 7874a4d8c2SCharles.Forsyth }; 7974a4d8c2SCharles.Forsyth extern int print(char*, ...); 8074a4d8c2SCharles.Forsyth extern char* seprint(char*, char*, char*, ...); 8174a4d8c2SCharles.Forsyth extern char* vseprint(char*, char*, char*, va_list); 8274a4d8c2SCharles.Forsyth extern char* smprint(char*, ...); 8374a4d8c2SCharles.Forsyth extern char* vsmprint(char*, va_list); 8474a4d8c2SCharles.Forsyth extern int snprint(char*, int, char*, ...); 8574a4d8c2SCharles.Forsyth extern int vsnprint(char*, int, char*, va_list); 8674a4d8c2SCharles.Forsyth extern int sprint(char*, char*, ...); 8774a4d8c2SCharles.Forsyth 8874a4d8c2SCharles.Forsyth extern int fmtinstall(int, int (*)(Fmt*)); 8974a4d8c2SCharles.Forsyth extern void quotefmtinstall(void); 9074a4d8c2SCharles.Forsyth extern int fmtprint(Fmt*, char*, ...); 9174a4d8c2SCharles.Forsyth extern int fmtstrcpy(Fmt*, char*); 9274a4d8c2SCharles.Forsyth 9374a4d8c2SCharles.Forsyth #pragma varargck argpos fmtprint 2 9474a4d8c2SCharles.Forsyth #pragma varargck argpos print 1 9574a4d8c2SCharles.Forsyth #pragma varargck argpos seprint 3 9674a4d8c2SCharles.Forsyth #pragma varargck argpos snprint 3 9774a4d8c2SCharles.Forsyth #pragma varargck argpos sprint 2 9874a4d8c2SCharles.Forsyth #pragma varargck argpos vseprint 3 9974a4d8c2SCharles.Forsyth #pragma varargck argpos vsnprint 3 10074a4d8c2SCharles.Forsyth 10174a4d8c2SCharles.Forsyth extern int fltconv(Fmt*); 10274a4d8c2SCharles.Forsyth 10374a4d8c2SCharles.Forsyth /* 10474a4d8c2SCharles.Forsyth * math 10574a4d8c2SCharles.Forsyth */ 10674a4d8c2SCharles.Forsyth extern int isNaN(double); 10774a4d8c2SCharles.Forsyth extern int isInf(double, int); 10874a4d8c2SCharles.Forsyth extern double floor(double); 10974a4d8c2SCharles.Forsyth extern double frexp(double, int*); 11074a4d8c2SCharles.Forsyth extern double pow10(int); 11174a4d8c2SCharles.Forsyth 11274a4d8c2SCharles.Forsyth /* 11374a4d8c2SCharles.Forsyth * one-of-a-kind 11474a4d8c2SCharles.Forsyth */ 11574a4d8c2SCharles.Forsyth extern char* cleanname(char*); 11674a4d8c2SCharles.Forsyth extern ulong getcallerpc(void*); 11774a4d8c2SCharles.Forsyth 11874a4d8c2SCharles.Forsyth extern long strtol(char*, char**, int); 11974a4d8c2SCharles.Forsyth extern ulong strtoul(char*, char**, int); 12074a4d8c2SCharles.Forsyth extern vlong strtoll(char*, char**, int); 12174a4d8c2SCharles.Forsyth extern uvlong strtoull(char*, char**, int); 12274a4d8c2SCharles.Forsyth extern char etext[]; 12374a4d8c2SCharles.Forsyth extern char edata[]; 12474a4d8c2SCharles.Forsyth extern char end[]; 12574a4d8c2SCharles.Forsyth extern int getfields(char*, char**, int, int, char*); 12674a4d8c2SCharles.Forsyth extern int tokenize(char*, char**, int); 12774a4d8c2SCharles.Forsyth extern int dec64(uchar*, int, char*, int); 128e1bd49a1SCharles.Forsyth extern void qsort(void*, long, long, int (*)(void*, void*)); 12974a4d8c2SCharles.Forsyth 13074a4d8c2SCharles.Forsyth extern int toupper(int); 13174a4d8c2SCharles.Forsyth extern char* netmkaddr(char*, char*, char*); 13274a4d8c2SCharles.Forsyth extern int myetheraddr(uchar*, char*); 13374a4d8c2SCharles.Forsyth extern int parseether(uchar*, char*); 13474a4d8c2SCharles.Forsyth 13574a4d8c2SCharles.Forsyth /* 13674a4d8c2SCharles.Forsyth * network dialling 13774a4d8c2SCharles.Forsyth */ 13874a4d8c2SCharles.Forsyth #define NETPATHLEN 40 13974a4d8c2SCharles.Forsyth 14074a4d8c2SCharles.Forsyth /* 14174a4d8c2SCharles.Forsyth * Syscall data structures 14274a4d8c2SCharles.Forsyth */ 14374a4d8c2SCharles.Forsyth #define MORDER 0x0003 /* mask for bits defining order of mounting */ 14474a4d8c2SCharles.Forsyth #define MREPL 0x0000 /* mount replaces object */ 14574a4d8c2SCharles.Forsyth #define MBEFORE 0x0001 /* mount goes before others in union directory */ 14674a4d8c2SCharles.Forsyth #define MAFTER 0x0002 /* mount goes after others in union directory */ 14774a4d8c2SCharles.Forsyth #define MCREATE 0x0004 /* permit creation in mounted directory */ 14874a4d8c2SCharles.Forsyth #define MCACHE 0x0010 /* cache some data */ 14974a4d8c2SCharles.Forsyth #define MMASK 0x0017 /* all bits on */ 15074a4d8c2SCharles.Forsyth 15174a4d8c2SCharles.Forsyth #define OREAD 0 /* open for read */ 15274a4d8c2SCharles.Forsyth #define OWRITE 1 /* write */ 15374a4d8c2SCharles.Forsyth #define ORDWR 2 /* read and write */ 15474a4d8c2SCharles.Forsyth #define OEXEC 3 /* execute, == read but check execute permission */ 15574a4d8c2SCharles.Forsyth #define OTRUNC 16 /* or'ed in (except for exec), truncate file first */ 15674a4d8c2SCharles.Forsyth #define OCEXEC 32 /* or'ed in, close on exec */ 15774a4d8c2SCharles.Forsyth #define ORCLOSE 64 /* or'ed in, remove on close */ 15874a4d8c2SCharles.Forsyth #define OEXCL 0x1000 /* or'ed in, exclusive create */ 15974a4d8c2SCharles.Forsyth 16074a4d8c2SCharles.Forsyth #define NCONT 0 /* continue after note */ 16174a4d8c2SCharles.Forsyth #define NDFLT 1 /* terminate after note */ 16274a4d8c2SCharles.Forsyth #define NSAVE 2 /* clear note but hold state */ 16374a4d8c2SCharles.Forsyth #define NRSTR 3 /* restore saved state */ 16474a4d8c2SCharles.Forsyth 16574a4d8c2SCharles.Forsyth typedef struct Qid Qid; 16674a4d8c2SCharles.Forsyth typedef struct Dir Dir; 16774a4d8c2SCharles.Forsyth typedef struct Waitmsg Waitmsg; 16874a4d8c2SCharles.Forsyth 169463f3a97SCharles.Forsyth #define STATMAX 65535U /* max length of machine-independent stat structure */ 17074a4d8c2SCharles.Forsyth #define ERRMAX 128 /* max length of error string */ 17174a4d8c2SCharles.Forsyth #define KNAMELEN 28 /* max length of name held in kernel */ 17274a4d8c2SCharles.Forsyth 17374a4d8c2SCharles.Forsyth /* bits in Qid.type */ 17474a4d8c2SCharles.Forsyth #define QTDIR 0x80 /* type bit for directories */ 17574a4d8c2SCharles.Forsyth #define QTAPPEND 0x40 /* type bit for append only files */ 17674a4d8c2SCharles.Forsyth #define QTEXCL 0x20 /* type bit for exclusive use files */ 17774a4d8c2SCharles.Forsyth #define QTMOUNT 0x10 /* type bit for mounted channel */ 17874a4d8c2SCharles.Forsyth #define QTAUTH 0x08 /* type bit for authentication file */ 17974a4d8c2SCharles.Forsyth #define QTFILE 0x00 /* plain file */ 18074a4d8c2SCharles.Forsyth 18174a4d8c2SCharles.Forsyth /* bits in Dir.mode */ 18274a4d8c2SCharles.Forsyth #define DMDIR 0x80000000 /* mode bit for directories */ 18374a4d8c2SCharles.Forsyth #define DMAPPEND 0x40000000 /* mode bit for append only files */ 18474a4d8c2SCharles.Forsyth #define DMEXCL 0x20000000 /* mode bit for exclusive use files */ 18574a4d8c2SCharles.Forsyth #define DMMOUNT 0x10000000 /* mode bit for mounted channel */ 18674a4d8c2SCharles.Forsyth #define DMREAD 0x4 /* mode bit for read permission */ 18774a4d8c2SCharles.Forsyth #define DMWRITE 0x2 /* mode bit for write permission */ 18874a4d8c2SCharles.Forsyth #define DMEXEC 0x1 /* mode bit for execute permission */ 18974a4d8c2SCharles.Forsyth 19074a4d8c2SCharles.Forsyth struct Qid 19174a4d8c2SCharles.Forsyth { 19274a4d8c2SCharles.Forsyth uvlong path; 19374a4d8c2SCharles.Forsyth ulong vers; 19474a4d8c2SCharles.Forsyth uchar type; 19574a4d8c2SCharles.Forsyth }; 19674a4d8c2SCharles.Forsyth 19774a4d8c2SCharles.Forsyth struct Dir { 19874a4d8c2SCharles.Forsyth /* system-modified data */ 19974a4d8c2SCharles.Forsyth ushort type; /* server type */ 20074a4d8c2SCharles.Forsyth uint dev; /* server subtype */ 20174a4d8c2SCharles.Forsyth /* file data */ 20274a4d8c2SCharles.Forsyth Qid qid; /* unique id from server */ 20374a4d8c2SCharles.Forsyth ulong mode; /* permissions */ 20474a4d8c2SCharles.Forsyth ulong atime; /* last read time */ 20574a4d8c2SCharles.Forsyth ulong mtime; /* last write time */ 20674a4d8c2SCharles.Forsyth vlong length; /* file length: see <u.h> */ 20774a4d8c2SCharles.Forsyth char *name; /* last element of path */ 20874a4d8c2SCharles.Forsyth char *uid; /* owner name */ 20974a4d8c2SCharles.Forsyth char *gid; /* group name */ 21074a4d8c2SCharles.Forsyth char *muid; /* last modifier name */ 21174a4d8c2SCharles.Forsyth }; 21274a4d8c2SCharles.Forsyth 21374a4d8c2SCharles.Forsyth struct Waitmsg 21474a4d8c2SCharles.Forsyth { 21574a4d8c2SCharles.Forsyth int pid; /* of loved one */ 21674a4d8c2SCharles.Forsyth ulong time[3]; /* of loved one and descendants */ 21774a4d8c2SCharles.Forsyth char msg[ERRMAX]; /* actually variable-size in user mode */ 21874a4d8c2SCharles.Forsyth }; 219