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