137da2899SCharles.Forsyth /* 237da2899SCharles.Forsyth * Based on FreeBSD lib9.h 337da2899SCharles.Forsyth * Copyright © 1998, 1999 Lucent Technologies Inc. All rights reserved. 437da2899SCharles.Forsyth * Revisions Copyright © 1999, 2002 Vita Nuova Limited. All rights reserved. 537da2899SCharles.Forsyth * Revisions Copyright © 2002, 2003 Corpus Callosum Corporation. All rights reserved. 637da2899SCharles.Forsyth */ 737da2899SCharles.Forsyth 837da2899SCharles.Forsyth /* define _BSD_SOURCE to use ISO C, POSIX, and 4.4BSD things. */ 937da2899SCharles.Forsyth #ifndef _BSD_SOURCE 1037da2899SCharles.Forsyth #define _BSD_SOURCE 1137da2899SCharles.Forsyth #endif 1237da2899SCharles.Forsyth #define _LARGEFILE64_SOURCE 1 1337da2899SCharles.Forsyth #define _FILE_OFFSET_BITS 64 1437da2899SCharles.Forsyth 1537da2899SCharles.Forsyth #include <sys/types.h> 1637da2899SCharles.Forsyth #include <sys/stat.h> 1737da2899SCharles.Forsyth #include <stdlib.h> 1837da2899SCharles.Forsyth #include <stdarg.h> 1937da2899SCharles.Forsyth #include <unistd.h> 2037da2899SCharles.Forsyth #include <errno.h> 2137da2899SCharles.Forsyth #include <string.h> 2237da2899SCharles.Forsyth // #include "math.h" 2337da2899SCharles.Forsyth #include <fcntl.h> 2437da2899SCharles.Forsyth #include <setjmp.h> 2537da2899SCharles.Forsyth #include <float.h> 2637da2899SCharles.Forsyth #include <time.h> 2737da2899SCharles.Forsyth 2837da2899SCharles.Forsyth #define nil ((void*)0) 2937da2899SCharles.Forsyth 3037da2899SCharles.Forsyth // typedef unsigned short ushort; 3137da2899SCharles.Forsyth typedef unsigned char uchar; 3237da2899SCharles.Forsyth typedef unsigned long ulong; 3337da2899SCharles.Forsyth // typedef unsigned int uint; 3437da2899SCharles.Forsyth typedef signed char schar; 3537da2899SCharles.Forsyth typedef long long vlong; 3637da2899SCharles.Forsyth typedef unsigned long long uvlong; 379f260b3bSCharles Forsyth typedef unsigned int Rune; 3837da2899SCharles.Forsyth typedef unsigned int u32int; 39f1dcfd03Sforsyth typedef uvlong u64int; 40f1dcfd03Sforsyth 4137da2899SCharles.Forsyth typedef unsigned int mpdigit; /* for /sys/include/mp.h */ 4237da2899SCharles.Forsyth typedef unsigned short u16int; 4337da2899SCharles.Forsyth typedef unsigned char u8int; 4437da2899SCharles.Forsyth typedef unsigned long uintptr; 4537da2899SCharles.Forsyth 46cd03a2dcSforsyth typedef signed char int8; 47cd03a2dcSforsyth typedef unsigned char uint8; 48cd03a2dcSforsyth typedef short int16; 49cd03a2dcSforsyth typedef unsigned short uint16; 50cd03a2dcSforsyth typedef int int32; 51cd03a2dcSforsyth typedef unsigned int uint32; 52cd03a2dcSforsyth typedef long long int64; 53cd03a2dcSforsyth typedef unsigned long long uint64; 54cd03a2dcSforsyth 5537da2899SCharles.Forsyth /* handle conflicts with host os libs */ 5637da2899SCharles.Forsyth #define getwd infgetwd 5737da2899SCharles.Forsyth #define scalb infscalb 5837da2899SCharles.Forsyth #define div infdiv 5937da2899SCharles.Forsyth #define panic infpanic 6037da2899SCharles.Forsyth #define rint infrint 6137da2899SCharles.Forsyth #define rcmd infrcmd 6237da2899SCharles.Forsyth #define pow10 infpow10 6337da2899SCharles.Forsyth 6437da2899SCharles.Forsyth #ifndef EMU 6537da2899SCharles.Forsyth typedef struct Proc Proc; 6637da2899SCharles.Forsyth #endif 6737da2899SCharles.Forsyth 6837da2899SCharles.Forsyth /* 6937da2899SCharles.Forsyth * math module dtoa 7037da2899SCharles.Forsyth */ 7137da2899SCharles.Forsyth #include <machine/endian.h> 7237da2899SCharles.Forsyth #define __BIG_ENDIAN 7337da2899SCharles.Forsyth 7437da2899SCharles.Forsyth #define USED(x) if(x){}else{} 7537da2899SCharles.Forsyth #define SET(x) 7637da2899SCharles.Forsyth 7737da2899SCharles.Forsyth #define nelem(x) (sizeof(x)/sizeof((x)[0])) 788911721eSCharles.Forsyth #undef offsetof 798911721eSCharles.Forsyth #undef assert 8037da2899SCharles.Forsyth #define offsetof(s, m) (ulong)(&(((s*)0)->m)) 8137da2899SCharles.Forsyth #define assert(x) if(x){}else _assert("x") 8237da2899SCharles.Forsyth 8337da2899SCharles.Forsyth /* 8437da2899SCharles.Forsyth * mem and string routines are declared by ANSI/POSIX files above 8537da2899SCharles.Forsyth */ 8637da2899SCharles.Forsyth 8737da2899SCharles.Forsyth extern char* strecpy(char*, char*, char*); 8837da2899SCharles.Forsyth extern char* strdup(const char*); 8937da2899SCharles.Forsyth extern int cistrncmp(char*, char*, int); 9037da2899SCharles.Forsyth extern int cistrcmp(char*, char*); 9137da2899SCharles.Forsyth extern char* cistrstr(char*, char*); 9237da2899SCharles.Forsyth extern int tokenize(char*, char**, int); 9337da2899SCharles.Forsyth extern vlong strtoll(const char*, char**, int); 94ad4c862fSforsyth #define qsort infqsort 95ad4c862fSforsyth extern void qsort(void*, long, long, int (*)(void*, void*)); 9637da2899SCharles.Forsyth 9737da2899SCharles.Forsyth enum 9837da2899SCharles.Forsyth { 99d90014f6SCharles Forsyth UTFmax = 4, /* maximum bytes per rune */ 10037da2899SCharles.Forsyth Runesync = 0x80, /* cannot represent part of a UTF sequence (<) */ 10137da2899SCharles.Forsyth Runeself = 0x80, /* rune and UTF sequences are the same (<) */ 102d90014f6SCharles Forsyth Runeerror = 0xFFFD, /* decoding error in UTF */ 103d90014f6SCharles Forsyth Runemax = 0x10FFFF, /* 21-bit rune */ 104d90014f6SCharles Forsyth Runemask = 0x1FFFFF, /* bits used by runes (see grep) */ 10537da2899SCharles.Forsyth }; 10637da2899SCharles.Forsyth 10737da2899SCharles.Forsyth /* 10837da2899SCharles.Forsyth * rune routines 10937da2899SCharles.Forsyth */ 11037da2899SCharles.Forsyth extern int runetochar(char*, Rune*); 11137da2899SCharles.Forsyth extern int chartorune(Rune*, char*); 11237da2899SCharles.Forsyth extern int runelen(long); 11337da2899SCharles.Forsyth extern int runenlen(Rune*, int); 11437da2899SCharles.Forsyth extern int fullrune(char*, int); 11537da2899SCharles.Forsyth extern int utflen(char*); 11637da2899SCharles.Forsyth extern int utfnlen(char*, long); 11737da2899SCharles.Forsyth extern char* utfrune(char*, long); 11837da2899SCharles.Forsyth extern char* utfrrune(char*, long); 11937da2899SCharles.Forsyth extern char* utfutf(char*, char*); 12037da2899SCharles.Forsyth extern char* utfecpy(char*, char*, char*); 12137da2899SCharles.Forsyth 12237da2899SCharles.Forsyth extern Rune* runestrcat(Rune*, Rune*); 12337da2899SCharles.Forsyth extern Rune* runestrchr(Rune*, Rune); 12437da2899SCharles.Forsyth extern int runestrcmp(Rune*, Rune*); 12537da2899SCharles.Forsyth extern Rune* runestrcpy(Rune*, Rune*); 12637da2899SCharles.Forsyth extern Rune* runestrncpy(Rune*, Rune*, long); 12737da2899SCharles.Forsyth extern Rune* runestrecpy(Rune*, Rune*, Rune*); 12837da2899SCharles.Forsyth extern Rune* runestrdup(Rune*); 12937da2899SCharles.Forsyth extern Rune* runestrncat(Rune*, Rune*, long); 13037da2899SCharles.Forsyth extern int runestrncmp(Rune*, Rune*, long); 13137da2899SCharles.Forsyth extern Rune* runestrrchr(Rune*, Rune); 13237da2899SCharles.Forsyth extern long runestrlen(Rune*); 13337da2899SCharles.Forsyth extern Rune* runestrstr(Rune*, Rune*); 13437da2899SCharles.Forsyth 13537da2899SCharles.Forsyth extern Rune tolowerrune(Rune); 13637da2899SCharles.Forsyth extern Rune totitlerune(Rune); 13737da2899SCharles.Forsyth extern Rune toupperrune(Rune); 13837da2899SCharles.Forsyth extern int isalpharune(Rune); 13937da2899SCharles.Forsyth extern int islowerrune(Rune); 14037da2899SCharles.Forsyth extern int isspacerune(Rune); 14137da2899SCharles.Forsyth extern int istitlerune(Rune); 14237da2899SCharles.Forsyth extern int isupperrune(Rune); 14337da2899SCharles.Forsyth 14437da2899SCharles.Forsyth /* 14537da2899SCharles.Forsyth * malloc 14637da2899SCharles.Forsyth */ 14737da2899SCharles.Forsyth extern void* malloc(size_t); 14837da2899SCharles.Forsyth extern void* mallocz(ulong, int); 14937da2899SCharles.Forsyth extern void free(void*); 15037da2899SCharles.Forsyth extern ulong msize(void*); 15137da2899SCharles.Forsyth extern void* calloc(size_t, size_t); 15237da2899SCharles.Forsyth extern void* realloc(void*, size_t); 15337da2899SCharles.Forsyth extern void setmalloctag(void*, ulong); 15437da2899SCharles.Forsyth extern void setrealloctag(void*, ulong); 15537da2899SCharles.Forsyth extern ulong getmalloctag(void*); 15637da2899SCharles.Forsyth extern ulong getrealloctag(void*); 15737da2899SCharles.Forsyth extern void* malloctopoolblock(void*); 15837da2899SCharles.Forsyth 15937da2899SCharles.Forsyth /* 16037da2899SCharles.Forsyth * print routines 16137da2899SCharles.Forsyth */ 16237da2899SCharles.Forsyth typedef struct Fmt Fmt; 16337da2899SCharles.Forsyth struct Fmt{ 16437da2899SCharles.Forsyth uchar runes; /* output buffer is runes or chars? */ 16537da2899SCharles.Forsyth void *start; /* of buffer */ 16637da2899SCharles.Forsyth void *to; /* current place in the buffer */ 16737da2899SCharles.Forsyth void *stop; /* end of the buffer; overwritten if flush fails */ 16837da2899SCharles.Forsyth int (*flush)(Fmt *); /* called when to == stop */ 16937da2899SCharles.Forsyth void *farg; /* to make flush a closure */ 17037da2899SCharles.Forsyth int nfmt; /* num chars formatted so far */ 17137da2899SCharles.Forsyth va_list args; /* args passed to dofmt */ 17237da2899SCharles.Forsyth int r; /* % format Rune */ 17337da2899SCharles.Forsyth int width; 17437da2899SCharles.Forsyth int prec; 17537da2899SCharles.Forsyth ulong flags; 17637da2899SCharles.Forsyth }; 17737da2899SCharles.Forsyth 17837da2899SCharles.Forsyth enum{ 17937da2899SCharles.Forsyth FmtWidth = 1, 18037da2899SCharles.Forsyth FmtLeft = FmtWidth << 1, 18137da2899SCharles.Forsyth FmtPrec = FmtLeft << 1, 18237da2899SCharles.Forsyth FmtSharp = FmtPrec << 1, 18337da2899SCharles.Forsyth FmtSpace = FmtSharp << 1, 18437da2899SCharles.Forsyth FmtSign = FmtSpace << 1, 18537da2899SCharles.Forsyth FmtZero = FmtSign << 1, 18637da2899SCharles.Forsyth FmtUnsigned = FmtZero << 1, 18737da2899SCharles.Forsyth FmtShort = FmtUnsigned << 1, 18837da2899SCharles.Forsyth FmtLong = FmtShort << 1, 18937da2899SCharles.Forsyth FmtVLong = FmtLong << 1, 19037da2899SCharles.Forsyth FmtComma = FmtVLong << 1, 19137da2899SCharles.Forsyth FmtByte = FmtComma << 1, 19237da2899SCharles.Forsyth 19337da2899SCharles.Forsyth FmtFlag = FmtByte << 1 19437da2899SCharles.Forsyth }; 19537da2899SCharles.Forsyth 19637da2899SCharles.Forsyth extern int print(char*, ...); 19737da2899SCharles.Forsyth extern char* seprint(char*, char*, char*, ...); 19837da2899SCharles.Forsyth extern char* vseprint(char*, char*, char*, va_list); 19937da2899SCharles.Forsyth extern int snprint(char*, int, char*, ...); 20037da2899SCharles.Forsyth extern int vsnprint(char*, int, char*, va_list); 20137da2899SCharles.Forsyth extern char* smprint(char*, ...); 20237da2899SCharles.Forsyth extern char* vsmprint(char*, va_list); 20337da2899SCharles.Forsyth extern int sprint(char*, char*, ...); 20437da2899SCharles.Forsyth extern int fprint(int, char*, ...); 20537da2899SCharles.Forsyth extern int vfprint(int, char*, va_list); 20637da2899SCharles.Forsyth 20737da2899SCharles.Forsyth extern int runesprint(Rune*, char*, ...); 20837da2899SCharles.Forsyth extern int runesnprint(Rune*, int, char*, ...); 20937da2899SCharles.Forsyth extern int runevsnprint(Rune*, int, char*, va_list); 21037da2899SCharles.Forsyth extern Rune* runeseprint(Rune*, Rune*, char*, ...); 21137da2899SCharles.Forsyth extern Rune* runevseprint(Rune*, Rune*, char*, va_list); 21237da2899SCharles.Forsyth extern Rune* runesmprint(char*, ...); 21337da2899SCharles.Forsyth extern Rune* runevsmprint(char*, va_list); 21437da2899SCharles.Forsyth 21537da2899SCharles.Forsyth extern int fmtfdinit(Fmt*, int, char*, int); 21637da2899SCharles.Forsyth extern int fmtfdflush(Fmt*); 21737da2899SCharles.Forsyth extern int fmtstrinit(Fmt*); 21837da2899SCharles.Forsyth extern char* fmtstrflush(Fmt*); 21937da2899SCharles.Forsyth extern int runefmtstrinit(Fmt*); 22037da2899SCharles.Forsyth extern Rune* runefmtstrflush(Fmt*); 22137da2899SCharles.Forsyth 22237da2899SCharles.Forsyth extern int fmtinstall(int, int (*)(Fmt*)); 22337da2899SCharles.Forsyth extern int dofmt(Fmt*, char*); 22437da2899SCharles.Forsyth extern int dorfmt(Fmt*, Rune*); 22537da2899SCharles.Forsyth extern int fmtprint(Fmt*, char*, ...); 22637da2899SCharles.Forsyth extern int fmtvprint(Fmt*, char*, va_list); 22737da2899SCharles.Forsyth extern int fmtrune(Fmt*, int); 22837da2899SCharles.Forsyth extern int fmtstrcpy(Fmt*, char*); 22937da2899SCharles.Forsyth extern int fmtrunestrcpy(Fmt*, Rune*); 23037da2899SCharles.Forsyth /* 23137da2899SCharles.Forsyth * error string for %r 23237da2899SCharles.Forsyth * supplied on per os basis, not part of fmt library 23337da2899SCharles.Forsyth */ 23437da2899SCharles.Forsyth extern int errfmt(Fmt *f); 23537da2899SCharles.Forsyth 23637da2899SCharles.Forsyth /* 23737da2899SCharles.Forsyth * quoted strings 23837da2899SCharles.Forsyth */ 23937da2899SCharles.Forsyth extern char *unquotestrdup(char*); 24037da2899SCharles.Forsyth extern Rune *unquoterunestrdup(Rune*); 24137da2899SCharles.Forsyth extern char *quotestrdup(char*); 24237da2899SCharles.Forsyth extern Rune *quoterunestrdup(Rune*); 24337da2899SCharles.Forsyth extern int quotestrfmt(Fmt*); 24437da2899SCharles.Forsyth extern int quoterunestrfmt(Fmt*); 24537da2899SCharles.Forsyth extern void quotefmtinstall(void); 24637da2899SCharles.Forsyth extern int (*doquote)(int); 24737da2899SCharles.Forsyth 24837da2899SCharles.Forsyth /* 24937da2899SCharles.Forsyth * random number 25037da2899SCharles.Forsyth */ 25137da2899SCharles.Forsyth 25237da2899SCharles.Forsyth extern int nrand(int); 25337da2899SCharles.Forsyth extern ulong truerand(void); 25437da2899SCharles.Forsyth extern ulong ntruerand(ulong); 25537da2899SCharles.Forsyth 25637da2899SCharles.Forsyth /* 25737da2899SCharles.Forsyth * math 25837da2899SCharles.Forsyth */ 25937da2899SCharles.Forsyth extern int isNaN(double); 26037da2899SCharles.Forsyth extern int isInf(double, int); 26137da2899SCharles.Forsyth extern double pow(double, double); 26237da2899SCharles.Forsyth 26337da2899SCharles.Forsyth /* 26437da2899SCharles.Forsyth * Time-of-day 26537da2899SCharles.Forsyth */ 26637da2899SCharles.Forsyth 26737da2899SCharles.Forsyth typedef struct Tm Tm; 26837da2899SCharles.Forsyth struct Tm { 26937da2899SCharles.Forsyth int sec; 27037da2899SCharles.Forsyth int min; 27137da2899SCharles.Forsyth int hour; 27237da2899SCharles.Forsyth int mday; 27337da2899SCharles.Forsyth int mon; 27437da2899SCharles.Forsyth int year; 27537da2899SCharles.Forsyth int wday; 27637da2899SCharles.Forsyth int yday; 27737da2899SCharles.Forsyth char zone[4]; 27837da2899SCharles.Forsyth int tzoff; 27937da2899SCharles.Forsyth }; 28037da2899SCharles.Forsyth extern vlong osnsec(void); 28137da2899SCharles.Forsyth #define nsec osnsec 28237da2899SCharles.Forsyth 28337da2899SCharles.Forsyth /* 28437da2899SCharles.Forsyth * one-of-a-kind 28537da2899SCharles.Forsyth */ 28637da2899SCharles.Forsyth extern void _assert(char*); 28737da2899SCharles.Forsyth extern double charstod(int(*)(void*), void*); 28837da2899SCharles.Forsyth extern char* cleanname(char*); 28937da2899SCharles.Forsyth extern double frexp(double, int*); 2906b2e3235Sforsyth extern uintptr getcallerpc(void*); 29137da2899SCharles.Forsyth extern int getfields(char*, char**, int, int, char*); 29237da2899SCharles.Forsyth extern char* getuser(void); 29337da2899SCharles.Forsyth extern char* getwd(char*, int); 29437da2899SCharles.Forsyth extern double ipow10(int); 29537da2899SCharles.Forsyth extern double ldexp(double, int); 29637da2899SCharles.Forsyth extern double modf(double, double*); 29737da2899SCharles.Forsyth extern void perror(const char*); 29837da2899SCharles.Forsyth extern double pow10(int); 29937da2899SCharles.Forsyth extern uvlong strtoull(const char*, char**, int); 30037da2899SCharles.Forsyth extern void sysfatal(char*, ...); 30137da2899SCharles.Forsyth extern int dec64(uchar*, int, char*, int); 30237da2899SCharles.Forsyth extern int enc64(char*, int, uchar*, int); 30337da2899SCharles.Forsyth extern int dec32(uchar*, int, char*, int); 30437da2899SCharles.Forsyth extern int enc32(char*, int, uchar*, int); 30537da2899SCharles.Forsyth extern int dec16(uchar*, int, char*, int); 30637da2899SCharles.Forsyth extern int enc16(char*, int, uchar*, int); 30737da2899SCharles.Forsyth extern int encodefmt(Fmt*); 30837da2899SCharles.Forsyth 30937da2899SCharles.Forsyth /* 31037da2899SCharles.Forsyth * synchronization 31137da2899SCharles.Forsyth */ 31237da2899SCharles.Forsyth typedef 31337da2899SCharles.Forsyth struct Lock { 3147e004309SCharles.Forsyth int val; 31537da2899SCharles.Forsyth int pid; 31637da2899SCharles.Forsyth } Lock; 31737da2899SCharles.Forsyth 3187e004309SCharles.Forsyth extern int _tas(int*); 31937da2899SCharles.Forsyth 32037da2899SCharles.Forsyth extern void lock(Lock*); 32137da2899SCharles.Forsyth extern void unlock(Lock*); 32237da2899SCharles.Forsyth extern int canlock(Lock*); 32337da2899SCharles.Forsyth 32437da2899SCharles.Forsyth typedef struct QLock QLock; 32537da2899SCharles.Forsyth struct QLock 32637da2899SCharles.Forsyth { 32737da2899SCharles.Forsyth Lock use; /* to access Qlock structure */ 32837da2899SCharles.Forsyth Proc *head; /* next process waiting for object */ 32937da2899SCharles.Forsyth Proc *tail; /* last process waiting for object */ 33037da2899SCharles.Forsyth int locked; /* flag */ 33137da2899SCharles.Forsyth }; 33237da2899SCharles.Forsyth 33337da2899SCharles.Forsyth extern void qlock(QLock*); 33437da2899SCharles.Forsyth extern void qunlock(QLock*); 33537da2899SCharles.Forsyth extern int canqlock(QLock*); 33637da2899SCharles.Forsyth extern void _qlockinit(ulong (*)(ulong, ulong)); /* called only by the thread library */ 33737da2899SCharles.Forsyth 33837da2899SCharles.Forsyth typedef 33937da2899SCharles.Forsyth struct RWLock 34037da2899SCharles.Forsyth { 34137da2899SCharles.Forsyth Lock l; /* Lock modify lock */ 34237da2899SCharles.Forsyth QLock x; /* Mutual exclusion lock */ 34337da2899SCharles.Forsyth QLock k; /* Lock for waiting writers */ 34437da2899SCharles.Forsyth int readers; /* Count of readers in lock */ 34537da2899SCharles.Forsyth } RWLock; 34637da2899SCharles.Forsyth 34737da2899SCharles.Forsyth extern int canrlock(RWLock*); 34837da2899SCharles.Forsyth extern int canwlock(RWLock*); 34937da2899SCharles.Forsyth extern void rlock(RWLock*); 35037da2899SCharles.Forsyth extern void runlock(RWLock*); 35137da2899SCharles.Forsyth extern void wlock(RWLock*); 35237da2899SCharles.Forsyth extern void wunlock(RWLock*); 35337da2899SCharles.Forsyth 35437da2899SCharles.Forsyth /* 35537da2899SCharles.Forsyth * network dialing 35637da2899SCharles.Forsyth */ 35737da2899SCharles.Forsyth #define NETPATHLEN 40 35837da2899SCharles.Forsyth 35937da2899SCharles.Forsyth /* 36037da2899SCharles.Forsyth * system calls 36137da2899SCharles.Forsyth * 36237da2899SCharles.Forsyth */ 36337da2899SCharles.Forsyth 36437da2899SCharles.Forsyth #define STATMAX 65535U /* max length of machine-independent stat structure */ 36537da2899SCharles.Forsyth #define DIRMAX (sizeof(Dir)+STATMAX) /* max length of Dir structure */ 36637da2899SCharles.Forsyth #define ERRMAX 128 /* max length of error string */ 36737da2899SCharles.Forsyth 36837da2899SCharles.Forsyth #define MORDER 0x0003 /* mask for bits defining order of mounting */ 36937da2899SCharles.Forsyth #define MREPL 0x0000 /* mount replaces object */ 37037da2899SCharles.Forsyth #define MBEFORE 0x0001 /* mount goes before others in union directory */ 37137da2899SCharles.Forsyth #define MAFTER 0x0002 /* mount goes after others in union directory */ 37237da2899SCharles.Forsyth #define MCREATE 0x0004 /* permit creation in mounted directory */ 37337da2899SCharles.Forsyth #define MCACHE 0x0010 /* cache some data */ 37437da2899SCharles.Forsyth #define MMASK 0x0017 /* all bits on */ 37537da2899SCharles.Forsyth 37637da2899SCharles.Forsyth #define OREAD 0 /* open for read */ 37737da2899SCharles.Forsyth #define OWRITE 1 /* write */ 37837da2899SCharles.Forsyth #define ORDWR 2 /* read and write */ 37937da2899SCharles.Forsyth #define OEXEC 3 /* execute, == read but check execute permission */ 38037da2899SCharles.Forsyth #define OTRUNC 16 /* or'ed in (except for exec), truncate file first */ 38137da2899SCharles.Forsyth #define OCEXEC 32 /* or'ed in, close on exec */ 38237da2899SCharles.Forsyth #define ORCLOSE 64 /* or'ed in, remove on close */ 38337da2899SCharles.Forsyth #define OEXCL 0x1000 /* or'ed in, exclusive use (create only) */ 38437da2899SCharles.Forsyth 38537da2899SCharles.Forsyth #define AEXIST 0 /* accessible: exists */ 38637da2899SCharles.Forsyth #define AEXEC 1 /* execute access */ 38737da2899SCharles.Forsyth #define AWRITE 2 /* write access */ 38837da2899SCharles.Forsyth #define AREAD 4 /* read access */ 38937da2899SCharles.Forsyth 39037da2899SCharles.Forsyth /* bits in Qid.type */ 39137da2899SCharles.Forsyth #define QTDIR 0x80 /* type bit for directories */ 39237da2899SCharles.Forsyth #define QTAPPEND 0x40 /* type bit for append only files */ 39337da2899SCharles.Forsyth #define QTEXCL 0x20 /* type bit for exclusive use files */ 39437da2899SCharles.Forsyth #define QTMOUNT 0x10 /* type bit for mounted channel */ 39537da2899SCharles.Forsyth #define QTAUTH 0x08 /* type bit for authentication file */ 39637da2899SCharles.Forsyth #define QTFILE 0x00 /* plain file */ 39737da2899SCharles.Forsyth 39837da2899SCharles.Forsyth /* bits in Dir.mode */ 39937da2899SCharles.Forsyth #define DMDIR 0x80000000 /* mode bit for directories */ 40037da2899SCharles.Forsyth #define DMAPPEND 0x40000000 /* mode bit for append only files */ 40137da2899SCharles.Forsyth #define DMEXCL 0x20000000 /* mode bit for exclusive use files */ 40237da2899SCharles.Forsyth #define DMMOUNT 0x10000000 /* mode bit for mounted channel */ 40337da2899SCharles.Forsyth #define DMAUTH 0x08000000 /* mode bit for authentication file */ 40437da2899SCharles.Forsyth #define DMREAD 0x4 /* mode bit for read permission */ 40537da2899SCharles.Forsyth #define DMWRITE 0x2 /* mode bit for write permission */ 40637da2899SCharles.Forsyth #define DMEXEC 0x1 /* mode bit for execute permission */ 40737da2899SCharles.Forsyth 40837da2899SCharles.Forsyth typedef 40937da2899SCharles.Forsyth struct Qid 41037da2899SCharles.Forsyth { 41137da2899SCharles.Forsyth uvlong path; 41237da2899SCharles.Forsyth ulong vers; 41337da2899SCharles.Forsyth uchar type; 41437da2899SCharles.Forsyth } Qid; 41537da2899SCharles.Forsyth 41637da2899SCharles.Forsyth typedef 41737da2899SCharles.Forsyth struct Dir { 41837da2899SCharles.Forsyth /* system-modified data */ 41937da2899SCharles.Forsyth ushort type; /* server type */ 42037da2899SCharles.Forsyth uint dev; /* server subtype */ 42137da2899SCharles.Forsyth /* file data */ 42237da2899SCharles.Forsyth Qid qid; /* unique id from server */ 42337da2899SCharles.Forsyth ulong mode; /* permissions */ 42437da2899SCharles.Forsyth ulong atime; /* last read time */ 42537da2899SCharles.Forsyth ulong mtime; /* last write time */ 42637da2899SCharles.Forsyth vlong length; /* file length */ 42737da2899SCharles.Forsyth char *name; /* last element of path */ 42837da2899SCharles.Forsyth char *uid; /* owner name */ 42937da2899SCharles.Forsyth char *gid; /* group name */ 43037da2899SCharles.Forsyth char *muid; /* last modifier name */ 43137da2899SCharles.Forsyth } Dir; 43237da2899SCharles.Forsyth 43337da2899SCharles.Forsyth extern Dir* dirstat(char*); 43437da2899SCharles.Forsyth extern Dir* dirfstat(int); 43537da2899SCharles.Forsyth extern int dirwstat(char*, Dir*); 43637da2899SCharles.Forsyth extern int dirfwstat(int, Dir*); 43737da2899SCharles.Forsyth extern long dirread(int, Dir**); 43837da2899SCharles.Forsyth extern void nulldir(Dir*); 43937da2899SCharles.Forsyth extern long dirreadall(int, Dir**); 44037da2899SCharles.Forsyth 44137da2899SCharles.Forsyth typedef 44237da2899SCharles.Forsyth struct Waitmsg 44337da2899SCharles.Forsyth { 44437da2899SCharles.Forsyth int pid; /* of loved one */ 44537da2899SCharles.Forsyth ulong time[3]; /* of loved one & descendants */ 44637da2899SCharles.Forsyth char *msg; 44737da2899SCharles.Forsyth } Waitmsg; 44837da2899SCharles.Forsyth 44937da2899SCharles.Forsyth extern void _exits(char*); 45037da2899SCharles.Forsyth 45137da2899SCharles.Forsyth extern void exits(char*); 45237da2899SCharles.Forsyth extern int create(char*, int, int); 45337da2899SCharles.Forsyth extern int errstr(char*, uint); 45437da2899SCharles.Forsyth 45537da2899SCharles.Forsyth extern void perror(const char*); 45637da2899SCharles.Forsyth extern long readn(int, void*, long); 45737da2899SCharles.Forsyth extern int remove(const char*); 45837da2899SCharles.Forsyth extern void rerrstr(char*, uint); 45937da2899SCharles.Forsyth extern vlong seek(int, vlong, int); 46037da2899SCharles.Forsyth extern int segflush(void*, ulong); 46137da2899SCharles.Forsyth extern void werrstr(char*, ...); 46237da2899SCharles.Forsyth 46337da2899SCharles.Forsyth extern char *argv0; 46437da2899SCharles.Forsyth #define ARGBEGIN for((argv0||(argv0=*argv)),argv++,argc--;\ 46537da2899SCharles.Forsyth argv[0] && argv[0][0]=='-' && argv[0][1];\ 46637da2899SCharles.Forsyth argc--, argv++) {\ 46737da2899SCharles.Forsyth char *_args, *_argt;\ 46837da2899SCharles.Forsyth Rune _argc;\ 46937da2899SCharles.Forsyth _args = &argv[0][1];\ 47037da2899SCharles.Forsyth if(_args[0]=='-' && _args[1]==0){\ 47137da2899SCharles.Forsyth argc--; argv++; break;\ 47237da2899SCharles.Forsyth }\ 47337da2899SCharles.Forsyth _argc = 0;\ 47437da2899SCharles.Forsyth while(*_args && (_args += chartorune(&_argc, _args)))\ 47537da2899SCharles.Forsyth switch(_argc) 47637da2899SCharles.Forsyth #define ARGEND SET(_argt);USED(_argt);USED(_argc); USED(_args);}USED(argv); USED(argc); 47737da2899SCharles.Forsyth #define ARGF() (_argt=_args, _args="",\ 47837da2899SCharles.Forsyth (*_argt? _argt: argv[1]? (argc--, *++argv): 0)) 47937da2899SCharles.Forsyth #define EARGF(x) (_argt=_args, _args="",\ 48037da2899SCharles.Forsyth (*_argt? _argt: argv[1]? (argc--, *++argv): ((x), abort(), (char*)0))) 48137da2899SCharles.Forsyth 48237da2899SCharles.Forsyth #define ARGC() _argc 48337da2899SCharles.Forsyth 48437da2899SCharles.Forsyth /* 48537da2899SCharles.Forsyth * Extensions for Inferno to basic libc.h 48637da2899SCharles.Forsyth */ 48737da2899SCharles.Forsyth 48837da2899SCharles.Forsyth #define setbinmode() 48937da2899SCharles.Forsyth 490*8e8fedb8SCharles Forsyth 491*8e8fedb8SCharles Forsyth /* FPSCR */ 492*8e8fedb8SCharles Forsyth #define FPSFX (1<<31) /* exception summary (sticky) */ 493*8e8fedb8SCharles Forsyth #define FPSEX (1<<30) /* enabled exception summary */ 494*8e8fedb8SCharles Forsyth #define FPSVX (1<<29) /* invalid operation exception summary */ 495*8e8fedb8SCharles Forsyth #define FPSOX (1<<28) /* overflow exception OX (sticky) */ 496*8e8fedb8SCharles Forsyth #define FPSUX (1<<27) /* underflow exception UX (sticky) */ 497*8e8fedb8SCharles Forsyth #define FPSZX (1<<26) /* zero divide exception ZX (sticky) */ 498*8e8fedb8SCharles Forsyth #define FPSXX (1<<25) /* inexact exception XX (sticky) */ 499*8e8fedb8SCharles Forsyth #define FPSVXSNAN (1<<24) /* invalid operation exception for SNaN (sticky) */ 500*8e8fedb8SCharles Forsyth #define FPSVXISI (1<<23) /* invalid operation exception for ∞-∞ (sticky) */ 501*8e8fedb8SCharles Forsyth #define FPSVXIDI (1<<22) /* invalid operation exception for ∞/∞ (sticky) */ 502*8e8fedb8SCharles Forsyth #define FPSVXZDZ (1<<21) /* invalid operation exception for 0/0 (sticky) */ 503*8e8fedb8SCharles Forsyth #define FPSVXIMZ (1<<20) /* invalid operation exception for ∞*0 (sticky) */ 504*8e8fedb8SCharles Forsyth #define FPSVXVC (1<<19) /* invalid operation exception for invalid compare (sticky) */ 505*8e8fedb8SCharles Forsyth #define FPSFR (1<<18) /* fraction rounded */ 506*8e8fedb8SCharles Forsyth #define FPSFI (1<<17) /* fraction inexact */ 507*8e8fedb8SCharles Forsyth #define FPSFPRF (1<<16) /* floating point result class */ 508*8e8fedb8SCharles Forsyth #define FPSFPCC (0xF<<12) /* <, >, =, unordered */ 509*8e8fedb8SCharles Forsyth #define FPVXCVI (1<<8) /* enable exception for invalid integer convert (sticky) */ 510*8e8fedb8SCharles Forsyth 511*8e8fedb8SCharles Forsyth /* FCR */ 512*8e8fedb8SCharles Forsyth #define FPVE (1<<7) /* invalid operation exception enable */ 513*8e8fedb8SCharles Forsyth #define FPOVFL (1<<6) /* enable overflow exceptions */ 514*8e8fedb8SCharles Forsyth #define FPUNFL (1<<5) /* enable underflow */ 515*8e8fedb8SCharles Forsyth #define FPZDIV (1<<4) /* enable zero divide */ 516*8e8fedb8SCharles Forsyth #define FPINEX (1<<3) /* enable inexact exceptions */ 517*8e8fedb8SCharles Forsyth #define FPRMASK (3<<0) /* rounding mode */ 518*8e8fedb8SCharles Forsyth #define FPRNR (0<<0) 519*8e8fedb8SCharles Forsyth #define FPRZ (1<<0) 520*8e8fedb8SCharles Forsyth #define FPRPINF (2<<0) 521*8e8fedb8SCharles Forsyth #define FPRNINF (3<<0) 522*8e8fedb8SCharles Forsyth #define FPPEXT 0 523*8e8fedb8SCharles Forsyth #define FPPSGL 0 524*8e8fedb8SCharles Forsyth #define FPPDBL 0 525*8e8fedb8SCharles Forsyth #define FPPMASK 0 526*8e8fedb8SCharles Forsyth #define FPINVAL FPVE 527*8e8fedb8SCharles Forsyth /* FSR */ 528*8e8fedb8SCharles Forsyth #define FPAOVFL FPSOX 529*8e8fedb8SCharles Forsyth #define FPAINEX FPSXX 530*8e8fedb8SCharles Forsyth #define FPAUNFL FPSUX 531*8e8fedb8SCharles Forsyth #define FPAZDIV FPSZX 532*8e8fedb8SCharles Forsyth #define FPAINVAL FPSVX 533*8e8fedb8SCharles Forsyth 534*8e8fedb8SCharles Forsyth extern void setfcr(ulong); 535*8e8fedb8SCharles Forsyth extern void setfsr(ulong); 536*8e8fedb8SCharles Forsyth extern ulong getfcr(void): 537*8e8fedb8SCharles Forsyth extern ulong getfsr(void); 538