1 /* magic to get SUSV2 standard, including pread, pwrite*/ 2 #define _XOPEN_SOURCE 500 3 /* magic to get 64-bit pread/pwrite */ 4 #define _LARGEFILE64_SOURCE 5 6 #ifdef sgi 7 #define _BSD_TYPES 1 /* for struct timeval */ 8 #include <sys/select.h> 9 #define _BSD_SOURCE 1 /* for ruserok */ 10 /* 11 * SGI IRIX 5.x doesn't allow inclusion of both inttypes.h and 12 * sys/types.h. These definitions are the ones we need from 13 * inttypes.h that aren't in sys/types.h. 14 * 15 * Unlike most of our #ifdef's, IRIX5X must be set in the makefile. 16 */ 17 #ifdef IRIX5X 18 #define __inttypes_INCLUDED 19 typedef unsigned int uint32_t; 20 typedef signed long long int int64_t; 21 typedef unsigned long long int uint64_t; 22 #endif /* IRIX5X */ 23 #endif /* sgi */ 24 25 26 #ifdef sun /* sparc and __svr4__ are also defined on the offending machine */ 27 #define __EXTENSIONS__ 1 /* for struct timeval */ 28 #endif 29 30 #include <inttypes.h> /* for int64_t et al. */ 31 #include <stdarg.h> /* for va_list, vararg macros */ 32 #include <sys/types.h> 33 #include <string.h> /* for memmove */ 34 #include <unistd.h> /* for write */ 35 36 #define ulong p9ulong /* because sys/types.h has some of these sometimes */ 37 #define ushort p9ushort 38 #define uchar p9uchar 39 #define uint p9uint 40 #define vlong p9vlong 41 #define uvlong p9uvlong 42 #define u32int p9u32int 43 44 typedef unsigned char uchar; 45 typedef unsigned short ushort; 46 typedef unsigned long ulong; 47 typedef unsigned int uint; 48 typedef int64_t vlong; 49 typedef uint64_t uvlong; 50 typedef uint32_t u32int; 51 typedef uint64_t u64int; 52 typedef ushort Rune; 53 54 #define nil ((void*)0) 55 #define nelem(x) (sizeof(x)/sizeof((x)[0])) 56 #define offsetof(s, m) (ulong)(&(((s*)0)->m)) 57 #define assert(x) if(x);else _assert("x") 58 59 extern char *argv0; 60 #define ARGBEGIN for((void)(argv0||(argv0=*argv)),argv++,argc--;\ 61 argv[0] && argv[0][0]=='-' && argv[0][1];\ 62 argc--, argv++) {\ 63 char *_args, *_argt;\ 64 Rune _argc;\ 65 _args = &argv[0][1];\ 66 if(_args[0]=='-' && _args[1]==0){\ 67 argc--; argv++; break;\ 68 }\ 69 _argc = 0;\ 70 while(*_args && (_args += chartorune(&_argc, _args)))\ 71 switch(_argc) 72 #define ARGEND SET(_argt);USED(_argt);USED(_argc);USED(_args);}\ 73 USED(argv);USED(argc); 74 #define ARGF() (_argt=_args, _args="",\ 75 (*_argt? _argt: argv[1]? (argc--, *++argv): 0)) 76 #define EARGF(x) (_argt=_args, _args="",\ 77 (*_argt? _argt: argv[1]? (argc--, *++argv): ((x), abort(), (char*)0))) 78 79 #define ARGC() _argc 80 81 #define SET(x) (x) = 0 82 #define USED(x) (void)(x) 83 84 enum 85 { 86 UTFmax = 3, /* maximum bytes per rune */ 87 Runesync = 0x80, /* cannot represent part of a UTF sequence (<) */ 88 Runeself = 0x80, /* rune and UTF sequences are the same (<) */ 89 Runeerror = 0x80 /* decoding error in UTF */ 90 }; 91 92 extern int runetochar(char*, Rune*); 93 extern int chartorune(Rune*, char*); 94 extern int runelen(long); 95 extern int utflen(char*); 96 extern char* strecpy(char*, char*, char*); 97 extern int tokenize(char*, char**, int); 98 extern int getfields(char*, char**, int, int, char*); 99 100 /* 101 * print routines 102 */ 103 typedef struct Fconv Fconv; 104 struct Fconv 105 { 106 char* out; /* pointer to next output */ 107 char* eout; /* pointer to end */ 108 int f1; 109 int f2; 110 int f3; 111 int chr; 112 }; 113 extern char* doprint(char*, char*, char*, va_list); 114 extern int print(char*, ...); 115 extern char* seprint(char*, char*, char*, ...); 116 extern int snprint(char*, int, char*, ...); 117 extern int sprint(char*, char*, ...); 118 extern int fprint(int, char*, ...); 119 120 extern int fmtinstall(int, int (*)(va_list*, Fconv*)); 121 extern int numbconv(va_list*, Fconv*); 122 extern void strconv(char*, Fconv*); 123 extern int fltconv(va_list*, Fconv*); 124 125 #define OREAD 0 /* open for read */ 126 #define OWRITE 1 /* write */ 127 #define ORDWR 2 /* read and write */ 128 #define OEXEC 3 /* execute, == read but check execute permission */ 129 #define OTRUNC 16 /* or'ed in (except for exec), truncate file first */ 130 #define OCEXEC 32 /* or'ed in, close on exec */ 131 #define ORCLOSE 64 /* or'ed in, remove on close */ 132 #define OEXCL 0x1000 /* or'ed in, exclusive use */ 133 134 /* bits in Qid.type */ 135 #define QTDIR 0x80 /* type bit for directories */ 136 #define QTAPPEND 0x40 /* type bit for append only files */ 137 #define QTEXCL 0x20 /* type bit for exclusive use files */ 138 #define QTMOUNT 0x10 /* type bit for mounted channel */ 139 #define QTFILE 0x00 /* plain file */ 140 141 /* bits in Dir.mode */ 142 #define DMDIR 0x80000000 /* mode bit for directories */ 143 #define DMAPPEND 0x40000000 /* mode bit for append only files */ 144 #define DMEXCL 0x20000000 /* mode bit for exclusive use files */ 145 #define DMMOUNT 0x10000000 /* mode bit for mounted channel */ 146 #define DMREAD 0x4 /* mode bit for read permission */ 147 #define DMWRITE 0x2 /* mode bit for write permission */ 148 #define DMEXEC 0x1 /* mode bit for execute permission */ 149 150 typedef 151 struct Qid 152 { 153 vlong path; 154 ulong vers; 155 uchar type; 156 } Qid; 157 158 typedef 159 struct Dir { 160 /* system-modified data */ 161 ushort type; /* server type */ 162 uint dev; /* server subtype */ 163 /* file data */ 164 Qid qid; /* unique id from server */ 165 ulong mode; /* permissions */ 166 ulong atime; /* last read time */ 167 ulong mtime; /* last write time */ 168 vlong length; /* file length: see <u.h> */ 169 char *name; /* last element of path */ 170 char *uid; /* owner name */ 171 char *gid; /* group name */ 172 char *muid; /* last modifier name */ 173 } Dir; 174 175 long readn(int, void*, long); 176 void remotehost(char*, int); 177 178 enum { 179 NAMELEN = 28, 180 ERRLEN = 64 181 }; 182