xref: /plan9/sys/src/cmd/aquarela/smbdat.h (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
1 typedef struct SmbSession SmbSession;
2 typedef struct SmbTree SmbTree;
3 typedef struct SmbService SmbService;
4 typedef struct SmbPeerInfo SmbPeerInfo;
5 typedef struct SmbTransaction SmbTransaction;
6 typedef struct SmbBuffer SmbBuffer;
7 typedef struct SmbIdMap SmbIdMap;
8 typedef struct SmbSearch SmbSearch;
9 typedef struct SmbDirCache SmbDirCache;
10 typedef struct SmbFile SmbFile;
11 typedef struct SmbSharedFile SmbSharedFile;
12 typedef struct SmbCifsSession SmbCifsSession;
13 typedef struct SmbServerInfo SmbServerInfo;
14 typedef struct SmbRapServerInfo1 SmbRapServerInfo1;
15 typedef struct SmbFindFileBothDirectoryInfo SmbFindFileBothDirectoryInfo;
16 typedef struct SmbLock SmbLock;
17 typedef struct SmbLockList SmbLockList;
18 typedef struct SmbSlut SmbSlut;
19 
20 #pragma incomplete SmbIdMap
21 #pragma incomplete SmbBuffer
22 #pragma incomplete SmbLockList
23 
24 typedef int SMBCIFSWRITEFN(SmbCifsSession *cifs, void *buf, long n);
25 typedef int SMBCIFSACCEPTFN(SmbCifsSession *cifs, SMBCIFSWRITEFN **fnp);
26 typedef void SMBIDMAPAPPLYFN(void *magic, void *p);
27 
28 struct SmbPeerInfo {
29 	ulong capabilities;
30 	ushort maxlen;
31 	uchar securitymode;
32 	ushort maxmpxcount;
33 	ushort maxnumbervcs;
34 	ulong maxbuffersize;
35 	ulong maxrawsize;
36 	ulong sessionkey;
37 	vlong utc;
38 	short tzoff;
39 	uchar encryptionkeylength;
40 	uchar *encryptionkey;
41 	char *oemdomainname;
42 };
43 
44 struct SmbTransaction {
45 	struct {
46 		char *name;
47 		ulong tpcount;
48 		uchar *parameters;
49 		ulong pcount;
50 		ulong tdcount;
51 		uchar *data;
52 		ulong maxpcount;
53 		ulong maxdcount;
54 		ulong maxscount;
55 		ulong dcount;
56 		ushort scount;
57 		ushort *setup;
58 		ushort flags;
59 	} in;
60 	struct {
61 		ulong tpcount;
62 		ulong tdcount;
63 		SmbBuffer *parameters;
64 		SmbBuffer *data;
65 		ushort *setup;
66 	} out;
67 };
68 
69 enum {
70 	SmbSessionNeedNegotiate,
71 	SmbSessionNeedSetup,
72 	SmbSessionEstablished,
73 };
74 
75 struct SmbSession {
76 	NbSession *nbss;
77 	SmbCifsSession *cifss;
78 	uchar nextcommand;
79 	SmbBuffer *response;
80 	SmbPeerInfo peerinfo;
81 	Chalstate *cs;
82 	struct {
83 		char *accountname;
84 		char *primarydomain;
85 		char *nativeos;
86 		char *nativelanman;
87 		ushort maxmpxcount;
88 		MSchapreply mschapreply;
89 	} client;
90 	SmbTransaction transaction;
91 	SmbIdMap *fidmap;
92 	SmbIdMap *tidmap;
93 	SmbIdMap *sidmap;
94 	int state;
95 	uchar errclass;
96 	ushort error;
97 	int tzoff;		// as passed to client during negotiation
98 	SmbService *serv;
99 };
100 
101 typedef struct SmbHeader {
102 	uchar command;
103 	union {
104 		struct {
105 			uchar errclass;
106 			ushort error;
107 		};
108 		ulong status;
109 	};
110 	uchar flags;
111 	ushort flags2;
112 	union {
113 		struct {
114 			ushort pidhigh;
115 			uchar securitysignature[8];
116 		};
117 	};
118 	ushort tid;
119 	ushort pid;
120 	ushort uid;
121 	ushort mid;
122 	uchar wordcount;
123 } SmbHeader;
124 
125 typedef enum SmbProcessResult {
126 	SmbProcessResultOk,
127 	SmbProcessResultUnimp,
128 	SmbProcessResultFormat,
129 	SmbProcessResultMisc,
130 	SmbProcessResultError,
131 	SmbProcessResultReply,
132 	SmbProcessResultDie,
133 } SmbProcessResult;
134 
135 typedef SmbProcessResult SMBPROCESSFN(SmbSession *s, SmbHeader *h, uchar *pdata, SmbBuffer *);
136 typedef struct SmbOpTableEntry SmbOpTableEntry;
137 struct SmbOpTableEntry {
138 	char *name;
139 	SMBPROCESSFN *process;
140 	int debug;
141 };
142 
143 extern SmbOpTableEntry smboptable[256];
144 
145 typedef struct SmbGlobals SmbGlobals;
146 
147 extern SmbGlobals smbglobals;
148 
149 struct SmbServerInfo {
150 	char *name;
151 	char *nativelanman;
152 	uchar vmaj, vmin;
153 	ulong stype;
154 	char *remark;
155 };
156 
157 struct SmbGlobals {
158 	int maxreceive;
159 	int unicode;
160 	SmbServerInfo serverinfo;
161 	char *nativeos;
162 	char *primarydomain;
163 	NbName nbname;
164 	char *accountname;
165 	char *mailslotbrowse;
166 	char *pipelanman;
167 	int l2sectorsize;
168 	int l2allocationsize;
169 	int convertspace;
170 	struct {
171 		int fd;
172 		int print;
173 		int tids;
174 		int sids;
175 		int fids;
176 		int rap2;
177 		int find;
178 		int query;
179 		int sharedfiles;
180 		int sessions;
181 		int rep;
182 		int poolparanoia;
183 		int locks;
184 	} log;
185 };
186 
187 struct SmbTree {
188 	long id;
189 	SmbService *serv;
190 };
191 
192 struct SmbService {
193 	Ref;
194 	char *name;
195 	char *type;
196 	ushort stype;
197 	char *path;
198 	char *remark;
199 	SmbService *next;
200 };
201 
202 extern SmbService *smbservices;
203 
204 typedef struct SmbClient SmbClient;
205 
206 
207 typedef struct SmbTransactionMethod {
208 	int (*encodeprimary)(SmbTransaction *t, SmbHeader *h, SmbPeerInfo *p,
209 		SmbBuffer *ob, uchar *wordcount, ushort *bytecount, char **errmsgp);
210 	int (*encodesecondary)(SmbTransaction *t, SmbHeader *h, SmbBuffer *ob, char **errmsgp);
211 	int (*sendrequest)(void *magic, SmbBuffer *ob, char **errmsgp);
212 	int (*receiveintermediate)(void *magic, uchar *wordcountp, ushort *bytecountp, char **errmsgp);
213 	int (*receiveresponse)(void *magic, SmbBuffer *ib, char **errmsgp);
214 	int (*decoderesponse)(SmbTransaction *t, SmbHeader *h, uchar *pdata, SmbBuffer *b, char **errmsgp);
215 	int (*encoderesponse)(SmbTransaction *t, SmbHeader *h, SmbPeerInfo *p,
216 		SmbBuffer *ob, char **errmsgp);
217 	int (*sendresponse)(void *magic, SmbBuffer *ob, char **errmsgp);
218 } SmbTransactionMethod;
219 
220 extern SmbTransactionMethod smbtransactionmethoddgram;
221 
222 struct SmbSearch {
223 	long id;
224 	SmbTree *t;
225 	SmbDirCache *dc;
226 	Reprog *rep;
227 	ushort tid;
228 };
229 
230 struct SmbFile {
231 	long id;
232 	SmbTree *t;		// tree this belongs to
233 	int fd;
234 	char *name;
235 	int p9mode;		// how it was opened
236 	int share;			// additional sharing restictions added by this fid
237 	int ioallowed;
238 	SmbSharedFile *sf;
239 };
240 
241 struct SmbSharedFile {
242 	ushort type;
243 	ulong dev;
244 	vlong path;
245 //	char *name;
246 	int share;			// current share level
247 	int deleteonclose;
248 	SmbLockList *locklist;
249 };
250 
251 struct SmbLock {
252 	vlong base;
253 	vlong limit;
254 	SmbSession *s;		// owning session
255 	ushort pid;		// owning pid
256 };
257 
258 struct SmbCifsSession {
259 	int fd;
260 	void *magic;
261 };
262 
263 struct SmbClient {
264 	SmbPeerInfo peerinfo;
265 	NbSession *nbss;
266 	SmbBuffer *b;
267 	ushort ipctid;
268 	ushort sharetid;
269 	SmbHeader protoh;
270 };
271 
272 struct SmbRapServerInfo1 {
273 	char name[16];
274 	uchar vmaj;
275 	uchar vmin;
276 	ulong type;
277 	char *remark;
278 };
279 
280 struct SmbFindFileBothDirectoryInfo {
281 	ulong fileindex;
282 	vlong creationtime;
283 	vlong lastaccesstime;
284 	vlong lastwritetime;
285 	vlong changetime;
286 	vlong endoffile;
287 	vlong allocationsize;
288 	ulong extfileattributes;
289 	char *filename;
290 };
291 
292 enum {
293 	SMB_STRING_UNALIGNED = 1,
294 	SMB_STRING_UPCASE = 2,
295 	SMB_STRING_UNTERMINATED = 4,
296 	SMB_STRING_UNICODE = 8,
297 	SMB_STRING_ASCII = 16,
298 	SMB_STRING_REVPATH = 32,
299 	SMB_STRING_PATH = 64,
300 	SMB_STRING_CONVERT_MASK = SMB_STRING_PATH | SMB_STRING_REVPATH | SMB_STRING_UPCASE,
301 };
302 
303 struct SmbDirCache {
304 	Dir *buf;
305 	long n;
306 	long i;
307 };
308 
309 typedef struct SmbTrans2OpTableEntry SmbTrans2OpTableEntry;
310 typedef SmbProcessResult SMBTRANS2PROCESSFN(SmbSession *s, SmbHeader *h);
311 struct SmbTrans2OpTableEntry {
312 	char *name;
313 	SMBTRANS2PROCESSFN *process;
314 	int debug;
315 };
316 extern SmbTrans2OpTableEntry smbtrans2optable[];
317 extern int smbtrans2optablesize;
318 
319 struct SmbSlut {
320 	char *name;
321 	int val;
322 };
323 
324 extern SmbSlut smbopenmodeslut[];
325 extern SmbSlut smbsharemodeslut[];
326