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