smb.h: Supporting defines for NT trans calls.
[samba.git] / source3 / include / smb.h
1 /* 
2    Unix SMB/Netbios implementation.
3    Version 1.9.
4    SMB parameters and setup
5    Copyright (C) Andrew Tridgell 1992-1998
6    Copyright (C) John H Terpstra 1996-1998
7    Copyright (C) Luke Kenneth Casson Leighton 1996-1998
8    Copyright (C) Paul Ashton 1998
9    
10    This program is free software; you can redistribute it and/or modify
11    it under the terms of the GNU General Public License as published by
12    the Free Software Foundation; either version 2 of the License, or
13    (at your option) any later version.
14    
15    This program is distributed in the hope that it will be useful,
16    but WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18    GNU General Public License for more details.
19    
20    You should have received a copy of the GNU General Public License
21    along with this program; if not, write to the Free Software
22    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 */
24 #ifndef _SMB_H
25 #define _SMB_H
26
27 #define BUFFER_SIZE (0xFFFF)
28 #define SAFETY_MARGIN 1024
29
30 #define NMB_PORT 137
31 #define DGRAM_PORT 138
32 #define SMB_PORT 139
33
34 #define False (0)
35 #define True (1)
36 #define BOOLSTR(b) ((b) ? "Yes" : "No")
37 #define BITSETB(ptr,bit) ((((char *)ptr)[0] & (1<<(bit)))!=0)
38 #define BITSETW(ptr,bit) ((SVAL(ptr,0) & (1<<(bit)))!=0)
39
40 #define IS_BITS_SET_ALL(var,bit) (((var)&(bit))==(bit))
41 #define IS_BITS_SET_SOME(var,bit) (((var)&(bit))!=0)
42 #define IS_BITS_CLR_ALL(var,bit) (((var)&(~(bit)))==0)
43
44 #define PTR_DIFF(p1,p2) ((ptrdiff_t)(((char *)(p1)) - (char *)(p2)))
45
46 typedef int BOOL;
47
48 /* limiting size of ipc replies */
49 #define REALLOC(ptr,size) Realloc(ptr,MAX((size),4*1024))
50
51 /*
52    Samba needs type definitions for int16, int32, uint16 and uint32.
53    
54    Normally these are signed and unsigned 16 and 32 bit integers, but
55    they actually only need to be at least 16 and 32 bits
56    respectively. Thus if your word size is 8 bytes just defining them
57    as signed and unsigned int will work.
58 */
59
60 /* afs/stds.h defines int16 and int32 */
61 #ifndef AFS_AUTH
62 typedef short int16;
63 typedef int int32;
64 #endif
65
66 #ifndef uint8
67 typedef unsigned char uint8;
68 #endif
69
70 #ifndef uint16
71 typedef unsigned short uint16;
72 #endif
73
74 #ifndef uint32
75 typedef unsigned int uint32;
76 #endif
77
78 #ifndef uchar
79 #define uchar unsigned char
80 #endif
81 #ifndef int16
82 #define int16 short
83 #endif
84 #ifndef uint16
85 #define uint16 unsigned short
86 #endif
87 #ifndef uint32
88 #define uint32 unsigned int
89 #endif
90
91 #define SIZEOFWORD 2
92
93 #ifndef DEF_CREATE_MASK
94 #define DEF_CREATE_MASK (0755)
95 #endif
96
97 /* how long to wait for secondary SMB packets (milli-seconds) */
98 #define SMB_SECONDARY_WAIT (60*1000)
99
100 /* debugging code */
101 #ifndef SYSLOG
102 #define DEBUG(level,body) ((DEBUGLEVEL>=(level))?(Debug1 body):0)
103 #else
104 extern int syslog_level;
105
106 #define DEBUG(level,body) ((DEBUGLEVEL>=(level))? (syslog_level = (level), Debug1 body):0)
107 #endif
108
109 /* this defines the error codes that receive_smb can put in smb_read_error */
110 #define READ_TIMEOUT 1
111 #define READ_EOF 2
112 #define READ_ERROR 3
113
114
115 #define DIR_STRUCT_SIZE 43
116
117 /* these define all the command types recognised by the server - there
118 are lots of gaps so probably there are some rare commands that are not
119 implemented */
120
121 #define pSETDIR '\377'
122
123 /* these define the attribute byte as seen by DOS */
124 #define aRONLY (1L<<0)
125 #define aHIDDEN (1L<<1)
126 #define aSYSTEM (1L<<2)
127 #define aVOLID (1L<<3)
128 #define aDIR (1L<<4)
129 #define aARCH (1L<<5)
130
131 /* deny modes */
132 #define DENY_DOS 0
133 #define DENY_ALL 1
134 #define DENY_WRITE 2
135 #define DENY_READ 3
136 #define DENY_NONE 4
137 #define DENY_FCB 7
138
139 /* share types */
140 #define STYPE_DISKTREE  0       /* Disk drive */
141 #define STYPE_PRINTQ    1       /* Spooler queue */
142 #define STYPE_DEVICE    2       /* Serial device */
143 #define STYPE_IPC       3       /* Interprocess communication (IPC) */
144 #define STYPE_HIDDEN    0x80000000 /* share is a hidden one (ends with $) */
145
146 /* SMB X/Open error codes for the ERRdos error class */
147 #define ERRbadfunc 1 /* Invalid function (or system call) */
148 #define ERRbadfile 2 /* File not found (pathname error) */
149 #define ERRbadpath 3 /* Directory not found */
150 #define ERRnofids 4 /* Too many open files */
151 #define ERRnoaccess 5 /* Access denied */
152 #define ERRbadfid 6 /* Invalid fid */
153 #define ERRnomem 8 /* Out of memory */
154 #define ERRbadmem 9 /* Invalid memory block address */
155 #define ERRbadenv 10 /* Invalid environment */
156 #define ERRbadaccess 12 /* Invalid open mode */
157 #define ERRbaddata 13 /* Invalid data (only from ioctl call) */
158 #define ERRres 14 /* reserved */
159 #define ERRbaddrive 15 /* Invalid drive */
160 #define ERRremcd 16 /* Attempt to delete current directory */
161 #define ERRdiffdevice 17 /* rename/move across different filesystems */
162 #define ERRnofiles 18 /* no more files found in file search */
163 #define ERRbadshare 32 /* Share mode on file conflict with open mode */
164 #define ERRlock 33 /* Lock request conflicts with existing lock */
165 #define ERRfilexists 80 /* File in operation already exists */
166 #define ERRcannotopen 110 /* Cannot open the file specified */
167 #define ERRunknownlevel 124
168 #define ERRbadpipe 230 /* Named pipe invalid */
169 #define ERRpipebusy 231 /* All instances of pipe are busy */
170 #define ERRpipeclosing 232 /* named pipe close in progress */
171 #define ERRnotconnected 233 /* No process on other end of named pipe */
172 #define ERRmoredata 234 /* More data to be returned */
173 #define ERRbaddirectory 267 /* Invalid directory name in a path. */
174 #define ERROR_EAS_DIDNT_FIT 275 /* Extended attributes didn't fit */
175 #define ERROR_EAS_NOT_SUPPORTED 282 /* Extended attributes not supported */
176 #define ERRunknownipc 2142
177
178
179 /* here's a special one from observing NT */
180 #define ERRnoipc 66 /* don't support ipc */
181
182 /* Error codes for the ERRSRV class */
183
184 #define ERRerror 1 /* Non specific error code */
185 #define ERRbadpw 2 /* Bad password */
186 #define ERRbadtype 3 /* reserved */
187 #define ERRaccess 4 /* No permissions to do the requested operation */
188 #define ERRinvnid 5 /* tid invalid */
189 #define ERRinvnetname 6 /* Invalid servername */
190 #define ERRinvdevice 7 /* Invalid device */
191 #define ERRqfull 49 /* Print queue full */
192 #define ERRqtoobig 50 /* Queued item too big */
193 #define ERRinvpfid 52 /* Invalid print file in smb_fid */
194 #define ERRsmbcmd 64 /* Unrecognised command */
195 #define ERRsrverror 65 /* smb server internal error */
196 #define ERRfilespecs 67 /* fid and pathname invalid combination */
197 #define ERRbadlink 68 /* reserved */
198 #define ERRbadpermits 69 /* Access specified for a file is not valid */
199 #define ERRbadpid 70 /* reserved */
200 #define ERRsetattrmode 71 /* attribute mode invalid */
201 #define ERRpaused 81 /* Message server paused */
202 #define ERRmsgoff 82 /* Not receiving messages */
203 #define ERRnoroom 83 /* No room for message */
204 #define ERRrmuns 87 /* too many remote usernames */
205 #define ERRtimeout 88 /* operation timed out */
206 #define ERRnoresource  89 /* No resources currently available for request. */
207 #define ERRtoomanyuids 90 /* too many userids */
208 #define ERRbaduid 91 /* bad userid */
209 #define ERRuseMPX 250 /* temporarily unable to use raw mode, use MPX mode */
210 #define ERRuseSTD 251 /* temporarily unable to use raw mode, use standard mode */
211 #define ERRcontMPX 252 /* resume MPX mode */
212 #define ERRbadPW /* reserved */
213 #define ERRnosupport 0xFFFF
214 #define ERRunknownsmb 22 /* from NT 3.5 response */
215
216
217 /* Error codes for the ERRHRD class */
218
219 #define ERRnowrite 19 /* read only media */
220 #define ERRbadunit 20 /* Unknown device */
221 #define ERRnotready 21 /* Drive not ready */
222 #define ERRbadcmd 22 /* Unknown command */
223 #define ERRdata 23 /* Data (CRC) error */
224 #define ERRbadreq 24 /* Bad request structure length */
225 #define ERRseek 25
226 #define ERRbadmedia 26
227 #define ERRbadsector 27
228 #define ERRnopaper 28
229 #define ERRwrite 29 /* write fault */
230 #define ERRread 30 /* read fault */
231 #define ERRgeneral 31 /* General hardware failure */
232 #define ERRwrongdisk 34
233 #define ERRFCBunavail 35
234 #define ERRsharebufexc 36 /* share buffer exceeded */
235 #define ERRdiskfull 39
236
237
238 typedef char pstring[1024];
239 typedef char fstring[128];
240 typedef fstring string;
241
242
243 /* pipe strings */
244 #define PIPE_LANMAN   "\\PIPE\\LANMAN"
245 #define PIPE_SRVSVC   "\\PIPE\\srvsvc"
246 #define PIPE_SAMR     "\\PIPE\\samr"
247 #define PIPE_WKSSVC   "\\PIPE\\wkssvc"
248 #define PIPE_NETLOGON "\\PIPE\\NETLOGON"
249 #define PIPE_NTLSA    "\\PIPE\\ntlsa"
250 #define PIPE_NTSVCS   "\\PIPE\\ntsvcs"
251 #define PIPE_LSASS    "\\PIPE\\lsass"
252 #define PIPE_LSARPC   "\\PIPE\\lsarpc"
253
254 /* 64 bit time (100usec) since ????? - cifs6.txt, section 3.5, page 30 */
255 typedef struct nttime_info
256 {
257   uint32 low;
258   uint32 high;
259
260 } NTTIME;
261
262 /* Allowable account control bits */
263 #define ACB_DISABLED   0x0001  /* 1 = User account disabled */
264 #define ACB_HOMDIRREQ  0x0002  /* 1 = Home directory required */
265 #define ACB_PWNOTREQ   0x0004  /* 1 = User password not required */
266 #define ACB_TEMPDUP    0x0008  /* 1 = Temporary duplicate account */
267 #define ACB_NORMAL     0x0010  /* 1 = Normal user account */
268 #define ACB_MNS        0x0020  /* 1 = MNS logon user account */
269 #define ACB_DOMTRUST   0x0040  /* 1 = Interdomain trust account */
270 #define ACB_WSTRUST    0x0080  /* 1 = Workstation trust account */
271 #define ACB_SVRTRUST   0x0100  /* 1 = Server trust account */
272 #define ACB_PWNOEXP    0x0200  /* 1 = User password does not expire */
273 #define ACB_AUTOLOCK   0x0400  /* 1 = Account auto locked */
274  
275 struct smb_passwd
276 {
277   int smb_userid;
278   char *smb_name;
279   unsigned char *smb_passwd; /* Null if no password */
280   unsigned char *smb_nt_passwd; /* Null if no password */
281   /* Other fields / flags may be added later */
282   uint16 acct_ctrl;
283   time_t last_change_time;
284 };
285
286 /* DOM_CHAL - challenge info */
287 typedef struct chal_info
288 {
289   uchar data[8]; /* credentials */
290 } DOM_CHAL;
291
292 /* 32 bit time (sec) since 01jan1970 - cifs6.txt, section 3.5, page 30 */
293 typedef struct time_info
294 {
295   uint32 time;
296
297 } UTIME;
298
299 /* DOM_CREDs - timestamped client or server credentials */
300 typedef struct cred_info
301 {  
302   DOM_CHAL challenge; /* credentials */
303   UTIME timestamp;    /* credential time-stamp */
304
305 } DOM_CRED;
306
307 struct cli_state {
308   int fd;
309   int cnum;
310   int pid;
311   int mid;
312   int uid;
313   int protocol;
314   int sec_mode;
315   int rap_error;
316   int privilages;
317   fstring eff_name;
318   fstring desthost;
319   char cryptkey[8];
320   uint32 sesskey;
321   int serverzone;
322   uint32 servertime;
323   int readbraw_supported;
324   int writebraw_supported;
325   int timeout;
326   int max_xmit;
327   char *outbuf;
328   char *inbuf;
329   int bufsize;
330   int initialised;
331   /*
332    * Only used in NT domain calls.
333    */
334   uint32 nt_error;                   /* NT RPC error code. */
335   uint16 nt_pipe_fnum;               /* Pipe handle. */
336   unsigned char sess_key[16];        /* Current session key. */
337   DOM_CRED clnt_cred;                /* Client credential. */
338   fstring mach_acct;                 /* MYNAME$. */
339   fstring srv_name_slash;            /* \\remote server. */
340   fstring clnt_name_slash;            /* \\local client. */
341 };
342
343
344 struct current_user
345 {
346   int cnum, vuid;
347   int uid, gid;
348   int ngroups;
349   gid_t *groups;
350   int *igroups;
351   int *attrs;
352 };
353
354 typedef struct
355 {
356   int size;
357   int mode;
358   int uid;
359   int gid;
360   /* these times are normally kept in GMT */
361   time_t mtime;
362   time_t atime;
363   time_t ctime;
364   pstring name;
365
366 } file_info;
367
368
369 /* Structure used when SMBwritebmpx is active */
370 typedef struct
371         {
372         int   wr_total_written; /* So we know when to discard this */
373         int32 wr_timeout;
374         int32 wr_errclass;
375         int32 wr_error; /* Cached errors */
376         BOOL  wr_mode; /* write through mode) */
377         BOOL  wr_discard; /* discard all further data */
378         } write_bmpx_struct;
379
380 /*
381  * Structure used to indirect fd's from the files_struct.
382  * Needed as POSIX locking is based on file and process, not
383  * file descriptor and process.
384  */
385
386 typedef struct
387 {
388   uint16 ref_count;
389   uint32 dev;
390   uint32 inode;
391   int fd;
392   int fd_readonly;
393   int fd_writeonly;
394   int real_open_flags;
395 } file_fd_struct;
396
397 typedef struct
398 {
399   int cnum;
400   file_fd_struct *fd_ptr;
401   int pos;
402   uint32 size;
403   int mode;
404   int vuid;
405   char *mmap_ptr;
406   uint32 mmap_size;
407   write_bmpx_struct *wbmpx_ptr;
408   struct timeval open_time;
409   BOOL open;
410   BOOL can_lock;
411   BOOL can_read;
412   BOOL can_write;
413   BOOL share_mode;
414   BOOL print_file;
415   BOOL modified;
416   BOOL granted_oplock;
417   BOOL sent_oplock_break;
418   BOOL reserved;
419   char *name;
420 } files_struct;
421
422
423 struct uid_cache {
424   int entries;
425   int list[UID_CACHE_SIZE];
426 };
427
428 typedef struct
429 {
430   char *name;
431   BOOL is_wild;
432 } name_compare_entry;
433
434 typedef struct
435 {
436   int service;
437   BOOL force_user;
438   struct uid_cache uid_cache;
439   void *dirptr;
440   BOOL open;
441   BOOL printer;
442   BOOL ipc;
443   BOOL read_only;
444   BOOL admin_user;
445   char *dirpath;
446   char *connectpath;
447   char *origpath;
448   char *user; /* name of user who *opened* this connection */
449   int uid; /* uid of user who *opened* this connection */
450   int gid; /* gid of user who *opened* this connection */
451
452   uint16 vuid; /* vuid of user who *opened* this connection, or UID_FIELD_INVALID */
453
454   /* following groups stuff added by ih */
455
456   /* This groups info is valid for the user that *opened* the connection */
457   int ngroups;
458   gid_t *groups;
459   int *igroups; /* an integer version - some OSes are broken :-( */
460   int *attrs;
461
462   time_t lastused;
463   BOOL used;
464   int num_files_open;
465   name_compare_entry *hide_list; /* Per-share list of files to return as hidden. */
466   name_compare_entry *veto_list; /* Per-share list of files to veto (never show). */
467   name_compare_entry *veto_oplock_list; /* Per-share list of files to refuse oplocks on. */
468
469 } connection_struct;
470
471 /* Domain controller authentication protocol info */
472 struct dcinfo
473 {
474   DOM_CHAL clnt_chal; /* Initial challenge received from client */
475   DOM_CHAL srv_chal;  /* Initial server challenge */
476   DOM_CRED clnt_cred; /* Last client credential */
477   DOM_CRED srv_cred;  /* Last server credential */
478
479   uchar  sess_key[8]; /* Session key */
480   uchar  md4pw[16];   /* md4(machine password) */
481 };
482
483 typedef struct
484 {
485   int uid; /* uid of a validated user */
486   int gid; /* gid of a validated user */
487
488   fstring requested_name; /* user name from the client */
489   fstring name; /* unix user name of a validated user */
490   fstring real_name;   /* to store real name from password file - simeon */
491   BOOL guest;
492
493   /* following groups stuff added by ih */
494   /* This groups info is needed for when we become_user() for this uid */
495   int n_groups;
496   gid_t *groups;
497   int *igroups; /* an integer version - some OSes are broken :-( */
498   int *attrs; /* attributes associated with each gid */
499
500   int n_sids;
501   int *sids;
502
503   /* per-user authentication information on NT RPCs */
504   struct dcinfo dc;
505
506 } user_struct;
507
508
509 enum {LPQ_QUEUED,LPQ_PAUSED,LPQ_SPOOLING,LPQ_PRINTING};
510
511 typedef struct
512 {
513   int job;
514   int size;
515   int status;
516   int priority;
517   time_t time;
518   char user[30];
519   char file[100];
520 } print_queue_struct;
521
522 enum {LPSTAT_OK, LPSTAT_STOPPED, LPSTAT_ERROR};
523
524 typedef struct
525 {
526   fstring message;
527   int status;
528 }  print_status_struct;
529
530 /* used for server information: client, nameserv and ipc */
531 struct server_info_struct
532 {
533   fstring name;
534   uint32 type;
535   fstring comment;
536   fstring domain; /* used ONLY in ipc.c NOT namework.c */
537   BOOL server_added; /* used ONLY in ipc.c NOT namework.c */
538 };
539
540
541 /* used for network interfaces */
542 struct interface
543 {
544         struct interface *next;
545         struct in_addr ip;
546         struct in_addr bcast;
547         struct in_addr nmask;
548 };
549
550 /* struct returned by get_share_modes */
551 typedef struct
552 {
553   int pid;
554   uint16 op_port;
555   uint16 op_type;
556   int share_mode;
557   struct timeval time;
558 } share_mode_entry;
559
560
561 /* each implementation of the share mode code needs
562    to support the following operations */
563 struct share_ops {
564         BOOL (*stop_mgmt)(void);
565         BOOL (*lock_entry)(int , uint32 , uint32 , int *);
566         BOOL (*unlock_entry)(int , uint32 , uint32 , int );
567         int (*get_entries)(int , int , uint32 , uint32 , share_mode_entry **);
568         void (*del_entry)(int , int );
569         BOOL (*set_entry)(int , int , uint16 , uint16 );
570         BOOL (*remove_oplock)(int , int);
571         int (*forall)(void (*)(share_mode_entry *, char *));
572         void (*status)(FILE *);
573 };
574
575 /* each implementation of the shared memory code needs
576    to support the following operations */
577 struct shmem_ops {
578         BOOL (*shm_close)( void );
579         int (*shm_alloc)(int );
580         BOOL (*shm_free)(int );
581         int (*get_userdef_off)(void);
582         void *(*offset2addr)(int );
583         int (*addr2offset)(void *addr);
584         BOOL (*lock_hash_entry)(unsigned int);
585         BOOL (*unlock_hash_entry)( unsigned int );
586         BOOL (*get_usage)(int *,int *,int *);
587         unsigned (*hash_size)(void);
588 };
589
590
591 /* this is used for smbstatus */
592 struct connect_record
593 {
594   int magic;
595   int pid;
596   int cnum;
597   int uid;
598   int gid;
599   char name[24];
600   char addr[24];
601   char machine[128];
602   time_t start;
603 };
604
605 /* This is used by smbclient to send it to a smbfs mount point */
606 struct connection_options {
607   int protocol;
608   /* Connection-Options */
609   uint32 max_xmit;
610   uint16 server_uid;
611   uint16 tid;
612   /* The following are LANMAN 1.0 options */
613   uint16 sec_mode;
614   uint16 max_mux;
615   uint16 max_vcs;
616   uint16 rawmode;
617   uint32 sesskey;
618   /* The following are NT LM 0.12 options */
619   uint32 maxraw;
620   uint32 capabilities;
621   uint16 serverzone;
622 };
623
624 /* the following are used by loadparm for option lists */
625 typedef enum
626 {
627   P_BOOL,P_BOOLREV,P_CHAR,P_INTEGER,P_OCTAL,
628   P_STRING,P_USTRING,P_GSTRING,P_UGSTRING,P_ENUM,P_SEP
629 } parm_type;
630
631 typedef enum
632 {
633   P_LOCAL,P_GLOBAL,P_SEPARATOR,P_NONE
634 } parm_class;
635
636 struct enum_list {
637         int value;
638         char *name;
639 };
640
641 struct parm_struct
642 {
643         char *label;
644         parm_type type;
645         parm_class class;
646         void *ptr;
647         BOOL (*special)(char *, char **);
648         struct enum_list *enum_list;
649         unsigned flags;
650         union {
651                 BOOL bvalue;
652                 int ivalue;
653                 char *svalue;
654                 char cvalue;
655         } def;
656 };
657
658
659 #define FLAG_BASIC 1 /* fundamental options */
660 #define FLAG_HIDE  2 /* options that should be hidden in SWAT */
661 #define FLAG_PRINT 4 /* printing options */
662 #define FLAG_GLOBAL 8 /* local options that should be globally settable in SWAT */
663
664 #ifndef LOCKING_VERSION
665 #define LOCKING_VERSION 4
666 #endif /* LOCKING_VERSION */
667
668 /* these are useful macros for checking validity of handles */
669 #define VALID_FNUM(fnum)   (((fnum) >= 0) && ((fnum) < MAX_OPEN_FILES))
670 #define OPEN_FNUM(fnum)    (VALID_FNUM(fnum) && Files[fnum].open)
671 #define VALID_CNUM(cnum)   (((cnum) >= 0) && ((cnum) < MAX_CONNECTIONS))
672 #define OPEN_CNUM(cnum)    (VALID_CNUM(cnum) && Connections[cnum].open)
673 #define IS_IPC(cnum)       (VALID_CNUM(cnum) && Connections[cnum].ipc)
674 #define IS_PRINT(cnum)       (VALID_CNUM(cnum) && Connections[cnum].printer)
675 #define FNUM_OK(fnum,c) (OPEN_FNUM(fnum) && (c)==Files[fnum].cnum)
676
677 #define CHECK_FNUM(fnum,c) if (!FNUM_OK(fnum,c)) \
678                                return(ERROR(ERRDOS,ERRbadfid))
679 #define CHECK_READ(fnum) if (!Files[fnum].can_read) \
680                                return(ERROR(ERRDOS,ERRbadaccess))
681 #define CHECK_WRITE(fnum) if (!Files[fnum].can_write) \
682                                return(ERROR(ERRDOS,ERRbadaccess))
683 #define CHECK_ERROR(fnum) if (HAS_CACHED_ERROR(fnum)) \
684                                return(CACHED_ERROR(fnum))
685
686 /* translates a connection number into a service number */
687 #define SNUM(cnum)         (Connections[cnum].service)
688
689 /* access various service details */
690 #define SERVICE(snum)      (lp_servicename(snum))
691 #define PRINTCAP           (lp_printcapname())
692 #define PRINTCOMMAND(snum) (lp_printcommand(snum))
693 #define PRINTERNAME(snum)  (lp_printername(snum))
694 #define CAN_WRITE(cnum)    (OPEN_CNUM(cnum) && !Connections[cnum].read_only)
695 #define VALID_SNUM(snum)   (lp_snum_ok(snum))
696 #define GUEST_OK(snum)     (VALID_SNUM(snum) && lp_guest_ok(snum))
697 #define GUEST_ONLY(snum)   (VALID_SNUM(snum) && lp_guest_only(snum))
698 #define CAN_SETDIR(snum)   (!lp_no_set_dir(snum))
699 #define CAN_PRINT(cnum)    (OPEN_CNUM(cnum) && lp_print_ok(SNUM(cnum)))
700 #define POSTSCRIPT(cnum)   (OPEN_CNUM(cnum) && lp_postscript(SNUM(cnum)))
701 #define MAP_HIDDEN(cnum)   (OPEN_CNUM(cnum) && lp_map_hidden(SNUM(cnum)))
702 #define MAP_SYSTEM(cnum)   (OPEN_CNUM(cnum) && lp_map_system(SNUM(cnum)))
703 #define MAP_ARCHIVE(cnum)   (OPEN_CNUM(cnum) && lp_map_archive(SNUM(cnum)))
704 #define IS_HIDDEN_PATH(cnum,path)  (is_in_path((path),Connections[(cnum)].hide_list))
705 #define IS_VETO_PATH(cnum,path)  (is_in_path((path),Connections[(cnum)].veto_list))
706 #define IS_VETO_OPLOCK_PATH(cnum,path)  (is_in_path((path),Connections[(cnum)].veto_oplock_list))
707
708 #define SMBENCRYPT()       (lp_encrypted_passwords())
709
710 /* the basic packet size, assuming no words or bytes */
711 #define smb_size 39
712
713 /* offsets into message for common items */
714 #define smb_com 8
715 #define smb_rcls 9
716 #define smb_reh 10
717 #define smb_err 11
718 #define smb_flg 13
719 #define smb_flg2 14
720 #define smb_reb 13
721 #define smb_tid 28
722 #define smb_pid 30
723 #define smb_uid 32
724 #define smb_mid 34
725 #define smb_wct 36
726 #define smb_vwv 37
727 #define smb_vwv0 37
728 #define smb_vwv1 39
729 #define smb_vwv2 41
730 #define smb_vwv3 43
731 #define smb_vwv4 45
732 #define smb_vwv5 47
733 #define smb_vwv6 49
734 #define smb_vwv7 51
735 #define smb_vwv8 53
736 #define smb_vwv9 55
737 #define smb_vwv10 57
738 #define smb_vwv11 59
739 #define smb_vwv12 61
740 #define smb_vwv13 63
741 #define smb_vwv14 65
742 #define smb_vwv15 67
743 #define smb_vwv16 69
744 #define smb_vwv17 71
745
746
747 /* the complete */
748 #define SMBmkdir      0x00   /* create directory */
749 #define SMBrmdir      0x01   /* delete directory */
750 #define SMBopen       0x02   /* open file */
751 #define SMBcreate     0x03   /* create file */
752 #define SMBclose      0x04   /* close file */
753 #define SMBflush      0x05   /* flush file */
754 #define SMBunlink     0x06   /* delete file */
755 #define SMBmv         0x07   /* rename file */
756 #define SMBgetatr     0x08   /* get file attributes */
757 #define SMBsetatr     0x09   /* set file attributes */
758 #define SMBread       0x0A   /* read from file */
759 #define SMBwrite      0x0B   /* write to file */
760 #define SMBlock       0x0C   /* lock byte range */
761 #define SMBunlock     0x0D   /* unlock byte range */
762 #define SMBctemp      0x0E   /* create temporary file */
763 #define SMBmknew      0x0F   /* make new file */
764 #define SMBchkpth     0x10   /* check directory path */
765 #define SMBexit       0x11   /* process exit */
766 #define SMBlseek      0x12   /* seek */
767 #define SMBtcon       0x70   /* tree connect */
768 #define SMBtconX      0x75   /* tree connect and X*/
769 #define SMBtdis       0x71   /* tree disconnect */
770 #define SMBnegprot    0x72   /* negotiate protocol */
771 #define SMBdskattr    0x80   /* get disk attributes */
772 #define SMBsearch     0x81   /* search directory */
773 #define SMBsplopen    0xC0   /* open print spool file */
774 #define SMBsplwr      0xC1   /* write to print spool file */
775 #define SMBsplclose   0xC2   /* close print spool file */
776 #define SMBsplretq    0xC3   /* return print queue */
777 #define SMBsends      0xD0   /* send single block message */
778 #define SMBsendb      0xD1   /* send broadcast message */
779 #define SMBfwdname    0xD2   /* forward user name */
780 #define SMBcancelf    0xD3   /* cancel forward */
781 #define SMBgetmac     0xD4   /* get machine name */
782 #define SMBsendstrt   0xD5   /* send start of multi-block message */
783 #define SMBsendend    0xD6   /* send end of multi-block message */
784 #define SMBsendtxt    0xD7   /* send text of multi-block message */
785
786 /* Core+ protocol */
787 #define SMBlockread       0x13   /* Lock a range and read */
788 #define SMBwriteunlock 0x14 /* Unlock a range then write */
789 #define SMBreadbraw   0x1a  /* read a block of data with no smb header */
790 #define SMBwritebraw  0x1d  /* write a block of data with no smb header */
791 #define SMBwritec     0x20  /* secondary write request */
792 #define SMBwriteclose 0x2c  /* write a file then close it */
793
794 /* dos extended protocol */
795 #define SMBreadBraw      0x1A   /* read block raw */
796 #define SMBreadBmpx      0x1B   /* read block multiplexed */
797 #define SMBreadBs        0x1C   /* read block (secondary response) */
798 #define SMBwriteBraw     0x1D   /* write block raw */
799 #define SMBwriteBmpx     0x1E   /* write block multiplexed */
800 #define SMBwriteBs       0x1F   /* write block (secondary request) */
801 #define SMBwriteC        0x20   /* write complete response */
802 #define SMBsetattrE      0x22   /* set file attributes expanded */
803 #define SMBgetattrE      0x23   /* get file attributes expanded */
804 #define SMBlockingX      0x24   /* lock/unlock byte ranges and X */
805 #define SMBtrans         0x25   /* transaction - name, bytes in/out */
806 #define SMBtranss        0x26   /* transaction (secondary request/response) */
807 #define SMBioctl         0x27   /* IOCTL */
808 #define SMBioctls        0x28   /* IOCTL  (secondary request/response) */
809 #define SMBcopy          0x29   /* copy */
810 #define SMBmove          0x2A   /* move */
811 #define SMBecho          0x2B   /* echo */
812 #define SMBopenX         0x2D   /* open and X */
813 #define SMBreadX         0x2E   /* read and X */
814 #define SMBwriteX        0x2F   /* write and X */
815 #define SMBsesssetupX    0x73   /* Session Set Up & X (including User Logon) */
816 #define SMBffirst        0x82   /* find first */
817 #define SMBfunique       0x83   /* find unique */
818 #define SMBfclose        0x84   /* find close */
819 #define SMBinvalid       0xFE   /* invalid command */
820
821 /* Extended 2.0 protocol */
822 #define SMBtrans2        0x32   /* TRANS2 protocol set */
823 #define SMBtranss2       0x33   /* TRANS2 protocol set, secondary command */
824 #define SMBfindclose     0x34   /* Terminate a TRANSACT2_FINDFIRST */
825 #define SMBfindnclose    0x35   /* Terminate a TRANSACT2_FINDNOTIFYFIRST */
826 #define SMBulogoffX      0x74   /* user logoff */
827
828 /* NT SMB extensions. */
829 #define SMBnttrans       0xA0   /* NT transact */
830 #define SMBnttranss      0xA1   /* NT transact secondary */
831 #define SMBntcreateX     0xA2   /* NT create and X */
832 #define SMBntcancel      0xA4   /* NT cancel */
833
834 /* These are the TRANS2 sub commands */
835 #define TRANSACT2_OPEN                        0
836 #define TRANSACT2_FINDFIRST                   1
837 #define TRANSACT2_FINDNEXT                    2
838 #define TRANSACT2_QFSINFO                     3
839 #define TRANSACT2_SETFSINFO                   4
840 #define TRANSACT2_QPATHINFO                   5
841 #define TRANSACT2_SETPATHINFO                 6
842 #define TRANSACT2_QFILEINFO                   7
843 #define TRANSACT2_SETFILEINFO                 8
844 #define TRANSACT2_FSCTL                       9
845 #define TRANSACT2_IOCTL                     0xA
846 #define TRANSACT2_FINDNOTIFYFIRST           0xB
847 #define TRANSACT2_FINDNOTIFYNEXT            0xC
848 #define TRANSACT2_MKDIR                     0xD
849 #define TRANSACT2_SESSION_SETUP             0xE
850 #define TRANSACT2_GET_DFS_REFERRAL         0x10
851 #define TRANSACT2_REPORT_DFS_INCONSISTANCY 0x11
852
853 /* These are the NT transact sub commands. */
854 #define NT_TRANSACT_CREATE                1
855 #define NT_TRANSACT_IOCTL                 2
856 #define NT_TRANSACT_SET_SECURITY_DESC     3
857 #define NT_TRANSACT_NOTIFY_CHANGE         4
858 #define NT_TRANSACT_RENAME                5
859 #define NT_TRANSACT_QUERY_SECURITY_DESC   6
860
861 /* these are the trans2 sub fields for primary requests */
862 #define smb_tpscnt smb_vwv0
863 #define smb_tdscnt smb_vwv1
864 #define smb_mprcnt smb_vwv2
865 #define smb_mdrcnt smb_vwv3
866 #define smb_msrcnt smb_vwv4
867 #define smb_flags smb_vwv5
868 #define smb_timeout smb_vwv6
869 #define smb_pscnt smb_vwv9
870 #define smb_psoff smb_vwv10
871 #define smb_dscnt smb_vwv11
872 #define smb_dsoff smb_vwv12
873 #define smb_suwcnt smb_vwv13
874 #define smb_setup smb_vwv14
875 #define smb_setup0 smb_setup
876 #define smb_setup1 (smb_setup+2)
877 #define smb_setup2 (smb_setup+4)
878
879 /* these are for the secondary requests */
880 #define smb_spscnt smb_vwv2
881 #define smb_spsoff smb_vwv3
882 #define smb_spsdisp smb_vwv4
883 #define smb_sdscnt smb_vwv5
884 #define smb_sdsoff smb_vwv6
885 #define smb_sdsdisp smb_vwv7
886 #define smb_sfid smb_vwv8
887
888 /* and these for responses */
889 #define smb_tprcnt smb_vwv0
890 #define smb_tdrcnt smb_vwv1
891 #define smb_prcnt smb_vwv3
892 #define smb_proff smb_vwv4
893 #define smb_prdisp smb_vwv5
894 #define smb_drcnt smb_vwv6
895 #define smb_droff smb_vwv7
896 #define smb_drdisp smb_vwv8
897
898 /* these are for the NT trans primary request. */
899 #define smb_nt_MaxSetupCount smb_vwv0
900 #define smb_nt_Flags (smb_vwv0 + 1)
901 #define smb_nt_TotalParameterCount (smb_vwv0 + 3)
902 #define smb_nt_TotalDataCount (smb_vwv0 + 7)
903 #define smb_nt_MaxParameterCount (smb_vwv0 + 11)
904 #define smb_nt_MaxDataCount (smb_vwv0 + 15)
905 #define smb_nt_ParameterCount (smb_vwv0 + 19)
906 #define smb_nt_ParameterOffset (smb_vwv0 + 23)
907 #define smb_nt_DataCount (smb_vwv0 + 27)
908 #define smb_nt_DataOffset (smb_vwv0 + 31)
909 #define smb_nt_SetupCount (smb_vwv0 + 35)
910 #define smb_nt_Function (smb_vwv0 + 36)
911 #define smb_nt_SetupStart (smb_vwv0 + 39)
912
913 /* these are for the NT trans secondary request. */
914 #define smb_nts_TotalParameterCount (smb_vwv0 + 3)
915 #define smb_nts_TotalDataCount (smb_vwv0 + 7)
916 #define smb_nts_ParameterCount (smb_vwv0 + 11)
917 #define smb_nts_ParameterOffset (smb_vwv0 + 15)
918 #define smb_nts_ParameterDisplacement (smb_vwv0 + 19)
919 #define smb_nts_DataCount (smb_vwv0 + 23)
920 #define smb_nts_DataOffset (smb_vwv0 + 27)
921 #define smb_nts_DataDisplacement (smb_vwv0 + 31)
922
923 /* where to find the base of the SMB packet proper */
924 #define smb_base(buf) (((char *)(buf))+4)
925
926
927 #define SMB_SUCCESS 0  /* The request was successful. */
928 #define ERRDOS 0x01 /*  Error is from the core DOS operating system set. */
929 #define ERRSRV 0x02  /* Error is generated by the server network file manager.*/
930 #define ERRHRD 0x03  /* Error is an hardware error. */
931 #define ERRCMD 0xFF  /* Command was not in the "SMB" format. */
932
933 #ifdef __STDC__
934 int Debug1(char *, ...);
935 #else
936 int Debug1();
937 #endif
938
939 #ifdef DFS_AUTH
940 void dfs_unlogin(void);
941 extern int dcelogin_atmost_once;
942 #endif
943
944 #if AJT
945 void ajt_panic(void);
946 #endif
947
948 #ifdef NOSTRDUP
949 char *strdup(char *s);
950 #endif
951
952 #ifdef REPLACE_STRLEN
953 int Strlen(char *);
954 #endif
955
956 #ifdef REPLACE_STRSTR
957 char *Strstr(char *s, char *p);
958 #endif
959
960 #ifndef MIN
961 #define MIN(a,b) ((a)<(b)?(a):(b))
962 #endif
963 #ifndef MAX
964 #define MAX(a,b) ((a)>(b)?(a):(b))
965 #endif
966
967 #ifndef ABS
968 #define ABS(a) ((a)>0?(a):(-(a)))
969 #endif
970
971 #ifndef SIGNAL_CAST
972 #define SIGNAL_CAST
973 #endif
974
975 #ifndef SELECT_CAST
976 #define SELECT_CAST
977 #endif
978
979
980 /* Some POSIX definitions for those without */
981  
982 #ifndef S_IFDIR
983 #define S_IFDIR         0x4000
984 #endif
985 #ifndef S_ISDIR
986 #define S_ISDIR(mode)   ((mode & 0xF000) == S_IFDIR)
987 #endif
988 #ifndef S_IRWXU
989 #define S_IRWXU 00700           /* read, write, execute: owner */
990 #endif
991 #ifndef S_IRUSR
992 #define S_IRUSR 00400           /* read permission: owner */
993 #endif
994 #ifndef S_IWUSR
995 #define S_IWUSR 00200           /* write permission: owner */
996 #endif
997 #ifndef S_IXUSR
998 #define S_IXUSR 00100           /* execute permission: owner */
999 #endif
1000 #ifndef S_IRWXG
1001 #define S_IRWXG 00070           /* read, write, execute: group */
1002 #endif
1003 #ifndef S_IRGRP
1004 #define S_IRGRP 00040           /* read permission: group */
1005 #endif
1006 #ifndef S_IWGRP
1007 #define S_IWGRP 00020           /* write permission: group */
1008 #endif
1009 #ifndef S_IXGRP
1010 #define S_IXGRP 00010           /* execute permission: group */
1011 #endif
1012 #ifndef S_IRWXO
1013 #define S_IRWXO 00007           /* read, write, execute: other */
1014 #endif
1015 #ifndef S_IROTH
1016 #define S_IROTH 00004           /* read permission: other */
1017 #endif
1018 #ifndef S_IWOTH
1019 #define S_IWOTH 00002           /* write permission: other */
1020 #endif
1021 #ifndef S_IXOTH
1022 #define S_IXOTH 00001           /* execute permission: other */
1023 #endif
1024
1025
1026 /* these are used in NetServerEnum to choose what to receive */
1027 #define SV_TYPE_WORKSTATION         0x00000001
1028 #define SV_TYPE_SERVER              0x00000002
1029 #define SV_TYPE_SQLSERVER           0x00000004
1030 #define SV_TYPE_DOMAIN_CTRL         0x00000008
1031 #define SV_TYPE_DOMAIN_BAKCTRL      0x00000010
1032 #define SV_TYPE_TIME_SOURCE         0x00000020
1033 #define SV_TYPE_AFP                 0x00000040
1034 #define SV_TYPE_NOVELL              0x00000080
1035 #define SV_TYPE_DOMAIN_MEMBER       0x00000100
1036 #define SV_TYPE_PRINTQ_SERVER       0x00000200
1037 #define SV_TYPE_DIALIN_SERVER       0x00000400
1038 #define SV_TYPE_SERVER_UNIX         0x00000800
1039 #define SV_TYPE_NT                  0x00001000
1040 #define SV_TYPE_WFW                 0x00002000
1041 #define SV_TYPE_SERVER_MFPN         0x00004000
1042 #define SV_TYPE_SERVER_NT           0x00008000
1043 #define SV_TYPE_POTENTIAL_BROWSER   0x00010000
1044 #define SV_TYPE_BACKUP_BROWSER      0x00020000
1045 #define SV_TYPE_MASTER_BROWSER      0x00040000
1046 #define SV_TYPE_DOMAIN_MASTER       0x00080000
1047 #define SV_TYPE_SERVER_OSF          0x00100000
1048 #define SV_TYPE_SERVER_VMS          0x00200000
1049 #define SV_TYPE_WIN95_PLUS          0x00400000
1050 #define SV_TYPE_ALTERNATE_XPORT     0x20000000  
1051 #define SV_TYPE_LOCAL_LIST_ONLY     0x40000000  
1052 #define SV_TYPE_DOMAIN_ENUM         0x80000000
1053 #define SV_TYPE_ALL                 0xFFFFFFFF  
1054
1055 /* what server type are we currently  - JHT Says we ARE 4.20 */
1056 /* this was set by JHT in liaison with Jeremy Allison early 1997 */
1057 /* setting to 4.20 at same time as announcing ourselves as NT Server */
1058 /* History: */
1059 /* Version 4.0 - never made public */
1060 /* Version 4.10 - New to 1.9.16p2, lost in space 1.9.16p3 to 1.9.16p9 */
1061 /*              - Reappeared in 1.9.16p11 with fixed smbd services */
1062 /* Version 4.20 - To indicate that nmbd and browsing now works better */
1063
1064 #define DEFAULT_MAJOR_VERSION 0x04
1065 #define DEFAULT_MINOR_VERSION 0x02
1066
1067 /* Browser Election Values */
1068 #define BROWSER_ELECTION_VERSION        0x010f
1069 #define BROWSER_CONSTANT        0xaa55
1070
1071 /* NT Flags2 bits - cifs6.txt section 3.1.2 */
1072    
1073 #define FLAGS2_LONG_PATH_COMPONENTS   0x0001
1074 #define FLAGS2_EXTENDED_ATTRIBUTES    0x0002
1075 #define FLAGS2_DFS_PATHNAMES          0x1000
1076 #define FLAGS2_READ_PERMIT_NO_EXECUTE 0x2000
1077 #define FLAGS2_32_BIT_ERROR_CODES     0x4000 
1078 #define FLAGS2_UNICODE_STRINGS        0x8000
1079
1080 /* Capabilities.  see ftp.microsoft.com/developr/drg/cifs/cifs/cifs4.txt */
1081
1082 #define CAP_RAW_MODE         0x0001
1083 #define CAP_MPX_MODE         0x0002
1084 #define CAP_UNICODE          0x0004
1085 #define CAP_LARGE_FILES      0x0008
1086 #define CAP_NT_SMBS          0x0010
1087 #define CAP_RPC_REMOTE_APIS  0x0020
1088 #define CAP_STATUS32         0x0040
1089 #define CAP_LEVEL_II_OPLOCKS 0x0080
1090 #define CAP_LOCK_AND_READ    0x0100
1091 #define CAP_NT_FIND          0x0200
1092 #define CAP_DFS              0x1000
1093 #define CAP_LARGE_READX      0x4000
1094
1095 /* protocol types. It assumes that higher protocols include lower protocols
1096    as subsets */
1097 enum protocol_types {PROTOCOL_NONE,PROTOCOL_CORE,PROTOCOL_COREPLUS,PROTOCOL_LANMAN1,PROTOCOL_LANMAN2,PROTOCOL_NT1};
1098
1099 /* security levels */
1100 enum security_types {SEC_SHARE,SEC_USER,SEC_SERVER,SEC_DOMAIN};
1101
1102 /* printing types */
1103 enum printing_types {PRINT_BSD,PRINT_SYSV,PRINT_AIX,PRINT_HPUX,
1104                      PRINT_QNX,PRINT_PLP,PRINT_LPRNG,PRINT_SOFTQ};
1105
1106 /* Remote architectures we know about. */
1107 enum remote_arch_types {RA_UNKNOWN, RA_WFWG, RA_OS2, RA_WIN95, RA_WINNT, RA_SAMBA};
1108
1109 /* case handling */
1110 enum case_handling {CASE_LOWER,CASE_UPPER};
1111
1112
1113 /* Macros to get at offsets within smb_lkrng and smb_unlkrng
1114    structures. We cannot define these as actual structures
1115    due to possible differences in structure packing
1116    on different machines/compilers. */
1117
1118 #define SMB_LPID_OFFSET(indx) (10 * (indx))
1119 #define SMB_LKOFF_OFFSET(indx) ( 2 + (10 * (indx)))
1120 #define SMB_LKLEN_OFFSET(indx) ( 6 + (10 * (indx)))
1121
1122 /* Macro to cache an error in a write_bmpx_struct */
1123 #define CACHE_ERROR(w,c,e) ((w)->wr_errclass = (c), (w)->wr_error = (e), \
1124                             w->wr_discard = True, -1)
1125 /* Macro to test if an error has been cached for this fnum */
1126 #define HAS_CACHED_ERROR(fnum) (Files[(fnum)].open && \
1127                                 Files[(fnum)].wbmpx_ptr && \
1128                                 Files[(fnum)].wbmpx_ptr->wr_discard)
1129 /* Macro to turn the cached error into an error packet */
1130 #define CACHED_ERROR(fnum) cached_error_packet(inbuf,outbuf,fnum,__LINE__)
1131
1132 /* these are the datagram types */
1133 #define DGRAM_DIRECT_UNIQUE 0x10
1134
1135 #define ERROR(class,x) error_packet(inbuf,outbuf,class,x,__LINE__)
1136
1137 /* this is how errors are generated */
1138 #define UNIXERROR(defclass,deferror) unix_error_packet(inbuf,outbuf,defclass,deferror,__LINE__)
1139
1140 #define ROUNDUP(x,g) (((x)+((g)-1))&~((g)-1))
1141
1142 /*
1143  * Global value meaing that the smb_uid field should be
1144  * ingored (in share level security and protocol level == CORE)
1145  */
1146
1147 #define UID_FIELD_INVALID 0
1148 #define VUID_OFFSET 100 /* Amount to bias returned vuid numbers */
1149
1150 /* Defines needed for multi-codepage support. */
1151 #define MSDOS_LATIN_1_CODEPAGE 850
1152 #define KANJI_CODEPAGE 932
1153 #define HANGUL_CODEPAGE 949
1154 #define BIG5_CODEPAGE 950
1155 #define SIMPLIFIED_CHINESE_CODEPAGE 936
1156
1157 #ifdef KANJI
1158 /* 
1159  * Default client code page - Japanese 
1160  */
1161 #define DEFAULT_CLIENT_CODE_PAGE KANJI_CODEPAGE
1162 #else /* KANJI */
1163 /* 
1164  * Default client code page - 850 - Western European 
1165  */
1166 #define DEFAULT_CLIENT_CODE_PAGE MSDOS_LATIN_1_CODEPAGE
1167 #endif /* KANJI */
1168
1169 /* 
1170  * Size of buffer to use when moving files across filesystems. 
1171  */
1172 #define COPYBUF_SIZE (8*1024)
1173
1174 /* 
1175  * Integers used to override error codes. 
1176  */
1177 extern int unix_ERR_class;
1178 extern int unix_ERR_code;
1179
1180 /*
1181  * Map the Core and Extended Oplock requesst bits down
1182  * to common bits (EXCLUSIVE_OPLOCK & BATCH_OPLOCK).
1183  */
1184
1185 /*
1186  * Core protocol.
1187  */
1188 #define CORE_OPLOCK_REQUEST(inbuf) ((CVAL(inbuf,smb_flg)&((1<<5)|(1<<6)))>>5)
1189
1190 /*
1191  * Extended protocol.
1192  */
1193 #define EXTENDED_OPLOCK_REQUEST(inbuf) ((SVAL(inbuf,smb_vwv2)&((1<<1)|(1<<2)))>>1)
1194
1195 /* Lock types. */
1196 #define LOCKING_ANDX_SHARED_LOCK 0x1
1197 #define LOCKING_ANDX_OPLOCK_RELEASE 0x2
1198 #define LOCKING_ANDX_CHANGE_LOCKTYPE 0x4
1199 #define LOCKING_ANDX_CANCEL_LOCK 0x8
1200 #define LOCKING_ANDX_LARGE_FILES 0x10
1201
1202 /* Oplock levels */
1203 #define OPLOCKLEVEL_NONE 0
1204 #define OPLOCKLEVEL_II 1
1205
1206 /*
1207  * Bits we test with.
1208  */
1209 #define EXCLUSIVE_OPLOCK 1
1210 #define BATCH_OPLOCK 2
1211
1212 #define CORE_OPLOCK_GRANTED (1<<5)
1213 #define EXTENDED_OPLOCK_GRANTED (1<<15)
1214
1215 /*
1216  * Loopback command offsets.
1217  */
1218
1219 #define UDP_CMD_LEN_OFFSET 0
1220 #define UDP_CMD_PORT_OFFSET 4
1221 #define UDP_CMD_HEADER_LEN 6
1222
1223 #define UDP_MESSAGE_CMD_OFFSET 0
1224
1225 /*
1226  * Oplock break command code to send over the udp socket.
1227  * 
1228  * Form of this is :
1229  *
1230  *  0     2       6        10       14      18       22
1231  *  +----+--------+--------+--------+-------+--------+
1232  *  | cmd| pid    | dev    | inode  | sec   |  usec  |
1233  *  +----+--------+--------+--------+-------+--------+
1234  */
1235
1236 #define OPLOCK_BREAK_CMD 0x1
1237 #define OPLOCK_BREAK_PID_OFFSET 2
1238 #define OPLOCK_BREAK_DEV_OFFSET 6
1239 #define OPLOCK_BREAK_INODE_OFFSET 10
1240 #define OPLOCK_BREAK_SEC_OFFSET 14
1241 #define OPLOCK_BREAK_USEC_OFFSET 18
1242 #define OPLOCK_BREAK_MSG_LEN 22
1243
1244
1245 #define CMD_REPLY 0x8000
1246
1247 #endif /* _SMB_H */
1248
1249 #include "ntdomain.h"
1250
1251 /* _SMB_H */