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