137da2899SCharles.Forsyth /* define _BSD_SOURCE to use ISO C, POSIX, and 4.3BSD things. */ 237da2899SCharles.Forsyth #ifndef _BSD_SOURCE 337da2899SCharles.Forsyth #define _BSD_SOURCE 437da2899SCharles.Forsyth #endif 537da2899SCharles.Forsyth /* these aren't really needed because FreeBSD does the right thing and makes off_t 64 bits, full stop */ 637da2899SCharles.Forsyth #define _LARGEFILE64_SOURCE 1 737da2899SCharles.Forsyth #define _FILE_OFFSET_BITS 64 837da2899SCharles.Forsyth #include <sys/types.h> 937da2899SCharles.Forsyth #include <sys/stat.h> 1037da2899SCharles.Forsyth #include <stdlib.h> 1137da2899SCharles.Forsyth #include <stdarg.h> 1237da2899SCharles.Forsyth #include <unistd.h> 1337da2899SCharles.Forsyth #include <errno.h> 1437da2899SCharles.Forsyth #include <string.h> 1537da2899SCharles.Forsyth #include "math.h" 1637da2899SCharles.Forsyth #include <fcntl.h> 1737da2899SCharles.Forsyth #include <setjmp.h> 1837da2899SCharles.Forsyth #include <float.h> 1937da2899SCharles.Forsyth #include <time.h> 2037da2899SCharles.Forsyth 2137da2899SCharles.Forsyth #define getwd infgetwd 2237da2899SCharles.Forsyth 2337da2899SCharles.Forsyth #define round infround 2437da2899SCharles.Forsyth #define fmax inffmax 2537da2899SCharles.Forsyth #define log2 inflog2 2637da2899SCharles.Forsyth 2737da2899SCharles.Forsyth #ifndef EMU 2837da2899SCharles.Forsyth typedef struct Proc Proc; 2937da2899SCharles.Forsyth #endif 3037da2899SCharles.Forsyth 3137da2899SCharles.Forsyth /* 3237da2899SCharles.Forsyth * math module dtoa 3337da2899SCharles.Forsyth */ 3437da2899SCharles.Forsyth #define __LITTLE_ENDIAN 3537da2899SCharles.Forsyth 3637da2899SCharles.Forsyth #define nil ((void*)0) 3737da2899SCharles.Forsyth 3837da2899SCharles.Forsyth typedef unsigned char uchar; 3937da2899SCharles.Forsyth typedef signed char schar; 4037da2899SCharles.Forsyth typedef unsigned long ulong; 41*9f260b3bSCharles Forsyth typedef unsigned int Rune; 4237da2899SCharles.Forsyth typedef long long int vlong; 4337da2899SCharles.Forsyth typedef unsigned long long int uvlong; 4437da2899SCharles.Forsyth typedef unsigned int u32int; 45f1dcfd03Sforsyth typedef uvlong u64int; 46f1dcfd03Sforsyth 4737da2899SCharles.Forsyth typedef unsigned int mpdigit; /* for /sys/include/mp.h */ 4837da2899SCharles.Forsyth typedef unsigned short u16int; 4937da2899SCharles.Forsyth typedef unsigned char u8int; 5037da2899SCharles.Forsyth typedef unsigned long uintptr; 5137da2899SCharles.Forsyth 52cd03a2dcSforsyth typedef signed char int8; 53cd03a2dcSforsyth typedef unsigned char uint8; 54cd03a2dcSforsyth typedef short int16; 55cd03a2dcSforsyth typedef unsigned short uint16; 56cd03a2dcSforsyth typedef int int32; 57cd03a2dcSforsyth typedef unsigned int uint32; 58cd03a2dcSforsyth typedef long long int64; 59cd03a2dcSforsyth typedef unsigned long long uint64; 60cd03a2dcSforsyth 6137da2899SCharles.Forsyth #define USED(x) if(x){}else{} 6237da2899SCharles.Forsyth #define SET(x) 6337da2899SCharles.Forsyth 6437da2899SCharles.Forsyth #undef nelem 6537da2899SCharles.Forsyth #define nelem(x) (sizeof(x)/sizeof((x)[0])) 6637da2899SCharles.Forsyth #undef offsetof 6737da2899SCharles.Forsyth #define offsetof(s, m) (ulong)(&(((s*)0)->m)) 6837da2899SCharles.Forsyth #undef assert 6937da2899SCharles.Forsyth #define assert(x) if(x){}else _assert("x") 7037da2899SCharles.Forsyth 7137da2899SCharles.Forsyth /* 7237da2899SCharles.Forsyth * most mem and string routines are declared by ANSI/POSIX files above 7337da2899SCharles.Forsyth */ 7437da2899SCharles.Forsyth 7537da2899SCharles.Forsyth extern char* strecpy(char*, char*, char*); 7637da2899SCharles.Forsyth extern char* strdup(const char*); 7737da2899SCharles.Forsyth extern int cistrncmp(char*, char*, int); 7837da2899SCharles.Forsyth extern int cistrcmp(char*, char*); 7937da2899SCharles.Forsyth extern char* cistrstr(char*, char*); 8037da2899SCharles.Forsyth extern int tokenize(char*, char**, int); 8137da2899SCharles.Forsyth 8237da2899SCharles.Forsyth enum 8337da2899SCharles.Forsyth { 84d90014f6SCharles Forsyth UTFmax = 4, /* maximum bytes per rune */ 8537da2899SCharles.Forsyth Runesync = 0x80, /* cannot represent part of a UTF sequence (<) */ 8637da2899SCharles.Forsyth Runeself = 0x80, /* rune and UTF sequences are the same (<) */ 87d90014f6SCharles Forsyth Runeerror = 0xFFFD, /* decoding error in UTF */ 88d90014f6SCharles Forsyth Runemax = 0x10FFFF, /* 21-bit rune */ 89d90014f6SCharles Forsyth Runemask = 0x1FFFFF, /* bits used by runes (see grep) */ 9037da2899SCharles.Forsyth }; 9137da2899SCharles.Forsyth 9237da2899SCharles.Forsyth /* 9337da2899SCharles.Forsyth * rune routines 9437da2899SCharles.Forsyth */ 9537da2899SCharles.Forsyth extern int runetochar(char*, Rune*); 9637da2899SCharles.Forsyth extern int chartorune(Rune*, char*); 9737da2899SCharles.Forsyth extern int runelen(long); 9837da2899SCharles.Forsyth extern int runenlen(Rune*, int); 9937da2899SCharles.Forsyth extern int fullrune(char*, int); 10037da2899SCharles.Forsyth extern int utflen(char*); 10137da2899SCharles.Forsyth extern int utfnlen(char*, long); 10237da2899SCharles.Forsyth extern char* utfrune(char*, long); 10337da2899SCharles.Forsyth extern char* utfrrune(char*, long); 10437da2899SCharles.Forsyth extern char* utfutf(char*, char*); 10537da2899SCharles.Forsyth extern char* utfecpy(char*, char*, char*); 10637da2899SCharles.Forsyth 10737da2899SCharles.Forsyth extern Rune* runestrcat(Rune*, Rune*); 10837da2899SCharles.Forsyth extern Rune* runestrchr(Rune*, Rune); 10937da2899SCharles.Forsyth extern int runestrcmp(Rune*, Rune*); 11037da2899SCharles.Forsyth extern Rune* runestrcpy(Rune*, Rune*); 11137da2899SCharles.Forsyth extern Rune* runestrncpy(Rune*, Rune*, long); 11237da2899SCharles.Forsyth extern Rune* runestrecpy(Rune*, Rune*, Rune*); 11337da2899SCharles.Forsyth extern Rune* runestrdup(Rune*); 11437da2899SCharles.Forsyth extern Rune* runestrncat(Rune*, Rune*, long); 11537da2899SCharles.Forsyth extern int runestrncmp(Rune*, Rune*, long); 11637da2899SCharles.Forsyth extern Rune* runestrrchr(Rune*, Rune); 11737da2899SCharles.Forsyth extern long runestrlen(Rune*); 11837da2899SCharles.Forsyth extern Rune* runestrstr(Rune*, Rune*); 11937da2899SCharles.Forsyth 12037da2899SCharles.Forsyth extern Rune tolowerrune(Rune); 12137da2899SCharles.Forsyth extern Rune totitlerune(Rune); 12237da2899SCharles.Forsyth extern Rune toupperrune(Rune); 12337da2899SCharles.Forsyth extern int isalpharune(Rune); 12437da2899SCharles.Forsyth extern int islowerrune(Rune); 12537da2899SCharles.Forsyth extern int isspacerune(Rune); 12637da2899SCharles.Forsyth extern int istitlerune(Rune); 12737da2899SCharles.Forsyth extern int isupperrune(Rune); 12837da2899SCharles.Forsyth 12937da2899SCharles.Forsyth /* 13037da2899SCharles.Forsyth * malloc 13137da2899SCharles.Forsyth */ 13237da2899SCharles.Forsyth extern void* malloc(size_t); 13337da2899SCharles.Forsyth extern void* mallocz(ulong, int); 13437da2899SCharles.Forsyth extern void free(void*); 13537da2899SCharles.Forsyth extern ulong msize(void*); 13637da2899SCharles.Forsyth extern void* calloc(size_t, size_t); 13737da2899SCharles.Forsyth extern void* realloc(void*, size_t); 13837da2899SCharles.Forsyth extern void setmalloctag(void*, ulong); 13937da2899SCharles.Forsyth extern void setrealloctag(void*, ulong); 14037da2899SCharles.Forsyth extern ulong getmalloctag(void*); 14137da2899SCharles.Forsyth extern ulong getrealloctag(void*); 14237da2899SCharles.Forsyth extern void* malloctopoolblock(void*); 14337da2899SCharles.Forsyth 14437da2899SCharles.Forsyth /* 14537da2899SCharles.Forsyth * print routines 14637da2899SCharles.Forsyth */ 14737da2899SCharles.Forsyth typedef struct Fmt Fmt; 14837da2899SCharles.Forsyth struct Fmt{ 14937da2899SCharles.Forsyth uchar runes; /* output buffer is runes or chars? */ 15037da2899SCharles.Forsyth void *start; /* of buffer */ 15137da2899SCharles.Forsyth void *to; /* current place in the buffer */ 15237da2899SCharles.Forsyth void *stop; /* end of the buffer; overwritten if flush fails */ 15337da2899SCharles.Forsyth int (*flush)(Fmt *); /* called when to == stop */ 15437da2899SCharles.Forsyth void *farg; /* to make flush a closure */ 15537da2899SCharles.Forsyth int nfmt; /* num chars formatted so far */ 15637da2899SCharles.Forsyth va_list args; /* args passed to dofmt */ 15737da2899SCharles.Forsyth int r; /* % format Rune */ 15837da2899SCharles.Forsyth int width; 15937da2899SCharles.Forsyth int prec; 16037da2899SCharles.Forsyth ulong flags; 16137da2899SCharles.Forsyth }; 16237da2899SCharles.Forsyth 16337da2899SCharles.Forsyth enum{ 16437da2899SCharles.Forsyth FmtWidth = 1, 16537da2899SCharles.Forsyth FmtLeft = FmtWidth << 1, 16637da2899SCharles.Forsyth FmtPrec = FmtLeft << 1, 16737da2899SCharles.Forsyth FmtSharp = FmtPrec << 1, 16837da2899SCharles.Forsyth FmtSpace = FmtSharp << 1, 16937da2899SCharles.Forsyth FmtSign = FmtSpace << 1, 17037da2899SCharles.Forsyth FmtZero = FmtSign << 1, 17137da2899SCharles.Forsyth FmtUnsigned = FmtZero << 1, 17237da2899SCharles.Forsyth FmtShort = FmtUnsigned << 1, 17337da2899SCharles.Forsyth FmtLong = FmtShort << 1, 17437da2899SCharles.Forsyth FmtVLong = FmtLong << 1, 17537da2899SCharles.Forsyth FmtComma = FmtVLong << 1, 17637da2899SCharles.Forsyth FmtByte = FmtComma << 1, 17737da2899SCharles.Forsyth 17837da2899SCharles.Forsyth FmtFlag = FmtByte << 1 17937da2899SCharles.Forsyth }; 18037da2899SCharles.Forsyth 18137da2899SCharles.Forsyth extern int print(char*, ...); 18237da2899SCharles.Forsyth extern char* seprint(char*, char*, char*, ...); 18337da2899SCharles.Forsyth extern char* vseprint(char*, char*, char*, va_list); 18437da2899SCharles.Forsyth extern int snprint(char*, int, char*, ...); 18537da2899SCharles.Forsyth extern int vsnprint(char*, int, char*, va_list); 18637da2899SCharles.Forsyth extern char* smprint(char*, ...); 18737da2899SCharles.Forsyth extern char* vsmprint(char*, va_list); 18837da2899SCharles.Forsyth extern int sprint(char*, char*, ...); 18937da2899SCharles.Forsyth extern int fprint(int, char*, ...); 19037da2899SCharles.Forsyth extern int vfprint(int, char*, va_list); 19137da2899SCharles.Forsyth 19237da2899SCharles.Forsyth extern int runesprint(Rune*, char*, ...); 19337da2899SCharles.Forsyth extern int runesnprint(Rune*, int, char*, ...); 19437da2899SCharles.Forsyth extern int runevsnprint(Rune*, int, char*, va_list); 19537da2899SCharles.Forsyth extern Rune* runeseprint(Rune*, Rune*, char*, ...); 19637da2899SCharles.Forsyth extern Rune* runevseprint(Rune*, Rune*, char*, va_list); 19737da2899SCharles.Forsyth extern Rune* runesmprint(char*, ...); 19837da2899SCharles.Forsyth extern Rune* runevsmprint(char*, va_list); 19937da2899SCharles.Forsyth 20037da2899SCharles.Forsyth extern int fmtfdinit(Fmt*, int, char*, int); 20137da2899SCharles.Forsyth extern int fmtfdflush(Fmt*); 20237da2899SCharles.Forsyth extern int fmtstrinit(Fmt*); 20337da2899SCharles.Forsyth extern char* fmtstrflush(Fmt*); 20437da2899SCharles.Forsyth extern int runefmtstrinit(Fmt*); 20537da2899SCharles.Forsyth extern Rune* runefmtstrflush(Fmt*); 20637da2899SCharles.Forsyth 20737da2899SCharles.Forsyth extern int fmtinstall(int, int (*)(Fmt*)); 20837da2899SCharles.Forsyth extern int dofmt(Fmt*, char*); 20937da2899SCharles.Forsyth extern int dorfmt(Fmt*, Rune*); 21037da2899SCharles.Forsyth extern int fmtprint(Fmt*, char*, ...); 21137da2899SCharles.Forsyth extern int fmtvprint(Fmt*, char*, va_list); 21237da2899SCharles.Forsyth extern int fmtrune(Fmt*, int); 21337da2899SCharles.Forsyth extern int fmtstrcpy(Fmt*, char*); 21437da2899SCharles.Forsyth extern int fmtrunestrcpy(Fmt*, Rune*); 21537da2899SCharles.Forsyth /* 21637da2899SCharles.Forsyth * error string for %r 21737da2899SCharles.Forsyth * supplied on per os basis, not part of fmt library 21837da2899SCharles.Forsyth */ 21937da2899SCharles.Forsyth extern int errfmt(Fmt *f); 22037da2899SCharles.Forsyth 22137da2899SCharles.Forsyth /* 22237da2899SCharles.Forsyth * quoted strings 22337da2899SCharles.Forsyth */ 22437da2899SCharles.Forsyth extern char *unquotestrdup(char*); 22537da2899SCharles.Forsyth extern Rune *unquoterunestrdup(Rune*); 22637da2899SCharles.Forsyth extern char *quotestrdup(char*); 22737da2899SCharles.Forsyth extern Rune *quoterunestrdup(Rune*); 22837da2899SCharles.Forsyth extern int quotestrfmt(Fmt*); 22937da2899SCharles.Forsyth extern int quoterunestrfmt(Fmt*); 23037da2899SCharles.Forsyth extern void quotefmtinstall(void); 23137da2899SCharles.Forsyth extern int (*doquote)(int); 23237da2899SCharles.Forsyth 23337da2899SCharles.Forsyth /* 23437da2899SCharles.Forsyth * random number 23537da2899SCharles.Forsyth */ 23637da2899SCharles.Forsyth extern int nrand(int); 23737da2899SCharles.Forsyth extern ulong truerand(void); 23837da2899SCharles.Forsyth extern ulong ntruerand(ulong); 23937da2899SCharles.Forsyth 24037da2899SCharles.Forsyth /* 24137da2899SCharles.Forsyth * math 24237da2899SCharles.Forsyth */ 24337da2899SCharles.Forsyth extern int isNaN(double); 24437da2899SCharles.Forsyth extern int isInf(double, int); 24537da2899SCharles.Forsyth extern double pow(double, double); 24637da2899SCharles.Forsyth 24737da2899SCharles.Forsyth /* 24837da2899SCharles.Forsyth * Time-of-day 24937da2899SCharles.Forsyth */ 25037da2899SCharles.Forsyth 25137da2899SCharles.Forsyth typedef struct Tm Tm; 25237da2899SCharles.Forsyth struct Tm { 25337da2899SCharles.Forsyth int sec; 25437da2899SCharles.Forsyth int min; 25537da2899SCharles.Forsyth int hour; 25637da2899SCharles.Forsyth int mday; 25737da2899SCharles.Forsyth int mon; 25837da2899SCharles.Forsyth int year; 25937da2899SCharles.Forsyth int wday; 26037da2899SCharles.Forsyth int yday; 26137da2899SCharles.Forsyth char zone[4]; 26237da2899SCharles.Forsyth int tzoff; 26337da2899SCharles.Forsyth }; 26437da2899SCharles.Forsyth extern vlong osnsec(void); 26537da2899SCharles.Forsyth #define nsec osnsec 26637da2899SCharles.Forsyth 26737da2899SCharles.Forsyth /* 26837da2899SCharles.Forsyth * one-of-a-kind 26937da2899SCharles.Forsyth */ 27037da2899SCharles.Forsyth extern void _assert(char*); 27137da2899SCharles.Forsyth extern double charstod(int(*)(void*), void*); 27237da2899SCharles.Forsyth extern char* cleanname(char*); 27337da2899SCharles.Forsyth extern double frexp(double, int*); 2746b2e3235Sforsyth extern uintptr getcallerpc(void*); 27537da2899SCharles.Forsyth extern int getfields(char*, char**, int, int, char*); 27637da2899SCharles.Forsyth extern char* getuser(void); 27737da2899SCharles.Forsyth extern char* getwd(char*, int); 27837da2899SCharles.Forsyth extern double ipow10(int); 27937da2899SCharles.Forsyth extern double ldexp(double, int); 28037da2899SCharles.Forsyth extern double modf(double, double*); 28137da2899SCharles.Forsyth #define pow10 infpow10 28237da2899SCharles.Forsyth extern double pow10(int); 28337da2899SCharles.Forsyth extern vlong strtoll(const char*, char**, int); 284ad4c862fSforsyth #define qsort infqsort 285ad4c862fSforsyth extern void qsort(void*, long, long, int (*)(void*, void*)); 28637da2899SCharles.Forsyth extern uvlong strtoull(const char*, char**, int); 28737da2899SCharles.Forsyth extern void sysfatal(char*, ...); 28837da2899SCharles.Forsyth extern int dec64(uchar*, int, char*, int); 28937da2899SCharles.Forsyth extern int enc64(char*, int, uchar*, int); 29037da2899SCharles.Forsyth extern int dec32(uchar*, int, char*, int); 29137da2899SCharles.Forsyth extern int enc32(char*, int, uchar*, int); 29237da2899SCharles.Forsyth extern int dec16(uchar*, int, char*, int); 29337da2899SCharles.Forsyth extern int enc16(char*, int, uchar*, int); 29437da2899SCharles.Forsyth extern int encodefmt(Fmt*); 29537da2899SCharles.Forsyth 29637da2899SCharles.Forsyth /* 29737da2899SCharles.Forsyth * synchronization 29837da2899SCharles.Forsyth */ 29937da2899SCharles.Forsyth typedef 30037da2899SCharles.Forsyth struct Lock { 3017e004309SCharles.Forsyth int val; 30237da2899SCharles.Forsyth int pid; 30337da2899SCharles.Forsyth } Lock; 30437da2899SCharles.Forsyth 3057e004309SCharles.Forsyth extern int _tas(int*); 30637da2899SCharles.Forsyth 30737da2899SCharles.Forsyth extern void lock(Lock*); 30837da2899SCharles.Forsyth extern void unlock(Lock*); 30937da2899SCharles.Forsyth extern int canlock(Lock*); 31037da2899SCharles.Forsyth 31137da2899SCharles.Forsyth typedef struct QLock QLock; 31237da2899SCharles.Forsyth struct QLock 31337da2899SCharles.Forsyth { 31437da2899SCharles.Forsyth Lock use; /* to access Qlock structure */ 31537da2899SCharles.Forsyth Proc *head; /* next process waiting for object */ 31637da2899SCharles.Forsyth Proc *tail; /* last process waiting for object */ 31737da2899SCharles.Forsyth int locked; /* flag */ 31837da2899SCharles.Forsyth }; 31937da2899SCharles.Forsyth 32037da2899SCharles.Forsyth extern void qlock(QLock*); 32137da2899SCharles.Forsyth extern void qunlock(QLock*); 32237da2899SCharles.Forsyth extern int canqlock(QLock*); 32337da2899SCharles.Forsyth extern void _qlockinit(ulong (*)(ulong, ulong)); /* called only by the thread library */ 32437da2899SCharles.Forsyth 32537da2899SCharles.Forsyth typedef 32637da2899SCharles.Forsyth struct RWLock 32737da2899SCharles.Forsyth { 32837da2899SCharles.Forsyth Lock l; /* Lock modify lock */ 32937da2899SCharles.Forsyth QLock x; /* Mutual exclusion lock */ 33037da2899SCharles.Forsyth QLock k; /* Lock for waiting writers */ 33137da2899SCharles.Forsyth int readers; /* Count of readers in lock */ 33237da2899SCharles.Forsyth } RWLock; 33337da2899SCharles.Forsyth 33437da2899SCharles.Forsyth extern int canrlock(RWLock*); 33537da2899SCharles.Forsyth extern int canwlock(RWLock*); 33637da2899SCharles.Forsyth extern void rlock(RWLock*); 33737da2899SCharles.Forsyth extern void runlock(RWLock*); 33837da2899SCharles.Forsyth extern void wlock(RWLock*); 33937da2899SCharles.Forsyth extern void wunlock(RWLock*); 34037da2899SCharles.Forsyth 34137da2899SCharles.Forsyth /* 34237da2899SCharles.Forsyth * network dialing 34337da2899SCharles.Forsyth */ 34437da2899SCharles.Forsyth #define NETPATHLEN 40 34537da2899SCharles.Forsyth 34637da2899SCharles.Forsyth /* 34737da2899SCharles.Forsyth * system calls 34837da2899SCharles.Forsyth * 34937da2899SCharles.Forsyth */ 35037da2899SCharles.Forsyth #define STATMAX 65535U /* max length of machine-independent stat structure */ 35137da2899SCharles.Forsyth #define DIRMAX (sizeof(Dir)+STATMAX) /* max length of Dir structure */ 35237da2899SCharles.Forsyth #define ERRMAX 128 /* max length of error string */ 35337da2899SCharles.Forsyth 35437da2899SCharles.Forsyth #define MORDER 0x0003 /* mask for bits defining order of mounting */ 35537da2899SCharles.Forsyth #define MREPL 0x0000 /* mount replaces object */ 35637da2899SCharles.Forsyth #define MBEFORE 0x0001 /* mount goes before others in union directory */ 35737da2899SCharles.Forsyth #define MAFTER 0x0002 /* mount goes after others in union directory */ 35837da2899SCharles.Forsyth #define MCREATE 0x0004 /* permit creation in mounted directory */ 35937da2899SCharles.Forsyth #define MCACHE 0x0010 /* cache some data */ 36037da2899SCharles.Forsyth #define MMASK 0x0017 /* all bits on */ 36137da2899SCharles.Forsyth 36237da2899SCharles.Forsyth #define OREAD 0 /* open for read */ 36337da2899SCharles.Forsyth #define OWRITE 1 /* write */ 36437da2899SCharles.Forsyth #define ORDWR 2 /* read and write */ 36537da2899SCharles.Forsyth #define OEXEC 3 /* execute, == read but check execute permission */ 36637da2899SCharles.Forsyth #define OTRUNC 16 /* or'ed in (except for exec), truncate file first */ 36737da2899SCharles.Forsyth #define OCEXEC 32 /* or'ed in, close on exec */ 36837da2899SCharles.Forsyth #define ORCLOSE 64 /* or'ed in, remove on close */ 36937da2899SCharles.Forsyth #define OEXCL 0x1000 /* or'ed in, exclusive use (create only) */ 37037da2899SCharles.Forsyth 37137da2899SCharles.Forsyth #define AEXIST 0 /* accessible: exists */ 37237da2899SCharles.Forsyth #define AEXEC 1 /* execute access */ 37337da2899SCharles.Forsyth #define AWRITE 2 /* write access */ 37437da2899SCharles.Forsyth #define AREAD 4 /* read access */ 37537da2899SCharles.Forsyth 37637da2899SCharles.Forsyth /* bits in Qid.type */ 37737da2899SCharles.Forsyth #define QTDIR 0x80 /* type bit for directories */ 37837da2899SCharles.Forsyth #define QTAPPEND 0x40 /* type bit for append only files */ 37937da2899SCharles.Forsyth #define QTEXCL 0x20 /* type bit for exclusive use files */ 38037da2899SCharles.Forsyth #define QTMOUNT 0x10 /* type bit for mounted channel */ 38137da2899SCharles.Forsyth #define QTAUTH 0x08 /* type bit for authentication file */ 38237da2899SCharles.Forsyth #define QTFILE 0x00 /* plain file */ 38337da2899SCharles.Forsyth 38437da2899SCharles.Forsyth /* bits in Dir.mode */ 38537da2899SCharles.Forsyth #define DMDIR 0x80000000 /* mode bit for directories */ 38637da2899SCharles.Forsyth #define DMAPPEND 0x40000000 /* mode bit for append only files */ 38737da2899SCharles.Forsyth #define DMEXCL 0x20000000 /* mode bit for exclusive use files */ 38837da2899SCharles.Forsyth #define DMMOUNT 0x10000000 /* mode bit for mounted channel */ 38937da2899SCharles.Forsyth #define DMAUTH 0x08000000 /* mode bit for authentication file */ 39037da2899SCharles.Forsyth #define DMREAD 0x4 /* mode bit for read permission */ 39137da2899SCharles.Forsyth #define DMWRITE 0x2 /* mode bit for write permission */ 39237da2899SCharles.Forsyth #define DMEXEC 0x1 /* mode bit for execute permission */ 39337da2899SCharles.Forsyth 39437da2899SCharles.Forsyth typedef 39537da2899SCharles.Forsyth struct Qid 39637da2899SCharles.Forsyth { 39737da2899SCharles.Forsyth uvlong path; 39837da2899SCharles.Forsyth ulong vers; 39937da2899SCharles.Forsyth uchar type; 40037da2899SCharles.Forsyth } Qid; 40137da2899SCharles.Forsyth 40237da2899SCharles.Forsyth typedef 40337da2899SCharles.Forsyth struct Dir { 40437da2899SCharles.Forsyth /* system-modified data */ 40537da2899SCharles.Forsyth ushort type; /* server type */ 40637da2899SCharles.Forsyth uint dev; /* server subtype */ 40737da2899SCharles.Forsyth /* file data */ 40837da2899SCharles.Forsyth Qid qid; /* unique id from server */ 40937da2899SCharles.Forsyth ulong mode; /* permissions */ 41037da2899SCharles.Forsyth ulong atime; /* last read time */ 41137da2899SCharles.Forsyth ulong mtime; /* last write time */ 41237da2899SCharles.Forsyth vlong length; /* file length */ 41337da2899SCharles.Forsyth char *name; /* last element of path */ 41437da2899SCharles.Forsyth char *uid; /* owner name */ 41537da2899SCharles.Forsyth char *gid; /* group name */ 41637da2899SCharles.Forsyth char *muid; /* last modifier name */ 41737da2899SCharles.Forsyth } Dir; 41837da2899SCharles.Forsyth 41937da2899SCharles.Forsyth extern Dir* dirstat(char*); 42037da2899SCharles.Forsyth extern Dir* dirfstat(int); 42137da2899SCharles.Forsyth extern int dirwstat(char*, Dir*); 42237da2899SCharles.Forsyth extern int dirfwstat(int, Dir*); 42337da2899SCharles.Forsyth extern long dirread(int, Dir**); 42437da2899SCharles.Forsyth extern void nulldir(Dir*); 42537da2899SCharles.Forsyth extern long dirreadall(int, Dir**); 42637da2899SCharles.Forsyth 42737da2899SCharles.Forsyth typedef 42837da2899SCharles.Forsyth struct Waitmsg 42937da2899SCharles.Forsyth { 43037da2899SCharles.Forsyth int pid; /* of loved one */ 43137da2899SCharles.Forsyth ulong time[3]; /* of loved one & descendants */ 43237da2899SCharles.Forsyth char *msg; 43337da2899SCharles.Forsyth } Waitmsg; 43437da2899SCharles.Forsyth 43537da2899SCharles.Forsyth extern void _exits(char*); 43637da2899SCharles.Forsyth 43737da2899SCharles.Forsyth extern void exits(char*); 43837da2899SCharles.Forsyth extern int create(char*, int, int); 43937da2899SCharles.Forsyth extern int errstr(char*, uint); 44037da2899SCharles.Forsyth 44137da2899SCharles.Forsyth extern void perror(const char*); 44237da2899SCharles.Forsyth extern long readn(int, void*, long); 44337da2899SCharles.Forsyth extern int remove(const char*); 44437da2899SCharles.Forsyth extern void rerrstr(char*, uint); 44537da2899SCharles.Forsyth extern vlong seek(int, vlong, int); 44637da2899SCharles.Forsyth extern int segflush(void*, ulong); 44737da2899SCharles.Forsyth extern void werrstr(char*, ...); 44837da2899SCharles.Forsyth 44937da2899SCharles.Forsyth extern char *argv0; 45037da2899SCharles.Forsyth #define ARGBEGIN for((argv0||(argv0=*argv)),argv++,argc--;\ 45137da2899SCharles.Forsyth argv[0] && argv[0][0]=='-' && argv[0][1];\ 45237da2899SCharles.Forsyth argc--, argv++) {\ 45337da2899SCharles.Forsyth char *_args, *_argt;\ 45437da2899SCharles.Forsyth Rune _argc;\ 45537da2899SCharles.Forsyth _args = &argv[0][1];\ 45637da2899SCharles.Forsyth if(_args[0]=='-' && _args[1]==0){\ 45737da2899SCharles.Forsyth argc--; argv++; break;\ 45837da2899SCharles.Forsyth }\ 45937da2899SCharles.Forsyth _argc = 0;\ 46037da2899SCharles.Forsyth while(*_args && (_args += chartorune(&_argc, _args)))\ 46137da2899SCharles.Forsyth switch(_argc) 46237da2899SCharles.Forsyth #define ARGEND SET(_argt);USED(_argt);USED(_argc); USED(_args);}USED(argv); USED(argc); 46337da2899SCharles.Forsyth #define ARGF() (_argt=_args, _args="",\ 46437da2899SCharles.Forsyth (*_argt? _argt: argv[1]? (argc--, *++argv): 0)) 46537da2899SCharles.Forsyth #define EARGF(x) (_argt=_args, _args="",\ 46637da2899SCharles.Forsyth (*_argt? _argt: argv[1]? (argc--, *++argv): ((x), abort(), (char*)0))) 46737da2899SCharles.Forsyth 46837da2899SCharles.Forsyth #define ARGC() _argc 46937da2899SCharles.Forsyth 47037da2899SCharles.Forsyth /* 47137da2899SCharles.Forsyth * Extensions for Inferno to basic libc.h 47237da2899SCharles.Forsyth */ 47337da2899SCharles.Forsyth 47437da2899SCharles.Forsyth #define setbinmode() 47537da2899SCharles.Forsyth 476