0bba63413227496ea1698cebe0e330c2146a9797
[openafs.git] / src / WINNT / afsd / smb.h
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 #ifndef __SMB_H_ENV__
11 #define __SMB_H_ENV__ 1
12
13 #ifdef DJGPP
14 #include "netbios95.h"
15 #endif /* DJGPP */
16
17 /* basic core protocol SMB structure */
18 typedef struct smb {
19         unsigned char id[4];
20         unsigned char com;
21         unsigned char rcls;
22         unsigned char reh;
23         unsigned char errLow;
24         unsigned char errHigh;
25         unsigned char reb;
26         unsigned short flg2;
27         unsigned short res[6];
28         unsigned short tid;
29         unsigned short pid;
30         unsigned short uid;
31         unsigned short mid;
32         unsigned char wct;
33         unsigned char vdata[1];
34 } smb_t;
35
36 /* more defines */
37 #define SMB_NOPCODES            256     /* # of opcodes in the dispatch table */
38
39 /* threads per VC */
40 #define SMB_THREADSPERVC        4       /* threads per VC */
41
42 /* flags for functions */
43 #define SMB_FLAG_CREATE         1       /* create the structure if necessary */
44
45 /* max # of bytes we'll receive in an incoming SMB message */
46 #define SMB_PACKETSIZE  8400
47
48 /* a packet structure for receiving SMB messages; locked by smb_globalLock.
49  * Most of the work involved is in handling chained requests and responses.
50  *
51  * When handling input, inWctp points to the current request's wct field (and
52  * the other parameters and request data can be found from this field).  The
53  * opcode, unfortunately, isn't available there, so is instead copied to the
54  * packet's inCom field.  It is initially set to com, but each chained
55  * operation sets it, also.
56  * The function smb_AdvanceInput advances an input packet to the next request
57  * in the chain.  The inCom field is set to 0xFF when there are no more
58  * requests.  The inCount field is 0 if this is the first request, and
59  * otherwise counts which request it is.
60  *
61  * When handling output, we also have to chain all of the responses together.
62  * The function smb_GetResponsePacket will setup outWctp to point to the right
63  * place.
64  */
65 #define SMB_PACKETMAGIC 0x7436353       /* magic # for packets */
66 typedef struct smb_packet {
67         char data[SMB_PACKETSIZE];
68         struct smb_packet *nextp;       /* in free list, or whatever */
69         long magic;
70         cm_space_t *spacep;             /* use this for stripping last component */
71         NCB *ncbp;                      /* use this for sending */
72         struct smb_vc *vcp;
73         unsigned long resumeCode;
74         unsigned short inCount;
75         unsigned short fid;             /* for calls bundled with openAndX */
76         unsigned char *wctp;
77         unsigned char inCom;
78         unsigned char oddByte;
79         unsigned short ncb_length;
80         unsigned char flags;
81 #ifdef DJGPP
82         dos_ptr dos_pkt;
83         unsigned int dos_pkt_sel;
84 #endif /* DJGPP */
85 } smb_packet_t;
86
87 /* smb_packet flags */
88 #define SMB_PACKETFLAG_PROFILE_UPDATE_OK        1
89 #define SMB_PACKETFLAG_NOSEND                   2
90 #define SMB_PACKETFLAG_SUSPENDED                4
91
92 /* a structure for making Netbios calls; locked by smb_globalLock */
93 #define SMB_NCBMAGIC    0x2334344
94 typedef struct myncb {
95         NCB ncb;                        /* ncb to use */
96         struct myncb *nextp;            /* when on free list */
97         long magic;
98 #ifdef DJGPP
99         dos_ptr dos_ncb;
100         smb_packet_t *orig_pkt;
101         unsigned int dos_ncb_sel;
102 #endif /* DJGPP */
103 } smb_ncb_t;
104
105 /* structures representing environments from kernel / SMB network.
106  * Most have their own locks, but the tree connection fields and
107  * reference counts are locked by the smb_rctLock.  Those fields will
108  * be marked in comments.
109  */
110
111 /* one per virtual circuit */
112 typedef struct smb_vc {
113         struct smb_vc *nextp;           /* not used */
114         int refCount;                   /* the reference count */
115         long flags;                     /* the flags, if any; locked by mx */
116         osi_mutex_t mx;                 /* the mutex */
117         long vcID;                      /* VC id */
118         unsigned short lsn;             /* the NCB LSN associated with this */
119         unsigned short uidCounter;      /* session ID counter */
120         unsigned short tidCounter;      /* tree ID counter */
121         unsigned short fidCounter;      /* file handle ID counter */
122         struct smb_tid *tidsp;          /* the first child in the tid list */
123         struct smb_user *usersp;        /* the first child in the user session list */
124         struct smb_fid *fidsp;          /* the first child in the open file list */
125         struct smb_user *justLoggedOut; /* ready for profile upload? */
126         unsigned long logoffTime;       /* tick count when logged off */
127         struct cm_user *logonDLLUser;   /* integrated logon user */
128         unsigned char errorCount;
129 } smb_vc_t;
130
131                                         /* have we negotiated ... */
132 #define SMB_VCFLAG_USEV3        1       /* ... version 3 of the protocol */
133 #define SMB_VCFLAG_USECORE      2       /* ... the core protocol */
134 #define SMB_VCFLAG_USENT        4       /* ... NT LM 0.12 or beyond */
135 #define SMB_VCFLAG_STATUS32     8       /* use 32-bit NT status codes */
136 #define SMB_VCFLAG_REMOTECONN   0x10    /* bad: remote conns not allowed */
137 #define SMB_VCFLAG_ALREADYDEAD  0x20    /* do not get tokens from this vc */
138
139 /* one per user session */
140 typedef struct smb_user {
141         struct smb_user *nextp;         /* next sibling */
142         long refCount;                  /* ref count */
143         long flags;                     /* flags; locked by mx */
144         osi_mutex_t mx;
145         long userID;                    /* the session identifier */
146         struct smb_vc *vcp;             /* back ptr to virtual circuit */
147         struct cm_user *userp;          /* CM user structure */
148         char *name;                     /* user name */
149 } smb_user_t;
150
151 #define SMB_USERFLAG_DELETE     1       /* delete struct when ref count zero */
152
153 /* one per tree-connect */
154 typedef struct smb_tid {
155         struct smb_tid *nextp;          /* next sibling */
156         long refCount;
157         long flags;
158         osi_mutex_t mx;                 /* for non-tree-related stuff */
159         unsigned short tid;             /* the tid */
160         struct smb_vc *vcp;             /* back ptr */
161         struct cm_user *userp;          /* user logged in at the
162                                          * tree connect level (base) */
163         char *pathname;                 /* pathname derived from sharename */
164 } smb_tid_t;
165
166 #define SMB_TIDFLAG_DELETE      1       /* delete struct when ref count zero */
167
168 /* one per process ID */
169 typedef struct smb_pid {
170         struct smb_pid *nextp;          /* next sibling */
171         long refCount;
172         long flags;
173         osi_mutex_t mx;                 /* for non-tree-related stuff */
174         unsigned short pid;             /* the pid */
175         struct smb_tid *tidp;           /* back ptr */
176 } smb_pid_t;
177
178 /* ioctl parameter, while being assembled and/or processed */
179 typedef struct smb_ioctl {
180         /* input side */
181         char *inDatap;                  /* ioctl func's current position
182                                          * in input parameter block */
183         char *inAllocp;                 /* allocated input parameter block */
184         long inCopied;                  /* # of input bytes copied in so far
185                                          * by write calls */
186         cm_space_t *prefix;             /* prefix for subst drives */
187         char *tidPathp;                 /* Pathname associated with Tree ID */
188
189         /* output side */
190         char *outDatap;                 /* output results assembled so far */
191         char *outAllocp;                /* output results assembled so far */
192         long outCopied;                 /* # of output bytes copied back so far
193                                          * by read calls */
194         
195         /* flags */
196         long flags;
197 } smb_ioctl_t;
198
199 /* flags for smb_ioctl_t */
200 #define SMB_IOCTLFLAG_DATAIN    1       /* reading data from client to server */
201 #define SMB_IOCTLFLAG_LOGON     2       /* got tokens from integrated logon */
202
203 /* one per file ID; these are really file descriptors */
204 typedef struct smb_fid {
205         osi_queue_t q;
206         long refCount;
207         long flags;
208         osi_mutex_t mx;                 /* for non-tree-related stuff */
209         unsigned short fid;             /* the file ID */
210         struct smb_vc *vcp;             /* back ptr */
211         struct cm_scache *scp;          /* scache of open file */
212         long offset;                    /* our file pointer */
213         smb_ioctl_t *ioctlp;            /* ptr to ioctl structure */
214                                         /* Under NT, we may need to know the
215                                          * parent directory and pathname used
216                                          * to open the file, either to delete
217                                          * the file on close, or to do a
218                                          * change notification */
219         struct cm_scache *NTopen_dscp;  /* parent directory (NT) */
220         char *NTopen_pathp;             /* path used in open (NT) */
221         char *NTopen_wholepathp;        /* entire path, not just last name */
222         int curr_chunk;                 /* chunk being read */
223         int prev_chunk;                 /* previous chunk read */
224         int raw_writers;                /* pending async raw writes */
225         EVENT_HANDLE raw_write_event;   /* signal this when raw_writers zero */
226 } smb_fid_t;
227
228 #define SMB_FID_OPENREAD                1       /* open for reading */
229 #define SMB_FID_OPENWRITE               2       /* open for writing */
230 #define SMB_FID_DELETE                  4       /* delete struct on ref count 0 */
231 #define SMB_FID_IOCTL                   8       /* a file descriptor for the
232                                                  * magic ioctl file */
233 #define SMB_FID_OPENDELETE              0x10    /* open for deletion (NT) */
234 #define SMB_FID_DELONCLOSE              0x20    /* marked for deletion */
235 /*
236  * Now some special flags to work around a bug in NT Client
237  */
238 #define SMB_FID_LENGTHSETDONE           0x40    /* have done 0-length write */
239 #define SMB_FID_MTIMESETDONE            0x80    /* have set modtime via Tr2 */
240 #define SMB_FID_LOOKSLIKECOPY   (SMB_FID_LENGTHSETDONE | SMB_FID_MTIMESETDONE)
241 #define SMB_FID_NTOPEN                  0x100   /* have dscp and pathp */
242
243 /* for tracking in-progress directory searches */
244 typedef struct smb_dirSearch {
245         osi_queue_t q;                  /* queue of all outstanding cookies */
246         osi_mutex_t mx;                 /* just in case the caller screws up */
247         int refCount;                   /* reference count */
248         long cookie;                    /* value returned to the caller */
249         struct cm_scache *scp;          /* vnode of the dir we're searching */
250         long lastTime;                  /* last time we used this */
251         long flags;                     /* flags (see below);
252                                          * locked by smb_globalLock */
253         unsigned short attribute;       /* search attribute
254                                          * (used for extended protocol) */
255         char mask[256];                 /* search mask for V3 */
256 } smb_dirSearch_t;
257
258 #define SMB_DIRSEARCH_DELETE    1       /* delete struct when ref count zero */
259 #define SMB_DIRSEARCH_HITEOF    2       /* perhaps useful for advisory later */
260 #define SMB_DIRSEARCH_SMALLID   4       /* cookie can only be 8 bits, not 16 */
261 #define SMB_DIRSEARCH_BULKST    8       /* get bulk stat info */
262
263 /* type for patching directory listings */
264 typedef struct smb_dirListPatch {
265         osi_queue_t q;
266         char *dptr;             /* ptr to attr, time, data, sizel, sizeh */
267         cm_fid_t fid;
268 } smb_dirListPatch_t;
269
270 /* waiting lock list elements */
271 typedef struct smb_waitingLock {
272         osi_queue_t q;
273         smb_vc_t *vcp;
274         smb_packet_t *inp;
275         smb_packet_t *outp;
276         u_long timeRemaining;
277         void *lockp;
278 } smb_waitingLock_t;
279
280 smb_waitingLock_t *smb_allWaitingLocks;
281
282 typedef long (smb_proc_t)(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp);
283
284 typedef struct smb_dispatch {
285         smb_proc_t *procp;      /* proc to call */
286         int flags;              /* flags describing function */
287 } smb_dispatch_t;
288
289 #define SMB_DISPATCHFLAG_CHAINED        1       /* this is an _AND_X function */
290 #define SMB_DISPATCHFLAG_NORESPONSE     2       /* don't send the response
291                                                  * packet, typically because
292                                                  * the response was already
293                                                  * sent.
294                                                  */
295 #define SMB_MAX_PATH                    256     /* max path length */
296
297 /* prototypes */
298
299 extern void smb_Init(osi_log_t *logp, char *smbNamep, int useV3, int LANadapt,
300         int nThreads
301 #ifndef DJGPP
302         , void *aMBfunc
303 #endif
304   );
305
306 extern void smb_LargeSearchTimeFromUnixTime(FILETIME *largeTimep, long unixTime);
307
308 extern void smb_UnixTimeFromLargeSearchTime(long *unixTimep, FILETIME *largeTimep);
309
310 extern void smb_SearchTimeFromUnixTime(long *dosTimep, long unixTime);
311
312 extern void smb_UnixTimeFromSearchTime(long *unixTimep, long searchTime);
313
314 extern void smb_DosUTimeFromUnixTime(long *dosUTimep, long unixTime);
315
316 extern void smb_UnixTimeFromDosUTime(long *unixTimep, long dosUTime);
317
318 extern smb_vc_t *smb_FindVC(unsigned short lsn, int flags);
319
320 extern void smb_ReleaseVC(smb_vc_t *vcp);
321
322 extern smb_tid_t *smb_FindTID(smb_vc_t *vcp, unsigned short tid, int flags);
323
324 extern void smb_ReleaseTID(smb_tid_t *tidp);
325
326 extern smb_user_t *smb_FindUID(smb_vc_t *vcp, unsigned short uid, int flags);
327
328 extern void smb_ReleaseUID(smb_user_t *uidp);
329
330 extern cm_user_t *smb_GetUser(smb_vc_t *vcp, smb_packet_t *inp);
331
332 extern char *smb_GetTIDPath(smb_vc_t *vcp, unsigned short tid);
333
334 extern smb_fid_t *smb_FindFID(smb_vc_t *vcp, unsigned short fid, int flags);
335
336 extern void smb_ReleaseFID(smb_fid_t *fidp);
337
338 extern int smb_FindShare(smb_vc_t *vcp, smb_packet_t *inp, char *shareName, char **pathNamep);
339
340 extern smb_dirSearch_t *smb_FindDirSearchNL(long cookie);
341
342 extern void smb_DeleteDirSearch(smb_dirSearch_t *dsp);
343
344 extern void smb_ReleaseDirSearch(smb_dirSearch_t *dsp);
345
346 extern smb_dirSearch_t *smb_FindDirSearch(long cookie);
347
348 extern smb_dirSearch_t *smb_NewDirSearch(int isV3);
349
350 extern smb_packet_t *smb_CopyPacket(smb_packet_t *packetp);
351
352 extern void smb_FreePacket(smb_packet_t *packetp);
353
354 extern unsigned char *smb_GetSMBData(smb_packet_t *smbp, int *nbytesp);
355
356 extern void smb_SetSMBDataLength(smb_packet_t *smbp, unsigned int dsize);
357
358 extern unsigned int smb_GetSMBParm(smb_packet_t *smbp, int parm);
359
360 extern unsigned int smb_GetSMBOffsetParm(smb_packet_t *smbp, int parm, int offset);
361
362 extern void smb_SetSMBParm(smb_packet_t *smbp, int slot, unsigned int parmValue);
363
364 extern void smb_SetSMBParmLong(smb_packet_t *smbp, int slot, unsigned int parmValue);
365
366 extern void smb_SetSMBParmDouble(smb_packet_t *smbp, int slot, char *parmValuep);
367
368 extern void smb_SetSMBParmByte(smb_packet_t *smbp, int slot, unsigned int parmValue);
369
370 extern void smb_StripLastComponent(char *outPathp, char **lastComponentp,
371         char *inPathp);
372
373 extern unsigned char *smb_ParseASCIIBlock(unsigned char *inp, char **chainpp);
374
375 extern unsigned char *smb_ParseVblBlock(unsigned char *inp, char **chainpp,
376         int *lengthp);
377
378 extern smb_packet_t *smb_GetResponsePacket(smb_vc_t *vcp, smb_packet_t *inp);
379
380 extern void smb_SendPacket(smb_vc_t *vcp, smb_packet_t *inp);
381
382 extern void smb_MapCoreError(long code, smb_vc_t *vcp, unsigned short *scodep,
383         unsigned char *classp);
384
385 extern void smb_MapNTError(long code, unsigned long *NTStatusp);
386
387 extern void smb_HoldVC(smb_vc_t *vcp);
388
389 /* some globals, too */
390 extern int loggedOut;
391 extern unsigned long loggedOutTime;
392 extern char *loggedOutName;
393 extern smb_user_t *loggedOutUserp;
394
395 extern osi_log_t *smb_logp;
396
397 extern osi_rwlock_t smb_globalLock;
398
399 extern osi_rwlock_t smb_rctLock;
400
401 extern int smb_LogoffTokenTransfer;
402 extern unsigned long smb_LogoffTransferTimeout;
403
404 extern void smb_FormatResponsePacket(smb_vc_t *vcp, smb_packet_t *inp,
405         smb_packet_t *op);
406
407 extern unsigned int smb_Attributes(cm_scache_t *scp);
408
409 extern int smb_ChainFID(int fid, smb_packet_t *inp);
410
411 extern smb_fid_t *smb_FindFID(smb_vc_t *vcp, unsigned short fid, int flags);
412
413 extern void smb_ReleaseFID(smb_fid_t *fidp);
414
415 extern unsigned char *smb_ParseDataBlock(unsigned char *inp, char **chainpp, int *lengthp);
416
417 extern unsigned char *smb_ParseASCIIBlock(unsigned char *inp, char **chainpp);
418
419 extern unsigned char *smb_ParseVblBlock(unsigned char *inp, char **chainpp, int *lengthp);
420
421 extern int smb_SUser(cm_user_t *userp);
422
423 #ifndef DJGPP
424 extern long smb_ReadData(smb_fid_t *fidp, osi_hyper_t *offsetp, long count,
425         char *op, cm_user_t *userp, long *readp);
426 #else /* DJGPP */
427 extern long smb_ReadData(smb_fid_t *fidp, osi_hyper_t *offsetp, long count,
428         char *op, cm_user_t *userp, long *readp, int dosflag);
429 #endif /* !DJGPP */
430
431 extern BOOL smb_IsLegalFilename(char *filename);
432
433 /* include other include files */
434 #include "smb3.h"
435 #include "smb_ioctl.h"
436 #include "smb_iocons.h"
437
438 #endif /* whole file */