18ccd4a63SDavid du Colombier /* avoid name conflicts */ 28ccd4a63SDavid du Colombier #define accept pm_accept 38ccd4a63SDavid du Colombier #define listen pm_listen 48ccd4a63SDavid du Colombier #define sleep ksleep 58ccd4a63SDavid du Colombier #define wakeup kwakeup 6*58da3067SDavid du Colombier #ifdef strtod 7*58da3067SDavid du Colombier #undef strtod 8*58da3067SDavid du Colombier #endif 90d601874SDavid du Colombier #define strtod fmtstrtod 108ccd4a63SDavid du Colombier 118ccd4a63SDavid du Colombier /* conflicts on some os's */ 128ccd4a63SDavid du Colombier #define encrypt libencrypt 138ccd4a63SDavid du Colombier #define decrypt libdecrypt 148ccd4a63SDavid du Colombier #define oserror liboserror 158ccd4a63SDavid du Colombier #define clone libclone 168ccd4a63SDavid du Colombier #define atexit libatexit 178ccd4a63SDavid du Colombier #define log2 liblog2 188ccd4a63SDavid du Colombier #define log liblog 198ccd4a63SDavid du Colombier #define reboot libreboot 2096cbc34fSDavid du Colombier #define strtoll libstrtoll 218ccd4a63SDavid du Colombier #undef timeradd 228ccd4a63SDavid du Colombier #define timeradd xtimeradd 238ccd4a63SDavid du Colombier 248ccd4a63SDavid du Colombier 258ccd4a63SDavid du Colombier #define nil ((void*)0) 268ccd4a63SDavid du Colombier 278ccd4a63SDavid du Colombier typedef unsigned char p9_uchar; 288ccd4a63SDavid du Colombier typedef unsigned int p9_uint; 298ccd4a63SDavid du Colombier typedef unsigned int p9_ulong; 308ccd4a63SDavid du Colombier typedef int p9_long; 318ccd4a63SDavid du Colombier typedef signed char p9_schar; 328ccd4a63SDavid du Colombier typedef unsigned short p9_ushort; 33a1216cc6SDavid du Colombier typedef unsigned int Rune; 348ccd4a63SDavid du Colombier typedef unsigned int p9_u32int; 358ccd4a63SDavid du Colombier typedef p9_u32int mpdigit; 368ccd4a63SDavid du Colombier 378ccd4a63SDavid du Colombier /* make sure we don't conflict with predefined types */ 388ccd4a63SDavid du Colombier #define schar p9_schar 398ccd4a63SDavid du Colombier #define uchar p9_uchar 408ccd4a63SDavid du Colombier #define ushort p9_ushort 418ccd4a63SDavid du Colombier #define uint p9_uint 428ccd4a63SDavid du Colombier #define u32int p9_u32int 438ccd4a63SDavid du Colombier 448ccd4a63SDavid du Colombier /* #define long int rather than p9_long so that "unsigned long" is valid */ 458ccd4a63SDavid du Colombier #define long int 468ccd4a63SDavid du Colombier #define ulong p9_ulong 478ccd4a63SDavid du Colombier #define vlong p9_vlong 488ccd4a63SDavid du Colombier #define uvlong p9_uvlong 498ccd4a63SDavid du Colombier 508ccd4a63SDavid du Colombier #define nelem(x) (sizeof(x)/sizeof((x)[0])) 518ccd4a63SDavid du Colombier #define SET(x) ((x)=0) 528ccd4a63SDavid du Colombier #define USED(x) if(x);else 538ccd4a63SDavid du Colombier 548ccd4a63SDavid du Colombier enum 558ccd4a63SDavid du Colombier { 56a1216cc6SDavid du Colombier UTFmax = 4, /* maximum bytes per rune */ 578ccd4a63SDavid du Colombier Runesync = 0x80, /* cannot represent part of a UTF sequence (<) */ 588ccd4a63SDavid du Colombier Runeself = 0x80, /* rune and UTF sequences are the same (<) */ 59a1216cc6SDavid du Colombier Runeerror = 0xFFFD, /* decoding error in UTF */ 60a1216cc6SDavid du Colombier Runemax = 0x10FFFF, /* 21-bit rune */ 61a1216cc6SDavid du Colombier Runemask = 0x1FFFFF, /* bits used by runes (see grep) */ 628ccd4a63SDavid du Colombier }; 638ccd4a63SDavid du Colombier 648ccd4a63SDavid du Colombier /* 6596cbc34fSDavid du Colombier * new rune routines 668ccd4a63SDavid du Colombier */ 678ccd4a63SDavid du Colombier extern int runetochar(char*, Rune*); 688ccd4a63SDavid du Colombier extern int chartorune(Rune*, char*); 698ccd4a63SDavid du Colombier extern int runelen(long); 708ccd4a63SDavid du Colombier extern int fullrune(char*, int); 7196cbc34fSDavid du Colombier 7296cbc34fSDavid du Colombier extern int wstrtoutf(char*, Rune*, int); 7396cbc34fSDavid du Colombier extern int wstrutflen(Rune*); 7496cbc34fSDavid du Colombier 7596cbc34fSDavid du Colombier /* 7696cbc34fSDavid du Colombier * rune routines from converted str routines 7796cbc34fSDavid du Colombier */ 7896cbc34fSDavid du Colombier extern long utflen(char*); 798ccd4a63SDavid du Colombier extern char* utfrune(char*, long); 808ccd4a63SDavid du Colombier extern char* utfrrune(char*, long); 818ccd4a63SDavid du Colombier 828ccd4a63SDavid du Colombier /* 838ccd4a63SDavid du Colombier * Syscall data structures 848ccd4a63SDavid du Colombier */ 858ccd4a63SDavid du Colombier #define MORDER 0x0003 /* mask for bits defining order of mounting */ 868ccd4a63SDavid du Colombier #define MREPL 0x0000 /* mount replaces object */ 878ccd4a63SDavid du Colombier #define MBEFORE 0x0001 /* mount goes before others in union directory */ 888ccd4a63SDavid du Colombier #define MAFTER 0x0002 /* mount goes after others in union directory */ 898ccd4a63SDavid du Colombier #define MCREATE 0x0004 /* permit creation in mounted directory */ 908ccd4a63SDavid du Colombier #define MCACHE 0x0010 /* cache some data */ 918ccd4a63SDavid du Colombier #define MMASK 0x0017 /* all bits on */ 928ccd4a63SDavid du Colombier 938ccd4a63SDavid du Colombier #define OREAD 0 /* open for read */ 948ccd4a63SDavid du Colombier #define OWRITE 1 /* write */ 958ccd4a63SDavid du Colombier #define ORDWR 2 /* read and write */ 968ccd4a63SDavid du Colombier #define OEXEC 3 /* execute, == read but check execute permission */ 978ccd4a63SDavid du Colombier #define OTRUNC 16 /* or'ed in (except for exec), truncate file first */ 988ccd4a63SDavid du Colombier #define OCEXEC 32 /* or'ed in, close on exec */ 998ccd4a63SDavid du Colombier #define ORCLOSE 64 /* or'ed in, remove on close */ 1008ccd4a63SDavid du Colombier #define OEXCL 0x1000 /* or'ed in, exclusive create */ 1018ccd4a63SDavid du Colombier 1028ccd4a63SDavid du Colombier #define NCONT 0 /* continue after note */ 1038ccd4a63SDavid du Colombier #define NDFLT 1 /* terminate after note */ 1048ccd4a63SDavid du Colombier #define NSAVE 2 /* clear note but hold state */ 1058ccd4a63SDavid du Colombier #define NRSTR 3 /* restore saved state */ 1068ccd4a63SDavid du Colombier 1078ccd4a63SDavid du Colombier #define ERRMAX 128 /* max length of error string */ 1088ccd4a63SDavid du Colombier #define KNAMELEN 28 /* max length of name held in kernel */ 1098ccd4a63SDavid du Colombier 1108ccd4a63SDavid du Colombier /* bits in Qid.type */ 1118ccd4a63SDavid du Colombier #define QTDIR 0x80 /* type bit for directories */ 1128ccd4a63SDavid du Colombier #define QTAPPEND 0x40 /* type bit for append only files */ 1138ccd4a63SDavid du Colombier #define QTEXCL 0x20 /* type bit for exclusive use files */ 1148ccd4a63SDavid du Colombier #define QTMOUNT 0x10 /* type bit for mounted channel */ 1158ccd4a63SDavid du Colombier #define QTAUTH 0x08 /* type bit for authentication file */ 1168ccd4a63SDavid du Colombier #define QTFILE 0x00 /* plain file */ 1178ccd4a63SDavid du Colombier 1188ccd4a63SDavid du Colombier /* bits in Dir.mode */ 1198ccd4a63SDavid du Colombier #define DMDIR 0x80000000 /* mode bit for directories */ 1208ccd4a63SDavid du Colombier #define DMAPPEND 0x40000000 /* mode bit for append only files */ 1218ccd4a63SDavid du Colombier #define DMEXCL 0x20000000 /* mode bit for exclusive use files */ 1228ccd4a63SDavid du Colombier #define DMMOUNT 0x10000000 /* mode bit for mounted channel */ 1238ccd4a63SDavid du Colombier #define DMAUTH 0x08000000 /* mode bit for authentication files */ 1248ccd4a63SDavid du Colombier #define DMREAD 0x4 /* mode bit for read permission */ 1258ccd4a63SDavid du Colombier #define DMWRITE 0x2 /* mode bit for write permission */ 1268ccd4a63SDavid du Colombier #define DMEXEC 0x1 /* mode bit for execute permission */ 1278ccd4a63SDavid du Colombier 1288ccd4a63SDavid du Colombier typedef struct Lock 1298ccd4a63SDavid du Colombier { 13096cbc34fSDavid du Colombier #ifdef PTHREAD 13196cbc34fSDavid du Colombier int init; 13296cbc34fSDavid du Colombier pthread_mutex_t mutex; 13396cbc34fSDavid du Colombier #else 1348ccd4a63SDavid du Colombier long key; 13596cbc34fSDavid du Colombier #endif 1368ccd4a63SDavid du Colombier } Lock; 1378ccd4a63SDavid du Colombier 1388ccd4a63SDavid du Colombier typedef struct QLock 1398ccd4a63SDavid du Colombier { 1408ccd4a63SDavid du Colombier Lock lk; 1418ccd4a63SDavid du Colombier struct Proc *hold; 1428ccd4a63SDavid du Colombier struct Proc *first; 1438ccd4a63SDavid du Colombier struct Proc *last; 1448ccd4a63SDavid du Colombier } QLock; 1458ccd4a63SDavid du Colombier 1468ccd4a63SDavid du Colombier typedef 1478ccd4a63SDavid du Colombier struct Qid 1488ccd4a63SDavid du Colombier { 1498ccd4a63SDavid du Colombier uvlong path; 1508ccd4a63SDavid du Colombier ulong vers; 1518ccd4a63SDavid du Colombier uchar type; 1528ccd4a63SDavid du Colombier } Qid; 1538ccd4a63SDavid du Colombier 1548ccd4a63SDavid du Colombier typedef 1558ccd4a63SDavid du Colombier struct Dir { 1568ccd4a63SDavid du Colombier /* system-modified data */ 1578ccd4a63SDavid du Colombier ushort type; /* server type */ 1588ccd4a63SDavid du Colombier uint dev; /* server subtype */ 1598ccd4a63SDavid du Colombier /* file data */ 1608ccd4a63SDavid du Colombier Qid qid; /* unique id from server */ 1618ccd4a63SDavid du Colombier ulong mode; /* permissions */ 1628ccd4a63SDavid du Colombier ulong atime; /* last read time */ 1638ccd4a63SDavid du Colombier ulong mtime; /* last write time */ 1648ccd4a63SDavid du Colombier vlong length; /* file length */ 1658ccd4a63SDavid du Colombier char *name; /* last element of path */ 1668ccd4a63SDavid du Colombier char *uid; /* owner name */ 1678ccd4a63SDavid du Colombier char *gid; /* group name */ 1688ccd4a63SDavid du Colombier char *muid; /* last modifier name */ 1698ccd4a63SDavid du Colombier } Dir; 1708ccd4a63SDavid du Colombier 1718ccd4a63SDavid du Colombier typedef 1728ccd4a63SDavid du Colombier struct Waitmsg 1738ccd4a63SDavid du Colombier { 1748ccd4a63SDavid du Colombier int pid; /* of loved one */ 1758ccd4a63SDavid du Colombier ulong time[3]; /* of loved one & descendants */ 1768ccd4a63SDavid du Colombier char *msg; 1778ccd4a63SDavid du Colombier } Waitmsg; 1788ccd4a63SDavid du Colombier 1798ccd4a63SDavid du Colombier /* 1808ccd4a63SDavid du Colombier * print routines 1818ccd4a63SDavid du Colombier */ 1828ccd4a63SDavid du Colombier typedef struct Fmt Fmt; 1838ccd4a63SDavid du Colombier struct Fmt{ 1848ccd4a63SDavid du Colombier uchar runes; /* output buffer is runes or chars? */ 1858ccd4a63SDavid du Colombier void *start; /* of buffer */ 1868ccd4a63SDavid du Colombier void *to; /* current place in the buffer */ 1878ccd4a63SDavid du Colombier void *stop; /* end of the buffer; overwritten if flush fails */ 1888ccd4a63SDavid du Colombier int (*flush)(Fmt *); /* called when to == stop */ 1898ccd4a63SDavid du Colombier void *farg; /* to make flush a closure */ 1908ccd4a63SDavid du Colombier int nfmt; /* num chars formatted so far */ 1918ccd4a63SDavid du Colombier va_list args; /* args passed to dofmt */ 1928ccd4a63SDavid du Colombier int r; /* % format Rune */ 1938ccd4a63SDavid du Colombier int width; 1948ccd4a63SDavid du Colombier int prec; 1958ccd4a63SDavid du Colombier ulong flags; 1968ccd4a63SDavid du Colombier }; 1978ccd4a63SDavid du Colombier 1988ccd4a63SDavid du Colombier enum{ 1998ccd4a63SDavid du Colombier FmtWidth = 1, 2008ccd4a63SDavid du Colombier FmtLeft = FmtWidth << 1, 2018ccd4a63SDavid du Colombier FmtPrec = FmtLeft << 1, 2028ccd4a63SDavid du Colombier FmtSharp = FmtPrec << 1, 2038ccd4a63SDavid du Colombier FmtSpace = FmtSharp << 1, 2048ccd4a63SDavid du Colombier FmtSign = FmtSpace << 1, 2058ccd4a63SDavid du Colombier FmtZero = FmtSign << 1, 2068ccd4a63SDavid du Colombier FmtUnsigned = FmtZero << 1, 2078ccd4a63SDavid du Colombier FmtShort = FmtUnsigned << 1, 2088ccd4a63SDavid du Colombier FmtLong = FmtShort << 1, 2098ccd4a63SDavid du Colombier FmtVLong = FmtLong << 1, 2108ccd4a63SDavid du Colombier FmtComma = FmtVLong << 1, 2118ccd4a63SDavid du Colombier FmtByte = FmtComma << 1, 2128ccd4a63SDavid du Colombier 2130d601874SDavid du Colombier FmtFlag = FmtByte << 1, 2140d601874SDavid du Colombier FmtLDouble = FmtFlag << 1 2158ccd4a63SDavid du Colombier }; 2168ccd4a63SDavid du Colombier 2178ccd4a63SDavid du Colombier extern int print(char*, ...); 2188ccd4a63SDavid du Colombier extern char* seprint(char*, char*, char*, ...); 2198ccd4a63SDavid du Colombier extern char* vseprint(char*, char*, char*, va_list); 2208ccd4a63SDavid du Colombier extern int snprint(char*, int, char*, ...); 2218ccd4a63SDavid du Colombier extern int vsnprint(char*, int, char*, va_list); 2228ccd4a63SDavid du Colombier extern char* smprint(char*, ...); 2238ccd4a63SDavid du Colombier extern char* vsmprint(char*, va_list); 2248ccd4a63SDavid du Colombier extern int sprint(char*, char*, ...); 2258ccd4a63SDavid du Colombier extern int fprint(int, char*, ...); 2268ccd4a63SDavid du Colombier extern int vfprint(int, char*, va_list); 2278ccd4a63SDavid du Colombier 2288ccd4a63SDavid du Colombier extern int (*doquote)(int); 2298ccd4a63SDavid du Colombier extern int runesprint(Rune*, char*, ...); 2308ccd4a63SDavid du Colombier extern int runesnprint(Rune*, int, char*, ...); 2318ccd4a63SDavid du Colombier extern int runevsnprint(Rune*, int, char*, va_list); 2328ccd4a63SDavid du Colombier extern Rune* runeseprint(Rune*, Rune*, char*, ...); 2338ccd4a63SDavid du Colombier extern Rune* runevseprint(Rune*, Rune*, char*, va_list); 2348ccd4a63SDavid du Colombier extern Rune* runesmprint(char*, ...); 2358ccd4a63SDavid du Colombier extern Rune* runevsmprint(char*, va_list); 2368ccd4a63SDavid du Colombier 23796cbc34fSDavid du Colombier extern Rune* runestrchr(Rune*, Rune); 23896cbc34fSDavid du Colombier extern long runestrlen(Rune*); 23996cbc34fSDavid du Colombier extern Rune* runestrstr(Rune*, Rune*); 24096cbc34fSDavid du Colombier 2418ccd4a63SDavid du Colombier extern int fmtfdinit(Fmt*, int, char*, int); 2428ccd4a63SDavid du Colombier extern int fmtfdflush(Fmt*); 2438ccd4a63SDavid du Colombier extern int fmtstrinit(Fmt*); 2448ccd4a63SDavid du Colombier extern int fmtinstall(int, int (*)(Fmt*)); 2458ccd4a63SDavid du Colombier extern char* fmtstrflush(Fmt*); 2468ccd4a63SDavid du Colombier extern int runefmtstrinit(Fmt*); 2478ccd4a63SDavid du Colombier extern Rune* runefmtstrflush(Fmt*); 2481a4050f5SDavid du Colombier extern int encodefmt(Fmt*); 2498ccd4a63SDavid du Colombier extern int fmtstrcpy(Fmt*, char*); 2508ccd4a63SDavid du Colombier extern int fmtprint(Fmt*, char*, ...); 2518ccd4a63SDavid du Colombier extern int fmtvprint(Fmt*, char*, va_list); 2528ccd4a63SDavid du Colombier extern void* mallocz(ulong, int); 2538ccd4a63SDavid du Colombier 254ec59a3ddSDavid du Colombier extern uintptr getcallerpc(void*); 2558ccd4a63SDavid du Colombier extern char* cleanname(char*); 2568ccd4a63SDavid du Colombier extern void sysfatal(char*, ...); 2578ccd4a63SDavid du Colombier extern char* strecpy(char*, char*, char*); 2588ccd4a63SDavid du Colombier 2598ccd4a63SDavid du Colombier extern int tokenize(char*, char**, int); 2608ccd4a63SDavid du Colombier extern int getfields(char*, char**, int, int, char*); 2618ccd4a63SDavid du Colombier extern char* utfecpy(char*, char*, char*); 2628ccd4a63SDavid du Colombier extern long tas(long*); 2638ccd4a63SDavid du Colombier extern void quotefmtinstall(void); 2648ccd4a63SDavid du Colombier extern int dec64(uchar*, int, char*, int); 2658ccd4a63SDavid du Colombier extern int enc64(char*, int, uchar*, int); 2668ccd4a63SDavid du Colombier extern int dec32(uchar*, int, char*, int); 2678ccd4a63SDavid du Colombier extern int enc32(char*, int, uchar*, int); 268ec59a3ddSDavid du Colombier extern int enc16(char*, int, uchar*, int); 2698ccd4a63SDavid du Colombier void hnputs(void *p, unsigned short v); 2708ccd4a63SDavid du Colombier extern int dofmt(Fmt*, char*); 2718ccd4a63SDavid du Colombier extern double __NaN(void); 2728ccd4a63SDavid du Colombier extern int __isNaN(double); 2730d601874SDavid du Colombier extern double strtod(const char*, char**); 2748ccd4a63SDavid du Colombier extern int utfnlen(char*, long); 2758ccd4a63SDavid du Colombier extern double __Inf(int); 2768ccd4a63SDavid du Colombier extern int __isInf(double, int); 2770d601874SDavid du Colombier 2780d601874SDavid du Colombier extern int (*fmtdoquote)(int); 2790d601874SDavid du Colombier 280