This is a security audit change of the main source.
[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
255 /* 64 bit time (100usec) since ????? - cifs6.txt, section 3.5, page 30 */
256 typedef struct nttime_info
257 {
258   uint32 low;
259   uint32 high;
260
261 } NTTIME;
262
263 /* Allowable account control bits */
264 #define ACB_DISABLED   0x0001  /* 1 = User account disabled */
265 #define ACB_HOMDIRREQ  0x0002  /* 1 = Home directory required */
266 #define ACB_PWNOTREQ   0x0004  /* 1 = User password not required */
267 #define ACB_TEMPDUP    0x0008  /* 1 = Temporary duplicate account */
268 #define ACB_NORMAL     0x0010  /* 1 = Normal user account */
269 #define ACB_MNS        0x0020  /* 1 = MNS logon user account */
270 #define ACB_DOMTRUST   0x0040  /* 1 = Interdomain trust account */
271 #define ACB_WSTRUST    0x0080  /* 1 = Workstation trust account */
272 #define ACB_SVRTRUST   0x0100  /* 1 = Server trust account */
273 #define ACB_PWNOEXP    0x0200  /* 1 = User password does not expire */
274 #define ACB_AUTOLOCK   0x0400  /* 1 = Account auto locked */
275  
276 #define MAX_HOURS_LEN 32
277
278 struct sam_passwd
279 {
280         time_t logon_time;            /* logon time */
281         time_t logoff_time;           /* logoff time */
282         time_t kickoff_time;          /* kickoff time */
283         time_t pass_last_set_time;    /* password last set time */
284         time_t pass_can_change_time;  /* password can change time */
285         time_t pass_must_change_time; /* password must change time */
286
287         char *smb_name;     /* username string */
288         char *full_name;    /* user's full name string */
289         char *home_dir;     /* home directory string */
290         char *dir_drive;    /* home directory drive string */
291         char *logon_script; /* logon script string */
292         char *profile_path; /* profile path string */
293         char *acct_desc  ;  /* user description string */
294         char *workstations; /* login from workstations string */
295         char *unknown_str ; /* don't know what this is, yet. */
296         char *munged_dial ; /* munged path name and dial-back tel number */
297
298         int smb_userid;       /* this is actually the unix uid_t */
299         int smb_grpid;        /* this is actually the unix gid_t */
300         uint32 user_rid;      /* Primary User ID */
301         uint32 group_rid;     /* Primary Group ID */
302
303         unsigned char *smb_passwd; /* Null if no password */
304         unsigned char *smb_nt_passwd; /* Null if no password */
305
306         uint16 acct_ctrl; /* account info (ACB_xxxx bit-mask) */
307         uint32 unknown_3; /* 0x00ff ffff */
308
309         uint16 logon_divs; /* 168 - number of hours in a week */
310         uint32 hours_len; /* normally 21 bytes */
311         uint8 hours[MAX_HOURS_LEN];
312
313         uint32 unknown_5; /* 0x0002 0000 */
314         uint32 unknown_6; /* 0x0000 04ec */
315 };
316
317 struct smb_passwd
318 {
319         int smb_userid;     /* this is actually the unix uid_t */
320         char *smb_name;     /* username string */
321
322         unsigned char *smb_passwd; /* Null if no password */
323         unsigned char *smb_nt_passwd; /* Null if no password */
324
325         uint16 acct_ctrl; /* account info (ACB_xxxx bit-mask) */
326         time_t pass_last_set_time;    /* password last set time */
327 };
328
329
330 /* DOM_CHAL - challenge info */
331 typedef struct chal_info
332 {
333   uchar data[8]; /* credentials */
334 } DOM_CHAL;
335
336 /* 32 bit time (sec) since 01jan1970 - cifs6.txt, section 3.5, page 30 */
337 typedef struct time_info
338 {
339   uint32 time;
340 } UTIME;
341
342 /* DOM_CREDs - timestamped client or server credentials */
343 typedef struct cred_info
344 {  
345   DOM_CHAL challenge; /* credentials */
346   UTIME timestamp;    /* credential time-stamp */
347 } DOM_CRED;
348
349 struct cli_state {
350   int fd;
351   int cnum;
352   int pid;
353   int mid;
354   int uid;
355   int protocol;
356   int sec_mode;
357   int rap_error;
358   int privilages;
359   fstring eff_name;
360   fstring desthost;
361   char cryptkey[8];
362   uint32 sesskey;
363   int serverzone;
364   uint32 servertime;
365   int readbraw_supported;
366   int writebraw_supported;
367   int timeout;
368   int max_xmit;
369   char *outbuf;
370   char *inbuf;
371   int bufsize;
372   int initialised;
373   /*
374    * Only used in NT domain calls.
375    */
376   uint32 nt_error;                   /* NT RPC error code. */
377   uint16 nt_pipe_fnum;               /* Pipe handle. */
378   unsigned char sess_key[16];        /* Current session key. */
379   DOM_CRED clnt_cred;                /* Client credential. */
380   fstring mach_acct;                 /* MYNAME$. */
381   fstring srv_name_slash;            /* \\remote server. */
382   fstring clnt_name_slash;            /* \\local client. */
383 };
384
385
386 struct current_user
387 {
388   int cnum, vuid;
389   int uid, gid;
390   int ngroups;
391   gid_t *groups;
392   int *igroups;
393   int *attrs;
394 };
395
396 typedef struct
397 {
398   int size;
399   int mode;
400   int uid;
401   int gid;
402   /* these times are normally kept in GMT */
403   time_t mtime;
404   time_t atime;
405   time_t ctime;
406   pstring name;
407
408 } file_info;
409
410
411 /* Structure used when SMBwritebmpx is active */
412 typedef struct
413         {
414         int   wr_total_written; /* So we know when to discard this */
415         int32 wr_timeout;
416         int32 wr_errclass;
417         int32 wr_error; /* Cached errors */
418         BOOL  wr_mode; /* write through mode) */
419         BOOL  wr_discard; /* discard all further data */
420         } write_bmpx_struct;
421
422 /*
423  * Structure used to indirect fd's from the files_struct.
424  * Needed as POSIX locking is based on file and process, not
425  * file descriptor and process.
426  */
427
428 typedef struct
429 {
430   uint16 ref_count;
431   uint32 dev;
432   uint32 inode;
433   int fd;
434   int fd_readonly;
435   int fd_writeonly;
436   int real_open_flags;
437 } file_fd_struct;
438
439 typedef struct
440 {
441   int cnum;
442   file_fd_struct *fd_ptr;
443   int pos;
444   uint32 size;
445   int mode;
446   int vuid;
447   char *mmap_ptr;
448   uint32 mmap_size;
449   write_bmpx_struct *wbmpx_ptr;
450   struct timeval open_time;
451   BOOL open;
452   BOOL can_lock;
453   BOOL can_read;
454   BOOL can_write;
455   BOOL share_mode;
456   BOOL print_file;
457   BOOL modified;
458   BOOL granted_oplock;
459   BOOL sent_oplock_break;
460   BOOL reserved;
461   char *name;
462 } files_struct;
463
464
465 struct uid_cache {
466   int entries;
467   int list[UID_CACHE_SIZE];
468 };
469
470 typedef struct
471 {
472   char *name;
473   BOOL is_wild;
474 } name_compare_entry;
475
476 typedef struct
477 {
478   int service;
479   BOOL force_user;
480   struct uid_cache uid_cache;
481   void *dirptr;
482   BOOL open;
483   BOOL printer;
484   BOOL ipc;
485   BOOL read_only;
486   BOOL admin_user;
487   char *dirpath;
488   char *connectpath;
489   char *origpath;
490   char *user; /* name of user who *opened* this connection */
491   int uid; /* uid of user who *opened* this connection */
492   int gid; /* gid of user who *opened* this connection */
493
494   uint16 vuid; /* vuid of user who *opened* this connection, or UID_FIELD_INVALID */
495
496   /* following groups stuff added by ih */
497
498   /* This groups info is valid for the user that *opened* the connection */
499   int ngroups;
500   gid_t *groups;
501   int *igroups; /* an integer version - some OSes are broken :-( */
502   int *attrs;
503
504   time_t lastused;
505   BOOL used;
506   int num_files_open;
507   name_compare_entry *hide_list; /* Per-share list of files to return as hidden. */
508   name_compare_entry *veto_list; /* Per-share list of files to veto (never show). */
509   name_compare_entry *veto_oplock_list; /* Per-share list of files to refuse oplocks on. */
510
511 } connection_struct;
512
513 /* Domain controller authentication protocol info */
514 struct dcinfo
515 {
516   DOM_CHAL clnt_chal; /* Initial challenge received from client */
517   DOM_CHAL srv_chal;  /* Initial server challenge */
518   DOM_CRED clnt_cred; /* Last client credential */
519   DOM_CRED srv_cred;  /* Last server credential */
520
521   uchar  sess_key[8]; /* Session key */
522   uchar  md4pw[16];   /* md4(machine password) */
523 };
524
525 typedef struct
526 {
527   int uid; /* uid of a validated user */
528   int gid; /* gid of a validated user */
529
530   fstring requested_name; /* user name from the client */
531   fstring name; /* unix user name of a validated user */
532   fstring real_name;   /* to store real name from password file - simeon */
533   BOOL guest;
534
535   /* following groups stuff added by ih */
536   /* This groups info is needed for when we become_user() for this uid */
537   int n_groups;
538   gid_t *groups;
539   int *igroups; /* an integer version - some OSes are broken :-( */
540   int *attrs; /* attributes associated with each gid */
541
542   int n_sids;
543   int *sids;
544
545   /* per-user authentication information on NT RPCs */
546   struct dcinfo dc;
547
548 } user_struct;
549
550
551 enum {LPQ_QUEUED,LPQ_PAUSED,LPQ_SPOOLING,LPQ_PRINTING};
552
553 typedef struct
554 {
555   int job;
556   int size;
557   int status;
558   int priority;
559   time_t time;
560   char user[30];
561   char file[100];
562 } print_queue_struct;
563
564 enum {LPSTAT_OK, LPSTAT_STOPPED, LPSTAT_ERROR};
565
566 typedef struct
567 {
568   fstring message;
569   int status;
570 }  print_status_struct;
571
572 /* used for server information: client, nameserv and ipc */
573 struct server_info_struct
574 {
575   fstring name;
576   uint32 type;
577   fstring comment;
578   fstring domain; /* used ONLY in ipc.c NOT namework.c */
579   BOOL server_added; /* used ONLY in ipc.c NOT namework.c */
580 };
581
582
583 /* used for network interfaces */
584 struct interface
585 {
586         struct interface *next;
587         struct in_addr ip;
588         struct in_addr bcast;
589         struct in_addr nmask;
590 };
591
592 /* struct returned by get_share_modes */
593 typedef struct
594 {
595   int pid;
596   uint16 op_port;
597   uint16 op_type;
598   int share_mode;
599   struct timeval time;
600 } share_mode_entry;
601
602
603 /* each implementation of the share mode code needs
604    to support the following operations */
605 struct share_ops {
606         BOOL (*stop_mgmt)(void);
607         BOOL (*lock_entry)(int , uint32 , uint32 , int *);
608         BOOL (*unlock_entry)(int , uint32 , uint32 , int );
609         int (*get_entries)(int , int , uint32 , uint32 , share_mode_entry **);
610         void (*del_entry)(int , int );
611         BOOL (*set_entry)(int , int , uint16 , uint16 );
612         BOOL (*remove_oplock)(int , int);
613         int (*forall)(void (*)(share_mode_entry *, char *));
614         void (*status)(FILE *);
615 };
616
617 /* each implementation of the shared memory code needs
618    to support the following operations */
619 struct shmem_ops {
620         BOOL (*shm_close)( void );
621         int (*shm_alloc)(int );
622         BOOL (*shm_free)(int );
623         int (*get_userdef_off)(void);
624         void *(*offset2addr)(int );
625         int (*addr2offset)(void *addr);
626         BOOL (*lock_hash_entry)(unsigned int);
627         BOOL (*unlock_hash_entry)( unsigned int );
628         BOOL (*get_usage)(int *,int *,int *);
629         unsigned (*hash_size)(void);
630 };
631
632
633 /* this is used for smbstatus */
634 struct connect_record
635 {
636   int magic;
637   int pid;
638   int cnum;
639   int uid;
640   int gid;
641   char name[24];
642   char addr[24];
643   char machine[128];
644   time_t start;
645 };
646
647 /* This is used by smbclient to send it to a smbfs mount point */
648 struct connection_options {
649   int protocol;
650   /* Connection-Options */
651   uint32 max_xmit;
652   uint16 server_uid;
653   uint16 tid;
654   /* The following are LANMAN 1.0 options */
655   uint16 sec_mode;
656   uint16 max_mux;
657   uint16 max_vcs;
658   uint16 rawmode;
659   uint32 sesskey;
660   /* The following are NT LM 0.12 options */
661   uint32 maxraw;
662   uint32 capabilities;
663   uint16 serverzone;
664 };
665
666 /* the following are used by loadparm for option lists */
667 typedef enum
668 {
669   P_BOOL,P_BOOLREV,P_CHAR,P_INTEGER,P_OCTAL,
670   P_STRING,P_USTRING,P_GSTRING,P_UGSTRING,P_ENUM,P_SEP
671 } parm_type;
672
673 typedef enum
674 {
675   P_LOCAL,P_GLOBAL,P_SEPARATOR,P_NONE
676 } parm_class;
677
678 struct enum_list {
679         int value;
680         char *name;
681 };
682
683 struct parm_struct
684 {
685         char *label;
686         parm_type type;
687         parm_class class;
688         void *ptr;
689         BOOL (*special)(char *, char **);
690         struct enum_list *enum_list;
691         unsigned flags;
692         union {
693                 BOOL bvalue;
694                 int ivalue;
695                 char *svalue;
696                 char cvalue;
697         } def;
698 };
699
700
701 #define FLAG_BASIC 1 /* fundamental options */
702 #define FLAG_HIDE  2 /* options that should be hidden in SWAT */
703 #define FLAG_PRINT 4 /* printing options */
704 #define FLAG_GLOBAL 8 /* local options that should be globally settable in SWAT */
705
706 #ifndef LOCKING_VERSION
707 #define LOCKING_VERSION 4
708 #endif /* LOCKING_VERSION */
709
710 /* these are useful macros for checking validity of handles */
711 #define VALID_FNUM(fnum)   (((fnum) >= 0) && ((fnum) < MAX_OPEN_FILES))
712 #define OPEN_FNUM(fnum)    (VALID_FNUM(fnum) && Files[fnum].open)
713 #define VALID_CNUM(cnum)   (((cnum) >= 0) && ((cnum) < MAX_CONNECTIONS))
714 #define OPEN_CNUM(cnum)    (VALID_CNUM(cnum) && Connections[cnum].open)
715 #define IS_IPC(cnum)       (VALID_CNUM(cnum) && Connections[cnum].ipc)
716 #define IS_PRINT(cnum)       (VALID_CNUM(cnum) && Connections[cnum].printer)
717 #define FNUM_OK(fnum,c) (OPEN_FNUM(fnum) && (c)==Files[fnum].cnum)
718
719 #define CHECK_FNUM(fnum,c) if (!FNUM_OK(fnum,c)) \
720                                return(ERROR(ERRDOS,ERRbadfid))
721 #define CHECK_READ(fnum) if (!Files[fnum].can_read) \
722                                return(ERROR(ERRDOS,ERRbadaccess))
723 #define CHECK_WRITE(fnum) if (!Files[fnum].can_write) \
724                                return(ERROR(ERRDOS,ERRbadaccess))
725 #define CHECK_ERROR(fnum) if (HAS_CACHED_ERROR(fnum)) \
726                                return(CACHED_ERROR(fnum))
727
728 /* translates a connection number into a service number */
729 #define SNUM(cnum)         (Connections[cnum].service)
730
731 /* access various service details */
732 #define SERVICE(snum)      (lp_servicename(snum))
733 #define PRINTCAP           (lp_printcapname())
734 #define PRINTCOMMAND(snum) (lp_printcommand(snum))
735 #define PRINTERNAME(snum)  (lp_printername(snum))
736 #define CAN_WRITE(cnum)    (OPEN_CNUM(cnum) && !Connections[cnum].read_only)
737 #define VALID_SNUM(snum)   (lp_snum_ok(snum))
738 #define GUEST_OK(snum)     (VALID_SNUM(snum) && lp_guest_ok(snum))
739 #define GUEST_ONLY(snum)   (VALID_SNUM(snum) && lp_guest_only(snum))
740 #define CAN_SETDIR(snum)   (!lp_no_set_dir(snum))
741 #define CAN_PRINT(cnum)    (OPEN_CNUM(cnum) && lp_print_ok(SNUM(cnum)))
742 #define POSTSCRIPT(cnum)   (OPEN_CNUM(cnum) && lp_postscript(SNUM(cnum)))
743 #define MAP_HIDDEN(cnum)   (OPEN_CNUM(cnum) && lp_map_hidden(SNUM(cnum)))
744 #define MAP_SYSTEM(cnum)   (OPEN_CNUM(cnum) && lp_map_system(SNUM(cnum)))
745 #define MAP_ARCHIVE(cnum)   (OPEN_CNUM(cnum) && lp_map_archive(SNUM(cnum)))
746 #define IS_HIDDEN_PATH(cnum,path)  (is_in_path((path),Connections[(cnum)].hide_list))
747 #define IS_VETO_PATH(cnum,path)  (is_in_path((path),Connections[(cnum)].veto_list))
748 #define IS_VETO_OPLOCK_PATH(cnum,path)  (is_in_path((path),Connections[(cnum)].veto_oplock_list))
749
750 #define SMBENCRYPT()       (lp_encrypted_passwords())
751
752 /* the basic packet size, assuming no words or bytes */
753 #define smb_size 39
754
755 /* offsets into message for common items */
756 #define smb_com 8
757 #define smb_rcls 9
758 #define smb_reh 10
759 #define smb_err 11
760 #define smb_flg 13
761 #define smb_flg2 14
762 #define smb_reb 13
763 #define smb_tid 28
764 #define smb_pid 30
765 #define smb_uid 32
766 #define smb_mid 34
767 #define smb_wct 36
768 #define smb_vwv 37
769 #define smb_vwv0 37
770 #define smb_vwv1 39
771 #define smb_vwv2 41
772 #define smb_vwv3 43
773 #define smb_vwv4 45
774 #define smb_vwv5 47
775 #define smb_vwv6 49
776 #define smb_vwv7 51
777 #define smb_vwv8 53
778 #define smb_vwv9 55
779 #define smb_vwv10 57
780 #define smb_vwv11 59
781 #define smb_vwv12 61
782 #define smb_vwv13 63
783 #define smb_vwv14 65
784 #define smb_vwv15 67
785 #define smb_vwv16 69
786 #define smb_vwv17 71
787
788
789 /* the complete */
790 #define SMBmkdir      0x00   /* create directory */
791 #define SMBrmdir      0x01   /* delete directory */
792 #define SMBopen       0x02   /* open file */
793 #define SMBcreate     0x03   /* create file */
794 #define SMBclose      0x04   /* close file */
795 #define SMBflush      0x05   /* flush file */
796 #define SMBunlink     0x06   /* delete file */
797 #define SMBmv         0x07   /* rename file */
798 #define SMBgetatr     0x08   /* get file attributes */
799 #define SMBsetatr     0x09   /* set file attributes */
800 #define SMBread       0x0A   /* read from file */
801 #define SMBwrite      0x0B   /* write to file */
802 #define SMBlock       0x0C   /* lock byte range */
803 #define SMBunlock     0x0D   /* unlock byte range */
804 #define SMBctemp      0x0E   /* create temporary file */
805 #define SMBmknew      0x0F   /* make new file */
806 #define SMBchkpth     0x10   /* check directory path */
807 #define SMBexit       0x11   /* process exit */
808 #define SMBlseek      0x12   /* seek */
809 #define SMBtcon       0x70   /* tree connect */
810 #define SMBtconX      0x75   /* tree connect and X*/
811 #define SMBtdis       0x71   /* tree disconnect */
812 #define SMBnegprot    0x72   /* negotiate protocol */
813 #define SMBdskattr    0x80   /* get disk attributes */
814 #define SMBsearch     0x81   /* search directory */
815 #define SMBsplopen    0xC0   /* open print spool file */
816 #define SMBsplwr      0xC1   /* write to print spool file */
817 #define SMBsplclose   0xC2   /* close print spool file */
818 #define SMBsplretq    0xC3   /* return print queue */
819 #define SMBsends      0xD0   /* send single block message */
820 #define SMBsendb      0xD1   /* send broadcast message */
821 #define SMBfwdname    0xD2   /* forward user name */
822 #define SMBcancelf    0xD3   /* cancel forward */
823 #define SMBgetmac     0xD4   /* get machine name */
824 #define SMBsendstrt   0xD5   /* send start of multi-block message */
825 #define SMBsendend    0xD6   /* send end of multi-block message */
826 #define SMBsendtxt    0xD7   /* send text of multi-block message */
827
828 /* Core+ protocol */
829 #define SMBlockread       0x13   /* Lock a range and read */
830 #define SMBwriteunlock 0x14 /* Unlock a range then write */
831 #define SMBreadbraw   0x1a  /* read a block of data with no smb header */
832 #define SMBwritebraw  0x1d  /* write a block of data with no smb header */
833 #define SMBwritec     0x20  /* secondary write request */
834 #define SMBwriteclose 0x2c  /* write a file then close it */
835
836 /* dos extended protocol */
837 #define SMBreadBraw      0x1A   /* read block raw */
838 #define SMBreadBmpx      0x1B   /* read block multiplexed */
839 #define SMBreadBs        0x1C   /* read block (secondary response) */
840 #define SMBwriteBraw     0x1D   /* write block raw */
841 #define SMBwriteBmpx     0x1E   /* write block multiplexed */
842 #define SMBwriteBs       0x1F   /* write block (secondary request) */
843 #define SMBwriteC        0x20   /* write complete response */
844 #define SMBsetattrE      0x22   /* set file attributes expanded */
845 #define SMBgetattrE      0x23   /* get file attributes expanded */
846 #define SMBlockingX      0x24   /* lock/unlock byte ranges and X */
847 #define SMBtrans         0x25   /* transaction - name, bytes in/out */
848 #define SMBtranss        0x26   /* transaction (secondary request/response) */
849 #define SMBioctl         0x27   /* IOCTL */
850 #define SMBioctls        0x28   /* IOCTL  (secondary request/response) */
851 #define SMBcopy          0x29   /* copy */
852 #define SMBmove          0x2A   /* move */
853 #define SMBecho          0x2B   /* echo */
854 #define SMBopenX         0x2D   /* open and X */
855 #define SMBreadX         0x2E   /* read and X */
856 #define SMBwriteX        0x2F   /* write and X */
857 #define SMBsesssetupX    0x73   /* Session Set Up & X (including User Logon) */
858 #define SMBffirst        0x82   /* find first */
859 #define SMBfunique       0x83   /* find unique */
860 #define SMBfclose        0x84   /* find close */
861 #define SMBinvalid       0xFE   /* invalid command */
862
863 /* Extended 2.0 protocol */
864 #define SMBtrans2        0x32   /* TRANS2 protocol set */
865 #define SMBtranss2       0x33   /* TRANS2 protocol set, secondary command */
866 #define SMBfindclose     0x34   /* Terminate a TRANSACT2_FINDFIRST */
867 #define SMBfindnclose    0x35   /* Terminate a TRANSACT2_FINDNOTIFYFIRST */
868 #define SMBulogoffX      0x74   /* user logoff */
869
870 /* NT SMB extensions. */
871 #define SMBnttrans       0xA0   /* NT transact */
872 #define SMBnttranss      0xA1   /* NT transact secondary */
873 #define SMBntcreateX     0xA2   /* NT create and X */
874 #define SMBntcancel      0xA4   /* NT cancel */
875
876 /* These are the TRANS2 sub commands */
877 #define TRANSACT2_OPEN                        0
878 #define TRANSACT2_FINDFIRST                   1
879 #define TRANSACT2_FINDNEXT                    2
880 #define TRANSACT2_QFSINFO                     3
881 #define TRANSACT2_SETFSINFO                   4
882 #define TRANSACT2_QPATHINFO                   5
883 #define TRANSACT2_SETPATHINFO                 6
884 #define TRANSACT2_QFILEINFO                   7
885 #define TRANSACT2_SETFILEINFO                 8
886 #define TRANSACT2_FSCTL                       9
887 #define TRANSACT2_IOCTL                     0xA
888 #define TRANSACT2_FINDNOTIFYFIRST           0xB
889 #define TRANSACT2_FINDNOTIFYNEXT            0xC
890 #define TRANSACT2_MKDIR                     0xD
891 #define TRANSACT2_SESSION_SETUP             0xE
892 #define TRANSACT2_GET_DFS_REFERRAL         0x10
893 #define TRANSACT2_REPORT_DFS_INCONSISTANCY 0x11
894
895 /* These are the NT transact sub commands. */
896 #define NT_TRANSACT_CREATE                1
897 #define NT_TRANSACT_IOCTL                 2
898 #define NT_TRANSACT_SET_SECURITY_DESC     3
899 #define NT_TRANSACT_NOTIFY_CHANGE         4
900 #define NT_TRANSACT_RENAME                5
901 #define NT_TRANSACT_QUERY_SECURITY_DESC   6
902
903 /* these are the trans2 sub fields for primary requests */
904 #define smb_tpscnt smb_vwv0
905 #define smb_tdscnt smb_vwv1
906 #define smb_mprcnt smb_vwv2
907 #define smb_mdrcnt smb_vwv3
908 #define smb_msrcnt smb_vwv4
909 #define smb_flags smb_vwv5
910 #define smb_timeout smb_vwv6
911 #define smb_pscnt smb_vwv9
912 #define smb_psoff smb_vwv10
913 #define smb_dscnt smb_vwv11
914 #define smb_dsoff smb_vwv12
915 #define smb_suwcnt smb_vwv13
916 #define smb_setup smb_vwv14
917 #define smb_setup0 smb_setup
918 #define smb_setup1 (smb_setup+2)
919 #define smb_setup2 (smb_setup+4)
920
921 /* these are for the secondary requests */
922 #define smb_spscnt smb_vwv2
923 #define smb_spsoff smb_vwv3
924 #define smb_spsdisp smb_vwv4
925 #define smb_sdscnt smb_vwv5
926 #define smb_sdsoff smb_vwv6
927 #define smb_sdsdisp smb_vwv7
928 #define smb_sfid smb_vwv8
929
930 /* and these for responses */
931 #define smb_tprcnt smb_vwv0
932 #define smb_tdrcnt smb_vwv1
933 #define smb_prcnt smb_vwv3
934 #define smb_proff smb_vwv4
935 #define smb_prdisp smb_vwv5
936 #define smb_drcnt smb_vwv6
937 #define smb_droff smb_vwv7
938 #define smb_drdisp smb_vwv8
939
940 /* these are for the NT trans primary request. */
941 #define smb_nt_MaxSetupCount smb_vwv0
942 #define smb_nt_Flags (smb_vwv0 + 1)
943 #define smb_nt_TotalParameterCount (smb_vwv0 + 3)
944 #define smb_nt_TotalDataCount (smb_vwv0 + 7)
945 #define smb_nt_MaxParameterCount (smb_vwv0 + 11)
946 #define smb_nt_MaxDataCount (smb_vwv0 + 15)
947 #define smb_nt_ParameterCount (smb_vwv0 + 19)
948 #define smb_nt_ParameterOffset (smb_vwv0 + 23)
949 #define smb_nt_DataCount (smb_vwv0 + 27)
950 #define smb_nt_DataOffset (smb_vwv0 + 31)
951 #define smb_nt_SetupCount (smb_vwv0 + 35)
952 #define smb_nt_Function (smb_vwv0 + 36)
953 #define smb_nt_SetupStart (smb_vwv0 + 39)
954
955 /* these are for the NT trans secondary request. */
956 #define smb_nts_TotalParameterCount (smb_vwv0 + 3)
957 #define smb_nts_TotalDataCount (smb_vwv0 + 7)
958 #define smb_nts_ParameterCount (smb_vwv0 + 11)
959 #define smb_nts_ParameterOffset (smb_vwv0 + 15)
960 #define smb_nts_ParameterDisplacement (smb_vwv0 + 19)
961 #define smb_nts_DataCount (smb_vwv0 + 23)
962 #define smb_nts_DataOffset (smb_vwv0 + 27)
963 #define smb_nts_DataDisplacement (smb_vwv0 + 31)
964
965 /* where to find the base of the SMB packet proper */
966 #define smb_base(buf) (((char *)(buf))+4)
967
968
969 #define SMB_SUCCESS 0  /* The request was successful. */
970 #define ERRDOS 0x01 /*  Error is from the core DOS operating system set. */
971 #define ERRSRV 0x02  /* Error is generated by the server network file manager.*/
972 #define ERRHRD 0x03  /* Error is an hardware error. */
973 #define ERRCMD 0xFF  /* Command was not in the "SMB" format. */
974
975 #ifdef __STDC__
976 int Debug1(char *, ...);
977 #else
978 int Debug1();
979 #endif
980
981 #ifdef DFS_AUTH
982 void dfs_unlogin(void);
983 extern int dcelogin_atmost_once;
984 #endif
985
986 #if AJT
987 void ajt_panic(void);
988 #endif
989
990 #ifdef NOSTRDUP
991 char *strdup(char *s);
992 #endif
993
994 #ifdef REPLACE_STRLEN
995 int Strlen(char *);
996 #endif
997
998 #ifdef REPLACE_STRSTR
999 char *Strstr(char *s, char *p);
1000 #endif
1001
1002 #ifndef MIN
1003 #define MIN(a,b) ((a)<(b)?(a):(b))
1004 #endif
1005 #ifndef MAX
1006 #define MAX(a,b) ((a)>(b)?(a):(b))
1007 #endif
1008
1009 #ifndef ABS
1010 #define ABS(a) ((a)>0?(a):(-(a)))
1011 #endif
1012
1013 #ifndef SIGNAL_CAST
1014 #define SIGNAL_CAST
1015 #endif
1016
1017 #ifndef SELECT_CAST
1018 #define SELECT_CAST
1019 #endif
1020
1021
1022 /* Some POSIX definitions for those without */
1023  
1024 #ifndef S_IFDIR
1025 #define S_IFDIR         0x4000
1026 #endif
1027 #ifndef S_ISDIR
1028 #define S_ISDIR(mode)   ((mode & 0xF000) == S_IFDIR)
1029 #endif
1030 #ifndef S_IRWXU
1031 #define S_IRWXU 00700           /* read, write, execute: owner */
1032 #endif
1033 #ifndef S_IRUSR
1034 #define S_IRUSR 00400           /* read permission: owner */
1035 #endif
1036 #ifndef S_IWUSR
1037 #define S_IWUSR 00200           /* write permission: owner */
1038 #endif
1039 #ifndef S_IXUSR
1040 #define S_IXUSR 00100           /* execute permission: owner */
1041 #endif
1042 #ifndef S_IRWXG
1043 #define S_IRWXG 00070           /* read, write, execute: group */
1044 #endif
1045 #ifndef S_IRGRP
1046 #define S_IRGRP 00040           /* read permission: group */
1047 #endif
1048 #ifndef S_IWGRP
1049 #define S_IWGRP 00020           /* write permission: group */
1050 #endif
1051 #ifndef S_IXGRP
1052 #define S_IXGRP 00010           /* execute permission: group */
1053 #endif
1054 #ifndef S_IRWXO
1055 #define S_IRWXO 00007           /* read, write, execute: other */
1056 #endif
1057 #ifndef S_IROTH
1058 #define S_IROTH 00004           /* read permission: other */
1059 #endif
1060 #ifndef S_IWOTH
1061 #define S_IWOTH 00002           /* write permission: other */
1062 #endif
1063 #ifndef S_IXOTH
1064 #define S_IXOTH 00001           /* execute permission: other */
1065 #endif
1066
1067
1068 /* these are used in NetServerEnum to choose what to receive */
1069 #define SV_TYPE_WORKSTATION         0x00000001
1070 #define SV_TYPE_SERVER              0x00000002
1071 #define SV_TYPE_SQLSERVER           0x00000004
1072 #define SV_TYPE_DOMAIN_CTRL         0x00000008
1073 #define SV_TYPE_DOMAIN_BAKCTRL      0x00000010
1074 #define SV_TYPE_TIME_SOURCE         0x00000020
1075 #define SV_TYPE_AFP                 0x00000040
1076 #define SV_TYPE_NOVELL              0x00000080
1077 #define SV_TYPE_DOMAIN_MEMBER       0x00000100
1078 #define SV_TYPE_PRINTQ_SERVER       0x00000200
1079 #define SV_TYPE_DIALIN_SERVER       0x00000400
1080 #define SV_TYPE_SERVER_UNIX         0x00000800
1081 #define SV_TYPE_NT                  0x00001000
1082 #define SV_TYPE_WFW                 0x00002000
1083 #define SV_TYPE_SERVER_MFPN         0x00004000
1084 #define SV_TYPE_SERVER_NT           0x00008000
1085 #define SV_TYPE_POTENTIAL_BROWSER   0x00010000
1086 #define SV_TYPE_BACKUP_BROWSER      0x00020000
1087 #define SV_TYPE_MASTER_BROWSER      0x00040000
1088 #define SV_TYPE_DOMAIN_MASTER       0x00080000
1089 #define SV_TYPE_SERVER_OSF          0x00100000
1090 #define SV_TYPE_SERVER_VMS          0x00200000
1091 #define SV_TYPE_WIN95_PLUS          0x00400000
1092 #define SV_TYPE_ALTERNATE_XPORT     0x20000000  
1093 #define SV_TYPE_LOCAL_LIST_ONLY     0x40000000  
1094 #define SV_TYPE_DOMAIN_ENUM         0x80000000
1095 #define SV_TYPE_ALL                 0xFFFFFFFF  
1096
1097 /* what server type are we currently  - JHT Says we ARE 4.20 */
1098 /* this was set by JHT in liaison with Jeremy Allison early 1997 */
1099 /* setting to 4.20 at same time as announcing ourselves as NT Server */
1100 /* History: */
1101 /* Version 4.0 - never made public */
1102 /* Version 4.10 - New to 1.9.16p2, lost in space 1.9.16p3 to 1.9.16p9 */
1103 /*              - Reappeared in 1.9.16p11 with fixed smbd services */
1104 /* Version 4.20 - To indicate that nmbd and browsing now works better */
1105
1106 #define DEFAULT_MAJOR_VERSION 0x04
1107 #define DEFAULT_MINOR_VERSION 0x02
1108
1109 /* Browser Election Values */
1110 #define BROWSER_ELECTION_VERSION        0x010f
1111 #define BROWSER_CONSTANT        0xaa55
1112
1113 /* NT Flags2 bits - cifs6.txt section 3.1.2 */
1114    
1115 #define FLAGS2_LONG_PATH_COMPONENTS   0x0001
1116 #define FLAGS2_EXTENDED_ATTRIBUTES    0x0002
1117 #define FLAGS2_DFS_PATHNAMES          0x1000
1118 #define FLAGS2_READ_PERMIT_NO_EXECUTE 0x2000
1119 #define FLAGS2_32_BIT_ERROR_CODES     0x4000 
1120 #define FLAGS2_UNICODE_STRINGS        0x8000
1121
1122 /* Capabilities.  see ftp.microsoft.com/developr/drg/cifs/cifs/cifs4.txt */
1123
1124 #define CAP_RAW_MODE         0x0001
1125 #define CAP_MPX_MODE         0x0002
1126 #define CAP_UNICODE          0x0004
1127 #define CAP_LARGE_FILES      0x0008
1128 #define CAP_NT_SMBS          0x0010
1129 #define CAP_RPC_REMOTE_APIS  0x0020
1130 #define CAP_STATUS32         0x0040
1131 #define CAP_LEVEL_II_OPLOCKS 0x0080
1132 #define CAP_LOCK_AND_READ    0x0100
1133 #define CAP_NT_FIND          0x0200
1134 #define CAP_DFS              0x1000
1135 #define CAP_LARGE_READX      0x4000
1136
1137 /* protocol types. It assumes that higher protocols include lower protocols
1138    as subsets */
1139 enum protocol_types {PROTOCOL_NONE,PROTOCOL_CORE,PROTOCOL_COREPLUS,PROTOCOL_LANMAN1,PROTOCOL_LANMAN2,PROTOCOL_NT1};
1140
1141 /* security levels */
1142 enum security_types {SEC_SHARE,SEC_USER,SEC_SERVER,SEC_DOMAIN};
1143
1144 /* printing types */
1145 enum printing_types {PRINT_BSD,PRINT_SYSV,PRINT_AIX,PRINT_HPUX,
1146                      PRINT_QNX,PRINT_PLP,PRINT_LPRNG,PRINT_SOFTQ};
1147
1148 /* Remote architectures we know about. */
1149 enum remote_arch_types {RA_UNKNOWN, RA_WFWG, RA_OS2, RA_WIN95, RA_WINNT, RA_SAMBA};
1150
1151 /* case handling */
1152 enum case_handling {CASE_LOWER,CASE_UPPER};
1153
1154
1155 /* Macros to get at offsets within smb_lkrng and smb_unlkrng
1156    structures. We cannot define these as actual structures
1157    due to possible differences in structure packing
1158    on different machines/compilers. */
1159
1160 #define SMB_LPID_OFFSET(indx) (10 * (indx))
1161 #define SMB_LKOFF_OFFSET(indx) ( 2 + (10 * (indx)))
1162 #define SMB_LKLEN_OFFSET(indx) ( 6 + (10 * (indx)))
1163
1164 /* Macro to cache an error in a write_bmpx_struct */
1165 #define CACHE_ERROR(w,c,e) ((w)->wr_errclass = (c), (w)->wr_error = (e), \
1166                             w->wr_discard = True, -1)
1167 /* Macro to test if an error has been cached for this fnum */
1168 #define HAS_CACHED_ERROR(fnum) (Files[(fnum)].open && \
1169                                 Files[(fnum)].wbmpx_ptr && \
1170                                 Files[(fnum)].wbmpx_ptr->wr_discard)
1171 /* Macro to turn the cached error into an error packet */
1172 #define CACHED_ERROR(fnum) cached_error_packet(inbuf,outbuf,fnum,__LINE__)
1173
1174 /* these are the datagram types */
1175 #define DGRAM_DIRECT_UNIQUE 0x10
1176
1177 #define ERROR(class,x) error_packet(inbuf,outbuf,class,x,__LINE__)
1178
1179 /* this is how errors are generated */
1180 #define UNIXERROR(defclass,deferror) unix_error_packet(inbuf,outbuf,defclass,deferror,__LINE__)
1181
1182 #define ROUNDUP(x,g) (((x)+((g)-1))&~((g)-1))
1183
1184 /*
1185  * Global value meaing that the smb_uid field should be
1186  * ingored (in share level security and protocol level == CORE)
1187  */
1188
1189 #define UID_FIELD_INVALID 0
1190 #define VUID_OFFSET 100 /* Amount to bias returned vuid numbers */
1191
1192 /* Defines needed for multi-codepage support. */
1193 #define MSDOS_LATIN_1_CODEPAGE 850
1194 #define KANJI_CODEPAGE 932
1195 #define HANGUL_CODEPAGE 949
1196 #define BIG5_CODEPAGE 950
1197 #define SIMPLIFIED_CHINESE_CODEPAGE 936
1198
1199 #ifdef KANJI
1200 /* 
1201  * Default client code page - Japanese 
1202  */
1203 #define DEFAULT_CLIENT_CODE_PAGE KANJI_CODEPAGE
1204 #else /* KANJI */
1205 /* 
1206  * Default client code page - 850 - Western European 
1207  */
1208 #define DEFAULT_CLIENT_CODE_PAGE MSDOS_LATIN_1_CODEPAGE
1209 #endif /* KANJI */
1210
1211 /* 
1212  * Size of buffer to use when moving files across filesystems. 
1213  */
1214 #define COPYBUF_SIZE (8*1024)
1215
1216 /* 
1217  * Integers used to override error codes. 
1218  */
1219 extern int unix_ERR_class;
1220 extern int unix_ERR_code;
1221
1222 /*
1223  * Map the Core and Extended Oplock requesst bits down
1224  * to common bits (EXCLUSIVE_OPLOCK & BATCH_OPLOCK).
1225  */
1226
1227 /*
1228  * Core protocol.
1229  */
1230 #define CORE_OPLOCK_REQUEST(inbuf) ((CVAL(inbuf,smb_flg)&((1<<5)|(1<<6)))>>5)
1231
1232 /*
1233  * Extended protocol.
1234  */
1235 #define EXTENDED_OPLOCK_REQUEST(inbuf) ((SVAL(inbuf,smb_vwv2)&((1<<1)|(1<<2)))>>1)
1236
1237 /* Lock types. */
1238 #define LOCKING_ANDX_SHARED_LOCK 0x1
1239 #define LOCKING_ANDX_OPLOCK_RELEASE 0x2
1240 #define LOCKING_ANDX_CHANGE_LOCKTYPE 0x4
1241 #define LOCKING_ANDX_CANCEL_LOCK 0x8
1242 #define LOCKING_ANDX_LARGE_FILES 0x10
1243
1244 /* Oplock levels */
1245 #define OPLOCKLEVEL_NONE 0
1246 #define OPLOCKLEVEL_II 1
1247
1248 /*
1249  * Bits we test with.
1250  */
1251 #define EXCLUSIVE_OPLOCK 1
1252 #define BATCH_OPLOCK 2
1253
1254 #define CORE_OPLOCK_GRANTED (1<<5)
1255 #define EXTENDED_OPLOCK_GRANTED (1<<15)
1256
1257 /*
1258  * Loopback command offsets.
1259  */
1260
1261 #define UDP_CMD_LEN_OFFSET 0
1262 #define UDP_CMD_PORT_OFFSET 4
1263 #define UDP_CMD_HEADER_LEN 6
1264
1265 #define UDP_MESSAGE_CMD_OFFSET 0
1266
1267 /*
1268  * Oplock break command code to send over the udp socket.
1269  * 
1270  * Form of this is :
1271  *
1272  *  0     2       6        10       14      18       22
1273  *  +----+--------+--------+--------+-------+--------+
1274  *  | cmd| pid    | dev    | inode  | sec   |  usec  |
1275  *  +----+--------+--------+--------+-------+--------+
1276  */
1277
1278 #define OPLOCK_BREAK_CMD 0x1
1279 #define OPLOCK_BREAK_PID_OFFSET 2
1280 #define OPLOCK_BREAK_DEV_OFFSET 6
1281 #define OPLOCK_BREAK_INODE_OFFSET 10
1282 #define OPLOCK_BREAK_SEC_OFFSET 14
1283 #define OPLOCK_BREAK_USEC_OFFSET 18
1284 #define OPLOCK_BREAK_MSG_LEN 22
1285
1286
1287 #define CMD_REPLY 0x8000
1288
1289 #endif /* _SMB_H */
1290
1291 #include "ntdomain.h"
1292
1293 /* _SMB_H */