19a747e4fSDavid du Colombier /* magic to get SUSV2 standard, including pread, pwrite*/ 29a747e4fSDavid du Colombier #define _XOPEN_SOURCE 500 39a747e4fSDavid du Colombier /* magic to get 64-bit pread/pwrite */ 49a747e4fSDavid du Colombier #define _LARGEFILE64_SOURCE 563dc73a9SDavid du Colombier /* magic to get 64-bit stat on Linux, maybe others */ 663dc73a9SDavid du Colombier #define _FILE_OFFSET_BITS 64 79a747e4fSDavid du Colombier 89a747e4fSDavid du Colombier #ifdef sgi 99a747e4fSDavid du Colombier #define _BSD_TYPES 1 /* for struct timeval */ 109a747e4fSDavid du Colombier #include <sys/select.h> 119a747e4fSDavid du Colombier #define _BSD_SOURCE 1 /* for ruserok */ 129a747e4fSDavid du Colombier /* 139a747e4fSDavid du Colombier * SGI IRIX 5.x doesn't allow inclusion of both inttypes.h and 149a747e4fSDavid du Colombier * sys/types.h. These definitions are the ones we need from 159a747e4fSDavid du Colombier * inttypes.h that aren't in sys/types.h. 169a747e4fSDavid du Colombier * 179a747e4fSDavid du Colombier * Unlike most of our #ifdef's, IRIX5X must be set in the makefile. 189a747e4fSDavid du Colombier */ 199a747e4fSDavid du Colombier #ifdef IRIX5X 209a747e4fSDavid du Colombier #define __inttypes_INCLUDED 219a747e4fSDavid du Colombier typedef unsigned int uint32_t; 229a747e4fSDavid du Colombier typedef signed long long int int64_t; 239a747e4fSDavid du Colombier typedef unsigned long long int uint64_t; 249a747e4fSDavid du Colombier #endif /* IRIX5X */ 259a747e4fSDavid du Colombier #endif /* sgi */ 269a747e4fSDavid du Colombier 27d9306527SDavid du Colombier 28d9306527SDavid du Colombier #ifdef sun /* sparc and __svr4__ are also defined on the offending machine */ 29d9306527SDavid du Colombier #define __EXTENSIONS__ 1 /* for struct timeval */ 30d9306527SDavid du Colombier #endif 31d9306527SDavid du Colombier 329a747e4fSDavid du Colombier #include <inttypes.h> /* for int64_t et al. */ 33*b94bb474SDavid du Colombier #include <stdlib.h> 349a747e4fSDavid du Colombier #include <stdarg.h> /* for va_list, vararg macros */ 359df35464SDavid du Colombier #ifndef va_copy 369df35464SDavid du Colombier #ifdef __va_copy 379df35464SDavid du Colombier #define va_copy __va_copy 389df35464SDavid du Colombier #else 399df35464SDavid du Colombier #define va_copy(d, s) memmove(&(d), &(s), sizeof(va_list)) 409df35464SDavid du Colombier #endif /* __va_copy */ 419df35464SDavid du Colombier #endif /* va_copy */ 429a747e4fSDavid du Colombier #include <sys/types.h> 439a747e4fSDavid du Colombier #include <string.h> /* for memmove */ 449a747e4fSDavid du Colombier #include <unistd.h> /* for write */ 45*b94bb474SDavid du Colombier #include <fcntl.h> 469a747e4fSDavid du Colombier 479a747e4fSDavid du Colombier #define ulong p9ulong /* because sys/types.h has some of these sometimes */ 489a747e4fSDavid du Colombier #define ushort p9ushort 499a747e4fSDavid du Colombier #define uchar p9uchar 509a747e4fSDavid du Colombier #define uint p9uint 519a747e4fSDavid du Colombier #define vlong p9vlong 529a747e4fSDavid du Colombier #define uvlong p9uvlong 539a747e4fSDavid du Colombier #define u32int p9u32int 549a747e4fSDavid du Colombier 559a747e4fSDavid du Colombier typedef unsigned char uchar; 569a747e4fSDavid du Colombier typedef unsigned short ushort; 579a747e4fSDavid du Colombier typedef unsigned long ulong; 589a747e4fSDavid du Colombier typedef unsigned int uint; 599a747e4fSDavid du Colombier typedef int64_t vlong; 609a747e4fSDavid du Colombier typedef uint64_t uvlong; 619a747e4fSDavid du Colombier typedef uint32_t u32int; 629a747e4fSDavid du Colombier typedef uint64_t u64int; 639a747e4fSDavid du Colombier typedef ushort Rune; 649a747e4fSDavid du Colombier 659a747e4fSDavid du Colombier #define nil ((void*)0) 669a747e4fSDavid du Colombier #define nelem(x) (sizeof(x)/sizeof((x)[0])) 67dfda52d8SDavid du Colombier #ifndef offsetof 689a747e4fSDavid du Colombier #define offsetof(s, m) (ulong)(&(((s*)0)->m)) 69dfda52d8SDavid du Colombier #endif 709a747e4fSDavid du Colombier #define assert(x) if(x);else _assert("x") 719a747e4fSDavid du Colombier 729a747e4fSDavid du Colombier extern char *argv0; 739a747e4fSDavid du Colombier #define ARGBEGIN for((void)(argv0||(argv0=*argv)),argv++,argc--;\ 749a747e4fSDavid du Colombier argv[0] && argv[0][0]=='-' && argv[0][1];\ 759a747e4fSDavid du Colombier argc--, argv++) {\ 769a747e4fSDavid du Colombier char *_args, *_argt;\ 779a747e4fSDavid du Colombier Rune _argc;\ 789a747e4fSDavid du Colombier _args = &argv[0][1];\ 799a747e4fSDavid du Colombier if(_args[0]=='-' && _args[1]==0){\ 809a747e4fSDavid du Colombier argc--; argv++; break;\ 819a747e4fSDavid du Colombier }\ 829a747e4fSDavid du Colombier _argc = 0;\ 839a747e4fSDavid du Colombier while(*_args && (_args += chartorune(&_argc, _args)))\ 849a747e4fSDavid du Colombier switch(_argc) 859a747e4fSDavid du Colombier #define ARGEND SET(_argt);USED(_argt);USED(_argc);USED(_args);}\ 869a747e4fSDavid du Colombier USED(argv);USED(argc); 879a747e4fSDavid du Colombier #define ARGF() (_argt=_args, _args="",\ 889a747e4fSDavid du Colombier (*_argt? _argt: argv[1]? (argc--, *++argv): 0)) 899a747e4fSDavid du Colombier #define EARGF(x) (_argt=_args, _args="",\ 909a747e4fSDavid du Colombier (*_argt? _argt: argv[1]? (argc--, *++argv): ((x), abort(), (char*)0))) 919a747e4fSDavid du Colombier 929a747e4fSDavid du Colombier #define ARGC() _argc 939a747e4fSDavid du Colombier 949a747e4fSDavid du Colombier #define SET(x) (x) = 0 959a747e4fSDavid du Colombier #define USED(x) (void)(x) 969a747e4fSDavid du Colombier 979a747e4fSDavid du Colombier enum 989a747e4fSDavid du Colombier { 999a747e4fSDavid du Colombier UTFmax = 3, /* maximum bytes per rune */ 1009a747e4fSDavid du Colombier Runesync = 0x80, /* cannot represent part of a UTF sequence (<) */ 1019a747e4fSDavid du Colombier Runeself = 0x80, /* rune and UTF sequences are the same (<) */ 1029a747e4fSDavid du Colombier Runeerror = 0x80 /* decoding error in UTF */ 1039a747e4fSDavid du Colombier }; 1049a747e4fSDavid du Colombier 1059a747e4fSDavid du Colombier extern int runetochar(char*, Rune*); 1069a747e4fSDavid du Colombier extern int chartorune(Rune*, char*); 1079a747e4fSDavid du Colombier extern int runelen(long); 1089a747e4fSDavid du Colombier extern int utflen(char*); 1099a747e4fSDavid du Colombier extern char* strecpy(char*, char*, char*); 1109a747e4fSDavid du Colombier extern int tokenize(char*, char**, int); 1119a747e4fSDavid du Colombier extern int getfields(char*, char**, int, int, char*); 1129a747e4fSDavid du Colombier 1139a747e4fSDavid du Colombier /* 1149a747e4fSDavid du Colombier * print routines 1159a747e4fSDavid du Colombier */ 1169a747e4fSDavid du Colombier typedef struct Fconv Fconv; 1179a747e4fSDavid du Colombier struct Fconv 1189a747e4fSDavid du Colombier { 1199a747e4fSDavid du Colombier char* out; /* pointer to next output */ 1209a747e4fSDavid du Colombier char* eout; /* pointer to end */ 1219a747e4fSDavid du Colombier int f1; 1229a747e4fSDavid du Colombier int f2; 1239a747e4fSDavid du Colombier int f3; 1249a747e4fSDavid du Colombier int chr; 1259a747e4fSDavid du Colombier }; 1269df35464SDavid du Colombier extern char* doprint(char*, char*, char*, va_list *argp); 1279a747e4fSDavid du Colombier extern int print(char*, ...); 1289a747e4fSDavid du Colombier extern char* seprint(char*, char*, char*, ...); 1299a747e4fSDavid du Colombier extern int snprint(char*, int, char*, ...); 1309a747e4fSDavid du Colombier extern int sprint(char*, char*, ...); 1319a747e4fSDavid du Colombier extern int fprint(int, char*, ...); 1329a747e4fSDavid du Colombier 1339a747e4fSDavid du Colombier extern int fmtinstall(int, int (*)(va_list*, Fconv*)); 1349a747e4fSDavid du Colombier extern int numbconv(va_list*, Fconv*); 1359a747e4fSDavid du Colombier extern void strconv(char*, Fconv*); 1369a747e4fSDavid du Colombier extern int fltconv(va_list*, Fconv*); 1379a747e4fSDavid du Colombier 1389a747e4fSDavid du Colombier #define OREAD 0 /* open for read */ 1399a747e4fSDavid du Colombier #define OWRITE 1 /* write */ 1409a747e4fSDavid du Colombier #define ORDWR 2 /* read and write */ 1419a747e4fSDavid du Colombier #define OEXEC 3 /* execute, == read but check execute permission */ 1429a747e4fSDavid du Colombier #define OTRUNC 16 /* or'ed in (except for exec), truncate file first */ 1439a747e4fSDavid du Colombier #define OCEXEC 32 /* or'ed in, close on exec */ 1449a747e4fSDavid du Colombier #define ORCLOSE 64 /* or'ed in, remove on close */ 1459a747e4fSDavid du Colombier #define OEXCL 0x1000 /* or'ed in, exclusive use */ 1469a747e4fSDavid du Colombier 1479a747e4fSDavid du Colombier /* bits in Qid.type */ 1489a747e4fSDavid du Colombier #define QTDIR 0x80 /* type bit for directories */ 1499a747e4fSDavid du Colombier #define QTAPPEND 0x40 /* type bit for append only files */ 1509a747e4fSDavid du Colombier #define QTEXCL 0x20 /* type bit for exclusive use files */ 1519a747e4fSDavid du Colombier #define QTMOUNT 0x10 /* type bit for mounted channel */ 15250a9bdd4SDavid du Colombier #define QTAUTH 0x08 1539a747e4fSDavid du Colombier #define QTFILE 0x00 /* plain file */ 1549a747e4fSDavid du Colombier 1559a747e4fSDavid du Colombier /* bits in Dir.mode */ 1569a747e4fSDavid du Colombier #define DMDIR 0x80000000 /* mode bit for directories */ 1579a747e4fSDavid du Colombier #define DMAPPEND 0x40000000 /* mode bit for append only files */ 1589a747e4fSDavid du Colombier #define DMEXCL 0x20000000 /* mode bit for exclusive use files */ 1599a747e4fSDavid du Colombier #define DMMOUNT 0x10000000 /* mode bit for mounted channel */ 1609a747e4fSDavid du Colombier #define DMREAD 0x4 /* mode bit for read permission */ 1619a747e4fSDavid du Colombier #define DMWRITE 0x2 /* mode bit for write permission */ 1629a747e4fSDavid du Colombier #define DMEXEC 0x1 /* mode bit for execute permission */ 1639a747e4fSDavid du Colombier 1649a747e4fSDavid du Colombier typedef 1659a747e4fSDavid du Colombier struct Qid 1669a747e4fSDavid du Colombier { 1679a747e4fSDavid du Colombier vlong path; 1689a747e4fSDavid du Colombier ulong vers; 1699a747e4fSDavid du Colombier uchar type; 1709a747e4fSDavid du Colombier } Qid; 1719a747e4fSDavid du Colombier 1729a747e4fSDavid du Colombier typedef 1739a747e4fSDavid du Colombier struct Dir { 1749a747e4fSDavid du Colombier /* system-modified data */ 1759a747e4fSDavid du Colombier ushort type; /* server type */ 1769a747e4fSDavid du Colombier uint dev; /* server subtype */ 1779a747e4fSDavid du Colombier /* file data */ 1789a747e4fSDavid du Colombier Qid qid; /* unique id from server */ 1799a747e4fSDavid du Colombier ulong mode; /* permissions */ 1809a747e4fSDavid du Colombier ulong atime; /* last read time */ 1819a747e4fSDavid du Colombier ulong mtime; /* last write time */ 1829a747e4fSDavid du Colombier vlong length; /* file length: see <u.h> */ 1839a747e4fSDavid du Colombier char *name; /* last element of path */ 1849a747e4fSDavid du Colombier char *uid; /* owner name */ 1859a747e4fSDavid du Colombier char *gid; /* group name */ 1869a747e4fSDavid du Colombier char *muid; /* last modifier name */ 1879a747e4fSDavid du Colombier } Dir; 1889a747e4fSDavid du Colombier 1899a747e4fSDavid du Colombier long readn(int, void*, long); 1909a747e4fSDavid du Colombier void remotehost(char*, int); 1919a747e4fSDavid du Colombier 1929a747e4fSDavid du Colombier enum { 1939a747e4fSDavid du Colombier NAMELEN = 28, 1949a747e4fSDavid du Colombier ERRLEN = 64 1959a747e4fSDavid du Colombier }; 1966b6b9ac8SDavid du Colombier 1976b6b9ac8SDavid du Colombier /* DES */ 19863dc73a9SDavid du Colombier #define DESKEYLEN 7 1996b6b9ac8SDavid du Colombier void key_setup(char key[DESKEYLEN], char expandedkey[128]); 2006b6b9ac8SDavid du Colombier void block_cipher(char expandedkey[128], char buf[8], int decrypting); 201