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