88890de3748ec42ec97be0fa6988b9d621ec1b76
[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
25 #ifndef _SMB_H
26 #define _SMB_H
27
28 #include "md5.h"
29 #include "hmacmd5.h"
30
31 #define BUFFER_SIZE (0xFFFF)
32 #define SAFETY_MARGIN 1024
33
34 #define NMB_PORT 137
35 #define DGRAM_PORT 138
36 #define SMB_PORT 139
37 #define SMB_PORT2 445
38
39 #define False (0)
40 #define True (1)
41 #define Auto (2)
42
43 #ifndef _BOOL
44 typedef int BOOL;
45 #define _BOOL       /* So we don't typedef BOOL again in vfs.h */
46 #endif
47
48 /* limiting size of ipc replies */
49 #define REALLOC(ptr,size) Realloc(ptr,MAX((size),4*1024))
50
51 #define SIZEOFWORD 2
52
53 #ifndef DEF_CREATE_MASK
54 #define DEF_CREATE_MASK (0755)
55 #endif
56
57 /* how long to wait for secondary SMB packets (milli-seconds) */
58 #define SMB_SECONDARY_WAIT (60*1000)
59
60 /* Debugging stuff */
61
62 #include <debug.h>
63
64 /* this defines the error codes that receive_smb can put in smb_read_error */
65 #define READ_TIMEOUT 1
66 #define READ_EOF 2
67 #define READ_ERROR 3
68
69
70 #define DIR_STRUCT_SIZE 43
71
72 /* these define all the command types recognised by the server - there
73 are lots of gaps so probably there are some rare commands that are not
74 implemented */
75
76 #define pSETDIR '\377'
77
78 /* these define the attribute byte as seen by DOS */
79 #define aRONLY (1L<<0)
80 #define aHIDDEN (1L<<1)
81 #define aSYSTEM (1L<<2)
82 #define aVOLID (1L<<3)
83 #define aDIR (1L<<4)
84 #define aARCH (1L<<5)
85
86 /* deny modes */
87 #define DENY_DOS 0
88 #define DENY_ALL 1
89 #define DENY_WRITE 2
90 #define DENY_READ 3
91 #define DENY_NONE 4
92 #define DENY_FCB 7
93
94 /* open modes */
95 #define DOS_OPEN_RDONLY 0
96 #define DOS_OPEN_WRONLY 1
97 #define DOS_OPEN_RDWR 2
98 #define DOS_OPEN_FCB 0xF
99
100 /* define shifts and masks for share and open modes. */
101 #define OPEN_MODE_MASK 0xF
102 #define SHARE_MODE_SHIFT 4
103 #define SHARE_MODE_MASK 0x7
104 #define GET_OPEN_MODE(x) ((x) & OPEN_MODE_MASK)
105 #define SET_OPEN_MODE(x) ((x) & OPEN_MODE_MASK)
106 #define GET_DENY_MODE(x) (((x)>>SHARE_MODE_SHIFT) & SHARE_MODE_MASK)
107 #define SET_DENY_MODE(x) ((x)<<SHARE_MODE_SHIFT)
108
109 /* Sync on open file (not sure if used anymore... ?) */
110 #define FILE_SYNC_OPENMODE (1<<14)
111 #define GET_FILE_SYNC_OPENMODE(x) (((x) & FILE_SYNC_OPENMODE) ? True : False)
112
113 /* allow delete on open file mode (used by NT SMB's). */
114 #define ALLOW_SHARE_DELETE (1<<15)
115 #define GET_ALLOW_SHARE_DELETE(x) (((x) & ALLOW_SHARE_DELETE) ? True : False)
116 #define SET_ALLOW_SHARE_DELETE(x) ((x) ? ALLOW_SHARE_DELETE : 0)
117
118 /* delete on close flag (used by NT SMB's). */
119 #define DELETE_ON_CLOSE_FLAG (1<<16)
120 #define GET_DELETE_ON_CLOSE_FLAG(x) (((x) & DELETE_ON_CLOSE_FLAG) ? True : False)
121 #define SET_DELETE_ON_CLOSE_FLAG(x) ((x) ? DELETE_ON_CLOSE_FLAG : 0)
122
123 /* open disposition values */
124 #define FILE_EXISTS_FAIL 0
125 #define FILE_EXISTS_OPEN 1
126 #define FILE_EXISTS_TRUNCATE 2
127
128 /* mask for open disposition. */
129 #define FILE_OPEN_MASK 0x3
130
131 #define GET_FILE_OPEN_DISPOSITION(x) ((x) & FILE_OPEN_MASK)
132 #define SET_FILE_OPEN_DISPOSITION(x) ((x) & FILE_OPEN_MASK)
133
134 /* The above can be OR'ed with... */
135 #define FILE_CREATE_IF_NOT_EXIST 0x10
136 #define FILE_FAIL_IF_NOT_EXIST 0
137
138 #define GET_FILE_CREATE_DISPOSITION(x) ((x) & (FILE_CREATE_IF_NOT_EXIST|FILE_FAIL_IF_NOT_EXIST))
139
140 /* share types */
141 #define STYPE_DISKTREE  0       /* Disk drive */
142 #define STYPE_PRINTQ    1       /* Spooler queue */
143 #define STYPE_DEVICE    2       /* Serial device */
144 #define STYPE_IPC       3       /* Interprocess communication (IPC) */
145 #define STYPE_HIDDEN    0x80000000 /* share is a hidden one (ends with $) */
146
147 /* SMB X/Open error codes for the ERRDOS error class */
148 #define ERRbadfunc 1 /* Invalid function (or system call) */
149 #define ERRbadfile 2 /* File not found (pathname error) */
150 #define ERRbadpath 3 /* Directory not found */
151 #define ERRnofids 4 /* Too many open files */
152 #define ERRnoaccess 5 /* Access denied */
153 #define ERRbadfid 6 /* Invalid fid */
154 #define ERRnomem 8 /* Out of memory */
155 #define ERRbadmem 9 /* Invalid memory block address */
156 #define ERRbadenv 10 /* Invalid environment */
157 #define ERRbadaccess 12 /* Invalid open mode */
158 #define ERRbaddata 13 /* Invalid data (only from ioctl call) */
159 #define ERRres 14 /* reserved */
160 #define ERRbaddrive 15 /* Invalid drive */
161 #define ERRremcd 16 /* Attempt to delete current directory */
162 #define ERRdiffdevice 17 /* rename/move across different filesystems */
163 #define ERRnofiles 18 /* no more files found in file search */
164 #define ERRbadshare 32 /* Share mode on file conflict with open mode */
165 #define ERRlock 33 /* Lock request conflicts with existing lock */
166 #define ERRunsup 50 /* Request unsupported, returned by Win 95, RJS 20Jun98 */
167 #define ERRfilexists 80 /* File in operation already exists */
168 #define ERRcannotopen 110 /* Cannot open the file specified */
169 #define ERRunknownlevel 124
170 #define ERRrename 183
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 ERROR_NOTIFY_ENUM_DIR 1022 /* Buffer too small to return change notify. */
180 #define ERRunknownipc 2142
181
182
183 /* here's a special one from observing NT */
184 #define ERRnoipc 66 /* don't support ipc */
185
186 /* Error codes for the ERRSRV class */
187
188 #define ERRerror 1 /* Non specific error code */
189 #define ERRbadpw 2 /* Bad password */
190 #define ERRbadtype 3 /* reserved */
191 #define ERRaccess 4 /* No permissions to do the requested operation */
192 #define ERRinvnid 5 /* tid invalid */
193 #define ERRinvnetname 6 /* Invalid servername */
194 #define ERRinvdevice 7 /* Invalid device */
195 #define ERRqfull 49 /* Print queue full */
196 #define ERRqtoobig 50 /* Queued item too big */
197 #define ERRinvpfid 52 /* Invalid print file in smb_fid */
198 #define ERRsmbcmd 64 /* Unrecognised command */
199 #define ERRsrverror 65 /* smb server internal error */
200 #define ERRfilespecs 67 /* fid and pathname invalid combination */
201 #define ERRbadlink 68 /* reserved */
202 #define ERRbadpermits 69 /* Access specified for a file is not valid */
203 #define ERRbadpid 70 /* reserved */
204 #define ERRsetattrmode 71 /* attribute mode invalid */
205 #define ERRpaused 81 /* Message server paused */
206 #define ERRmsgoff 82 /* Not receiving messages */
207 #define ERRnoroom 83 /* No room for message */
208 #define ERRrmuns 87 /* too many remote usernames */
209 #define ERRtimeout 88 /* operation timed out */
210 #define ERRnoresource  89 /* No resources currently available for request. */
211 #define ERRtoomanyuids 90 /* too many userids */
212 #define ERRbaduid 91 /* bad userid */
213 #define ERRuseMPX 250 /* temporarily unable to use raw mode, use MPX mode */
214 #define ERRuseSTD 251 /* temporarily unable to use raw mode, use standard mode */
215 #define ERRcontMPX 252 /* resume MPX mode */
216 #define ERRbadPW /* reserved */
217 #define ERRnosupport 0xFFFF
218 #define ERRunknownsmb 22 /* from NT 3.5 response */
219
220
221 /* Error codes for the ERRHRD class */
222
223 #define ERRnowrite 19 /* read only media */
224 #define ERRbadunit 20 /* Unknown device */
225 #define ERRnotready 21 /* Drive not ready */
226 #define ERRbadcmd 22 /* Unknown command */
227 #define ERRdata 23 /* Data (CRC) error */
228 #define ERRbadreq 24 /* Bad request structure length */
229 #define ERRseek 25
230 #define ERRbadmedia 26
231 #define ERRbadsector 27
232 #define ERRnopaper 28
233 #define ERRwrite 29 /* write fault */
234 #define ERRread 30 /* read fault */
235 #define ERRgeneral 31 /* General hardware failure */
236 #define ERRwrongdisk 34
237 #define ERRFCBunavail 35
238 #define ERRsharebufexc 36 /* share buffer exceeded */
239 #define ERRdiskfull 39
240
241 #ifndef _PSTRING
242 #define PSTRING_LEN 1024
243 #define FSTRING_LEN 128
244
245 typedef char pstring[PSTRING_LEN];
246 typedef char fstring[FSTRING_LEN];
247 #define _PSTRING
248 #endif
249
250 /* pipe string names */
251 #define PIPE_LANMAN   "\\PIPE\\LANMAN"
252 #define PIPE_SRVSVC   "\\PIPE\\srvsvc"
253 #define PIPE_SAMR     "\\PIPE\\samr"
254 #define PIPE_WINREG   "\\PIPE\\winreg"
255 #define PIPE_WKSSVC   "\\PIPE\\wkssvc"
256 #define PIPE_NETLOGON "\\PIPE\\NETLOGON"
257 #define PIPE_SVCCTL   "\\PIPE\\SVCCTL"
258 #define PIPE_NTLSA    "\\PIPE\\ntlsa"
259 #define PIPE_NTSVCS   "\\PIPE\\ntsvcs"
260 #define PIPE_LSASS    "\\PIPE\\lsass"
261 #define PIPE_LSARPC   "\\PIPE\\lsarpc"
262 #define PIPE_ATSVC    "\\PIPE\\atsvc"
263 #define PIPE_SPOOLSS  "\\pipe\\spoolss"
264 #define PIPE_EVENTLOG "\\PIPE\\EVENTLOG"
265
266 /* 64 bit time (100usec) since ????? - cifs6.txt, section 3.5, page 30 */
267 typedef struct nttime_info
268 {
269   uint32 low;
270   uint32 high;
271
272 } NTTIME;
273
274 /* Allowable account control bits */
275 #define ACB_DISABLED   0x0001  /* 1 = User account disabled */
276 #define ACB_HOMDIRREQ  0x0002  /* 1 = Home directory required */
277 #define ACB_PWNOTREQ   0x0004  /* 1 = User password not required */
278 #define ACB_TEMPDUP    0x0008  /* 1 = Temporary duplicate account */
279 #define ACB_NORMAL     0x0010  /* 1 = Normal user account */
280 #define ACB_MNS        0x0020  /* 1 = MNS logon user account */
281 #define ACB_DOMTRUST   0x0040  /* 1 = Interdomain trust account */
282 #define ACB_WSTRUST    0x0080  /* 1 = Workstation trust account */
283 #define ACB_SVRTRUST   0x0100  /* 1 = Server trust account */
284 #define ACB_PWNOEXP    0x0200  /* 1 = User password does not expire */
285 #define ACB_AUTOLOCK   0x0400  /* 1 = Account auto locked */
286 #define ACB_PWLOCK     0x0800  /* 1 = Password is locked and connot be changed remotely */
287  
288 #define MAX_HOURS_LEN 32
289
290 struct sam_passwd
291 {
292         NTTIME logon_time;            /* logon time */
293         NTTIME logoff_time;           /* logoff time */
294         NTTIME kickoff_time;          /* kickoff time */
295         NTTIME pass_last_set_time;    /* password last set time */
296         NTTIME pass_can_change_time;  /* password can change time */
297         NTTIME pass_must_change_time; /* password must change time */
298
299         char *unix_name;    /* unix username string */
300         char *nt_name;      /* nt username string */
301         char *full_name;    /* user's full name string */
302         char *home_dir;     /* home directory string */
303         char *dir_drive;    /* home directory drive string */
304         char *logon_script; /* logon script string */
305         char *profile_path; /* profile path string */
306         char *acct_desc  ;  /* user description string */
307         char *workstations; /* login from workstations string */
308         char *unknown_str ; /* don't know what this is, yet. */
309         char *munged_dial ; /* munged path name and dial-back tel number */
310
311         uid_t unix_uid;       /* this is actually the unix uid_t */
312         gid_t unix_gid;        /* this is actually the unix gid_t */
313         uint32 user_rid;      /* Primary User ID */
314         uint32 group_rid;     /* Primary Group ID */
315
316         unsigned char *smb_passwd; /* Null if no password */
317         unsigned char *smb_nt_passwd; /* Null if no password */
318
319         uint16 acct_ctrl; /* account info (ACB_xxxx bit-mask) */
320         uint32 unknown_3; /* 0x00ff ffff */
321
322         uint16 logon_divs; /* 168 - number of hours in a week */
323         uint32 hours_len; /* normally 21 bytes */
324         uint8 hours[MAX_HOURS_LEN];
325
326         uint32 unknown_5; /* 0x0002 0000 */
327         uint32 unknown_6; /* 0x0000 04ec */
328 };
329
330 struct smb_passwd
331 {
332         uid_t unix_uid;     /* unix userid */
333         char *unix_name;     /* unix username string */
334
335         uint32 user_rid;     /* Primary User ID */
336         char *nt_name;     /* unix username string */
337
338         unsigned char *smb_passwd; /* Null if no password */
339         unsigned char *smb_nt_passwd; /* Null if no password */
340
341         uint16 acct_ctrl; /* account info (ACB_xxxx bit-mask) */
342         time_t pass_last_set_time;    /* password last set time */
343 };
344
345
346 struct sam_disp_info
347 {
348         uint32 user_rid;      /* Primary User ID */
349         char *nt_name;        /* username string */
350         char *full_name;      /* user's full name string */
351 };
352
353 #define MAXSUBAUTHS 15 /* max sub authorities in a SID */
354
355 /* DOM_SID - security id */
356 typedef struct sid_info
357 {
358   uint8  sid_rev_num;             /* SID revision number */
359   uint8  num_auths;               /* number of sub-authorities */
360   uint8  id_auth[6];              /* Identifier Authority */
361   /*
362    * Note that the values in these uint32's are in *native* byteorder,
363    * not neccessarily little-endian...... JRA.
364    */
365   uint32 sub_auths[MAXSUBAUTHS];  /* pointer to sub-authorities. */
366
367 } DOM_SID;
368
369
370 typedef struct group_name_info
371 {
372         char *nt_name;
373         char *nt_domain;
374         char *unix_name;
375
376         DOM_SID sid;
377         uint8 type;
378         uint32 unix_id;
379
380 } DOM_NAME_MAP;
381
382 /* map either local aliases, domain groups or builtin aliases */
383 typedef enum 
384 {
385         DOM_MAP_LOCAL,
386         DOM_MAP_DOMAIN,
387         DOM_MAP_USER
388
389 } DOM_MAP_TYPE;
390
391
392 /*** query a local group, get a list of these: shows who is in that group ***/
393
394 /* local group member info */
395 typedef struct local_grp_member_info
396 {
397         DOM_SID sid    ; /* matches with name */
398         uint8   sid_use; /* usr=1 grp=2 dom=3 alias=4 wkng=5 del=6 inv=7 unk=8 */
399         fstring name   ; /* matches with sid: must be of the form "DOMAIN\account" */
400
401 } LOCAL_GRP_MEMBER;
402
403 /* enumerate these to get list of local groups */
404
405 /* local group info */
406 typedef struct local_grp_info
407 {
408         fstring name;
409         fstring comment;
410         uint32  rid; /* alias rid */
411
412 } LOCAL_GRP;
413
414 /*** query a domain group, get a list of these: shows who is in that group ***/
415
416 /* domain group info */
417 typedef struct domain_grp_member_info
418 {
419         fstring name;
420         uint8   attr; /* attributes forced to be set to 0x7: SE_GROUP_xxx */
421         uint32  rid; /* rid of domain group member */
422         uint8   sid_use; /* usr=1 grp=2 dom=3 alias=4 wkng=5 del=6 inv=7 unk=8 */
423
424 } DOMAIN_GRP_MEMBER;
425
426 /*** enumerate these to get list of domain groups ***/
427
428 /* domain group member info */
429 typedef struct domain_grp_info
430 {
431         fstring name;
432         fstring comment;
433         uint32  rid; /* group rid */
434         uint8   attr; /* attributes forced to be set to 0x7: SE_GROUP_xxx */
435
436 } DOMAIN_GRP;
437
438 /* DOM_CHAL - challenge info */
439 typedef struct chal_info
440 {
441   uchar data[8]; /* credentials */
442 } DOM_CHAL;
443
444 /* 32 bit time (sec) since 01jan1970 - cifs6.txt, section 3.5, page 30 */
445 typedef struct time_info
446 {
447   uint32 time;
448 } UTIME;
449
450 /* DOM_CREDs - timestamped client or server credentials */
451 typedef struct cred_info
452 {  
453   DOM_CHAL challenge; /* credentials */
454   UTIME timestamp;    /* credential time-stamp */
455 } DOM_CRED;
456
457 /* Structure used when SMBwritebmpx is active */
458 typedef struct
459 {
460   size_t wr_total_written; /* So we know when to discard this */
461   int32 wr_timeout;
462   int32 wr_errclass;
463   int32 wr_error; /* Cached errors */
464   BOOL  wr_mode; /* write through mode) */
465   BOOL  wr_discard; /* discard all further data */
466 } write_bmpx_struct;
467
468 /*
469  * Structure used to indirect fd's from the files_struct.
470  * Needed as POSIX locking is based on file and process, not
471  * file descriptor and process.
472  */
473
474 typedef struct file_fd_struct
475 {
476         struct file_fd_struct *next, *prev;
477         uint16 ref_count;
478         uint16 uid_cache_count;
479         uid_t uid_users_cache[10];
480         SMB_DEV_T dev;
481         SMB_INO_T inode;
482         int fd;
483         int fd_readonly;
484         int fd_writeonly;
485         int real_open_flags;
486         BOOL delete_on_close;
487 } file_fd_struct;
488
489 typedef struct files_struct
490 {
491         struct files_struct *next, *prev;
492         int fnum;
493         struct connection_struct *conn;
494         file_fd_struct *fd_ptr;
495         SMB_OFF_T pos;
496         SMB_OFF_T size;
497         mode_t mode;
498         uint16 vuid;
499         char *mmap_ptr;
500         SMB_OFF_T mmap_size;
501         write_bmpx_struct *wbmpx_ptr;
502         struct timeval open_time;
503         int share_mode;
504         time_t pending_modtime;
505         BOOL open;
506         BOOL can_lock;
507         BOOL can_read;
508         BOOL can_write;
509         BOOL print_file;
510         BOOL modified;
511         BOOL granted_oplock;
512         BOOL sent_oplock_break;
513         BOOL is_directory;
514         char *fsp_name;
515 } files_struct;
516
517 /*
518  * Structure used to keep directory state information around.
519  * Used in NT change-notify code.
520  */
521
522 typedef struct
523 {
524   time_t modify_time;
525   time_t status_time;
526 } dir_status_struct;
527
528 struct uid_cache {
529   int entries;
530   uid_t list[UID_CACHE_SIZE];
531 };
532
533 typedef struct
534 {
535   char *name;
536   BOOL is_wild;
537 } name_compare_entry;
538
539 /* Include VFS stuff */
540
541 #include "vfs.h"
542
543 typedef struct connection_struct
544 {
545         struct connection_struct *next, *prev;
546         unsigned cnum; /* an index passed over the wire */
547         int service;
548         BOOL force_user;
549         struct uid_cache uid_cache;
550         void *dirptr;
551         BOOL printer;
552         BOOL ipc;
553         BOOL read_only;
554         BOOL admin_user;
555         char *dirpath;
556         char *connectpath;
557         char *origpath;
558         struct vfs_ops vfs_ops;             /* Filesystem operations */
559         struct vfs_connection_struct *vfs_conn;
560
561         char *user; /* name of user who *opened* this connection */
562
563         uid_t uid; /* uid of user who *opened* this connection */
564         gid_t gid; /* gid of user who *opened* this connection */
565
566         uint16 vuid; /* vuid of user who *opened* this connection, or UID_FIELD_INVALID */
567
568         /* following groups stuff added by ih */
569
570         /* This groups info is valid for the user that *opened* the connection */
571         int ngroups;
572         gid_t *groups;
573         
574         time_t lastused;
575         BOOL used;
576         int num_files_open;
577         name_compare_entry *hide_list; /* Per-share list of files to return as hidden. */
578         name_compare_entry *veto_list; /* Per-share list of files to veto (never show). */
579         name_compare_entry *veto_oplock_list; /* Per-share list of files to refuse oplocks on. */       
580
581 } connection_struct;
582
583 struct unix_sec_ctxt
584 {
585         uid_t uid;
586         gid_t gid;
587         int ngroups;
588         gid_t *groups;
589
590         char *name;
591 };
592
593 struct nt_sec_ctxt
594 {
595         /* this should (will?) probably become a SEC_DESC */
596         DOM_SID user_sid;
597         DOM_SID group_sid;
598
599         char *name;
600         char *domain;
601 };
602
603 #if 0
604 struct sec_ctxt
605 {
606         struct unix_sec_ctxt unix;
607         struct nt_sec_ctxt   nt;
608 };
609 #endif
610
611 struct current_user
612 {
613         connection_struct *conn;
614         uint16 vuid;
615         uid_t uid;
616         gid_t gid;
617         int ngroups;
618         gid_t *groups;
619 };
620
621 /* Domain controller authentication protocol info */
622 struct dcinfo
623 {
624   DOM_CHAL clnt_chal; /* Initial challenge received from client */
625   DOM_CHAL srv_chal;  /* Initial server challenge */
626   DOM_CRED clnt_cred; /* Last client credential */
627   DOM_CRED srv_cred;  /* Last server credential */
628
629   uchar  sess_key[8]; /* Session key */
630   uchar  md4pw[16];   /* md4(machine password) */
631   uchar  user_sess_key[16]; /* user session key (md4 nt#) */
632 };
633
634 typedef struct
635 {
636   uid_t uid; /* uid of a validated user */
637   gid_t gid; /* gid of a validated user */
638
639   fstring requested_name; /* user name from the client */
640   fstring name; /* unix user name of a validated user */
641   fstring real_name;   /* to store real name from password file - simeon */
642   BOOL guest;
643
644   /* following groups stuff added by ih */
645   /* This groups info is needed for when we become_user() for this uid */
646   int n_groups;
647   gid_t *groups;
648
649   int n_sids;
650   int *sids;
651
652   /* per-user authentication information on NT RPCs */
653   struct dcinfo dc;
654
655 } user_struct;
656
657
658 enum {LPQ_QUEUED,LPQ_PAUSED,LPQ_SPOOLING,LPQ_PRINTING};
659
660 typedef struct
661 {
662   int job;
663   int size;
664   int status;
665   int priority;
666   time_t time;
667   char user[30];
668   char file[100];
669 } print_queue_struct;
670
671 enum {LPSTAT_OK, LPSTAT_STOPPED, LPSTAT_ERROR};
672
673 typedef struct
674 {
675   fstring message;
676   int status;
677 }  print_status_struct;
678
679 /* used for server information: client, nameserv and ipc */
680 struct server_info_struct
681 {
682   fstring name;
683   uint32 type;
684   fstring comment;
685   fstring domain; /* used ONLY in ipc.c NOT namework.c */
686   BOOL server_added; /* used ONLY in ipc.c NOT namework.c */
687 };
688
689
690 /* used for network interfaces */
691 struct interface
692 {
693         struct interface *next;
694         struct in_addr ip;
695         struct in_addr bcast;
696         struct in_addr nmask;
697 };
698
699 /* struct returned by get_share_modes */
700 typedef struct
701 {
702   int pid;
703   uint16 op_port;
704   uint16 op_type;
705   int share_mode;
706   struct timeval time;
707 } share_mode_entry;
708
709
710 /* each implementation of the share mode code needs
711    to support the following operations */
712 struct share_ops {
713         BOOL (*stop_mgmt)(void);
714         BOOL (*lock_entry)(connection_struct *, SMB_DEV_T , SMB_INO_T , int *);
715         BOOL (*unlock_entry)(connection_struct *, SMB_DEV_T , SMB_INO_T , int );
716         int (*get_entries)(connection_struct *, int , SMB_DEV_T , SMB_INO_T , share_mode_entry **);
717         void (*del_entry)(int , files_struct *);
718         BOOL (*set_entry)(int, files_struct *, uint16 , uint16 );
719     BOOL (*mod_entry)(int, files_struct *, void (*)(share_mode_entry *, SMB_DEV_T, SMB_INO_T, void *), void *);
720         int (*forall)(void (*)(share_mode_entry *, char *));
721         void (*status)(FILE *);
722 };
723
724 /* each implementation of the shared memory code needs
725    to support the following operations */
726 struct shmem_ops {
727         BOOL (*shm_close)( void );
728         int (*shm_alloc)(int );
729         BOOL (*shm_free)(int );
730         int (*get_userdef_off)(void);
731         void *(*offset2addr)(int );
732         int (*addr2offset)(void *addr);
733         BOOL (*lock_hash_entry)(unsigned int);
734         BOOL (*unlock_hash_entry)( unsigned int );
735         BOOL (*get_usage)(int *,int *,int *);
736         unsigned (*hash_size)(void);
737 };
738
739 /*
740  * Each implementation of the password database code needs
741  * to support the following operations.
742  */
743
744 struct smb_passdb_ops
745 {
746         /*
747          * Password database operations.
748          */
749         void *(*startsmbpwent)(BOOL);
750         void (*endsmbpwent)(void *);
751         SMB_BIG_UINT (*getsmbpwpos)(void *);
752         BOOL (*setsmbpwpos)(void *, SMB_BIG_UINT);
753
754         /*
755          * smb password database query functions.
756          */
757         struct smb_passwd *(*getsmbpwnam)(const char *);
758         struct smb_passwd *(*getsmbpwuid)(uid_t);
759         struct smb_passwd *(*getsmbpwent)(void *);
760
761         /*
762          * smb password database modification functions.
763          */
764         BOOL (*add_smbpwd_entry)(struct smb_passwd *);
765         BOOL (*mod_smbpwd_entry)(struct smb_passwd *, BOOL);
766
767 #if 0
768   /*
769    * password checking functions
770    */
771   struct smb_passwd *(*smb_password_chal  )(const char *username, const char lm_pass[24], const char nt_pass[24], char chal[8]);
772   struct smb_passwd *(*smb_password_check )(const char *username, const char lm_hash[16], const char nt_hash[16]);
773   struct passwd     *(*unix_password_check)(const char *username, const char *pass, int pass_len);
774 #endif
775 };
776
777 /*
778  * Each implementation of the password database code needs
779  * to support the following operations.
780  */
781
782 struct sam_passdb_ops {
783   /*
784    * Password database operations.
785    */
786   void *(*startsam21pwent)(BOOL);
787   void (*endsam21pwent)(void *);
788   SMB_BIG_UINT (*getsam21pwpos)(void *);
789   BOOL (*setsam21pwpos)(void *, SMB_BIG_UINT);
790
791   /*
792    * sam password database query functions.
793    */
794   struct sam_passwd *(*getsam21pwntnam)(const char *);
795   struct sam_passwd *(*getsam21pwuid)(uid_t);
796   struct sam_passwd *(*getsam21pwrid)(uint32);
797   struct sam_passwd *(*getsam21pwent)(void *);
798
799   /*
800    * sam password database modification functions.
801    */
802   BOOL (*add_sam21pwd_entry)(struct sam_passwd *);
803   BOOL (*mod_sam21pwd_entry)(struct sam_passwd *, BOOL);
804
805   /*
806    * sam query display info functions.
807    */
808   struct sam_disp_info *(*getsamdispntnam)(const char *);
809   struct sam_disp_info *(*getsamdisprid)(uint32);
810   struct sam_disp_info *(*getsamdispent)(void *);
811
812 };
813
814 /*
815  * Each implementation of the passgrp database code needs
816  * to support the following operations.
817  */
818
819 struct passgrp_ops
820 {
821         /*
822          * Password group database ops.
823          */
824         void *(*startsmbgrpent)(BOOL);
825         void (*endsmbgrpent)(void *);
826         SMB_BIG_UINT (*getsmbgrppos)(void *);
827         BOOL (*setsmbgrppos)(void *, SMB_BIG_UINT);
828
829         /*
830          * smb passgrp database query functions, by user attributes.
831          */
832         struct smb_passwd *(*getsmbgrpntnam)(const char *, uint32**, int*, uint32**, int*);
833         struct smb_passwd *(*getsmbgrpuid)(uid_t , uint32**, int*, uint32**, int*);
834         struct smb_passwd *(*getsmbgrprid)(uint32, uint32**, int*, uint32**, int*);
835         struct smb_passwd *(*getsmbgrpent)(void *, uint32**, int*, uint32**, int*);
836 };
837
838 /*
839  * Each implementation of the group database code needs
840  * to support the following operations.
841  *
842  * This allows enumeration, modification and addition of groups.  there
843  * is _no_ deletion of groups: you can only modify them to a status of
844  * "deleted" (this by the way is a requirement of c2 rating)
845  */
846
847 struct groupdb_ops
848 {
849         /*
850          * Group database ops.
851          */
852         void *(*startgroupent)(BOOL);
853         void (*endgroupent)(void *);
854         SMB_BIG_UINT (*getgrouppos)(void *);
855         BOOL (*setgrouppos)(void *, SMB_BIG_UINT);
856
857         /*
858          * group database query functions. 
859          */
860         DOMAIN_GRP *(*getgroupntnam)(const char *, DOMAIN_GRP_MEMBER **, int *);
861         DOMAIN_GRP *(*getgroupgid)(gid_t , DOMAIN_GRP_MEMBER **, int *);
862         DOMAIN_GRP *(*getgrouprid)(uint32, DOMAIN_GRP_MEMBER **, int *);
863         DOMAIN_GRP *(*getgroupent)(void *, DOMAIN_GRP_MEMBER **, int *);
864
865         /*
866          * group database modification functions.
867          */
868         BOOL (*add_group_entry)(DOMAIN_GRP *);
869         BOOL (*mod_group_entry)(DOMAIN_GRP *);
870         BOOL (*del_group_entry)(uint32);
871
872         BOOL (*add_group_member)(uint32, uint32);
873         BOOL (*del_group_member)(uint32, uint32);
874
875         /*
876          * user group functions
877          */
878         BOOL (*getusergroupsntnam)(const char *, DOMAIN_GRP **, int *);
879 };
880
881 /*
882  * Each implementation of the alias database code needs
883  * to support the following operations.
884  *
885  * This allows enumeration, modification and addition of aliases.  there
886  * is _no_ deletion of aliases: you can only modify them to a status of
887  * "deleted" (this by the way is a requirement of c2 rating)
888  */
889
890 struct aliasdb_ops
891 {
892         /*
893          * Alias database ops.
894          */
895         void *(*startaliasent)(BOOL);
896         void (*endaliasent)(void *);
897         SMB_BIG_UINT (*getaliaspos)(void *);
898         BOOL (*setaliaspos)(void *, SMB_BIG_UINT);
899
900         /*
901          * alias database query functions. 
902          */
903         LOCAL_GRP *(*getaliasntnam)(const char *, LOCAL_GRP_MEMBER **, int *);
904         LOCAL_GRP *(*getaliasgid)(gid_t , LOCAL_GRP_MEMBER **, int *);
905         LOCAL_GRP *(*getaliasrid)(uint32, LOCAL_GRP_MEMBER **, int *);
906         LOCAL_GRP *(*getaliasent)(void *, LOCAL_GRP_MEMBER **, int *);
907
908         /*
909          * alias database modification functions.
910          */
911         BOOL (*add_alias_entry)(LOCAL_GRP *);
912         BOOL (*mod_alias_entry)(LOCAL_GRP *);
913         BOOL (*del_alias_entry)(uint32);
914
915         BOOL (*add_alias_member)(uint32, DOM_SID*);
916         BOOL (*del_alias_member)(uint32, DOM_SID*);
917
918         /*
919          * user alias functions
920          */
921         BOOL (*getuseraliasntnam)(const char *, LOCAL_GRP **, int *);
922 };
923
924 /* this is used for smbstatus */
925
926 struct connect_record
927 {
928   int magic;
929   int pid;
930   int cnum;
931   uid_t uid;
932   gid_t gid;
933   char name[24];
934   char addr[24];
935   char machine[128];
936   time_t start;
937 };
938
939 /* This is used by smbclient to send it to a smbfs mount point */
940 struct connection_options {
941   int protocol;
942   /* Connection-Options */
943   uint32 max_xmit;
944   uint16 server_vuid;
945   uint16 tid;
946   /* The following are LANMAN 1.0 options */
947   uint16 sec_mode;
948   uint16 max_mux;
949   uint16 max_vcs;
950   uint16 rawmode;
951   uint32 sesskey;
952   /* The following are NT LM 0.12 options */
953   uint32 maxraw;
954   uint32 capabilities;
955   uint16 serverzone;
956 };
957
958 /* the following are used by loadparm for option lists */
959 typedef enum
960 {
961   P_BOOL,P_BOOLREV,P_CHAR,P_INTEGER,P_OCTAL,
962   P_STRING,P_USTRING,P_GSTRING,P_UGSTRING,P_ENUM,P_PTR,P_SEP
963 } parm_type;
964
965 typedef enum
966 {
967   P_LOCAL,P_GLOBAL,P_SEPARATOR,P_NONE
968 } parm_class;
969
970 struct enum_list {
971         int value;
972         char *name;
973 };
974
975 struct parm_struct
976 {
977         char *label;
978         parm_type type;
979         parm_class class;
980         void *ptr;
981         BOOL (*special)(char *, char **);
982         struct enum_list *enum_list;
983         unsigned flags;
984         union {
985                 BOOL bvalue;
986                 int ivalue;
987                 char *svalue;
988                 char cvalue;
989         } def;
990 };
991
992 struct bitmap {
993         uint32 *b;
994         int n;
995 };
996
997 #define FLAG_BASIC 1 /* fundamental options */
998 #define FLAG_HIDE  2 /* options that should be hidden in SWAT */
999 #define FLAG_PRINT 4 /* printing options */
1000 #define FLAG_GLOBAL 8 /* local options that should be globally settable in SWAT */
1001 #define FLAG_DEPRECATED 0x10 /* options that should no longer be used */
1002
1003 #ifndef LOCKING_VERSION
1004 #define LOCKING_VERSION 4
1005 #endif /* LOCKING_VERSION */
1006
1007
1008 /* the basic packet size, assuming no words or bytes */
1009 #define smb_size 39
1010
1011 /* offsets into message for common items */
1012 #define smb_com 8
1013 #define smb_rcls 9
1014 #define smb_reh 10
1015 #define smb_err 11
1016 #define smb_flg 13
1017 #define smb_flg2 14
1018 #define smb_reb 13
1019 #define smb_tid 28
1020 #define smb_pid 30
1021 #define smb_uid 32
1022 #define smb_mid 34
1023 #define smb_wct 36
1024 #define smb_vwv 37
1025 #define smb_vwv0 37
1026 #define smb_vwv1 39
1027 #define smb_vwv2 41
1028 #define smb_vwv3 43
1029 #define smb_vwv4 45
1030 #define smb_vwv5 47
1031 #define smb_vwv6 49
1032 #define smb_vwv7 51
1033 #define smb_vwv8 53
1034 #define smb_vwv9 55
1035 #define smb_vwv10 57
1036 #define smb_vwv11 59
1037 #define smb_vwv12 61
1038 #define smb_vwv13 63
1039 #define smb_vwv14 65
1040 #define smb_vwv15 67
1041 #define smb_vwv16 69
1042 #define smb_vwv17 71
1043
1044 /* flag defines. CIFS spec 3.1.1 */
1045 #define FLAG_SUPPORT_LOCKREAD       0x01
1046 #define FLAG_CLIENT_BUF_AVAIL       0x02
1047 #define FLAG_RESERVED               0x04
1048 #define FLAG_CASELESS_PATHNAMES     0x08
1049 #define FLAG_CANONICAL_PATHNAMES    0x10
1050 #define FLAG_REQUEST_OPLOCK         0x20
1051 #define FLAG_REQUEST_BATCH_OPLOCK   0x40
1052 #define FLAG_REPLY                  0x80
1053
1054 /* the complete */
1055 #define SMBmkdir      0x00   /* create directory */
1056 #define SMBrmdir      0x01   /* delete directory */
1057 #define SMBopen       0x02   /* open file */
1058 #define SMBcreate     0x03   /* create file */
1059 #define SMBclose      0x04   /* close file */
1060 #define SMBflush      0x05   /* flush file */
1061 #define SMBunlink     0x06   /* delete file */
1062 #define SMBmv         0x07   /* rename file */
1063 #define SMBgetatr     0x08   /* get file attributes */
1064 #define SMBsetatr     0x09   /* set file attributes */
1065 #define SMBread       0x0A   /* read from file */
1066 #define SMBwrite      0x0B   /* write to file */
1067 #define SMBlock       0x0C   /* lock byte range */
1068 #define SMBunlock     0x0D   /* unlock byte range */
1069 #define SMBctemp      0x0E   /* create temporary file */
1070 #define SMBmknew      0x0F   /* make new file */
1071 #define SMBchkpth     0x10   /* check directory path */
1072 #define SMBexit       0x11   /* process exit */
1073 #define SMBlseek      0x12   /* seek */
1074 #define SMBtcon       0x70   /* tree connect */
1075 #define SMBtconX      0x75   /* tree connect and X*/
1076 #define SMBtdis       0x71   /* tree disconnect */
1077 #define SMBnegprot    0x72   /* negotiate protocol */
1078 #define SMBdskattr    0x80   /* get disk attributes */
1079 #define SMBsearch     0x81   /* search directory */
1080 #define SMBsplopen    0xC0   /* open print spool file */
1081 #define SMBsplwr      0xC1   /* write to print spool file */
1082 #define SMBsplclose   0xC2   /* close print spool file */
1083 #define SMBsplretq    0xC3   /* return print queue */
1084 #define SMBsends      0xD0   /* send single block message */
1085 #define SMBsendb      0xD1   /* send broadcast message */
1086 #define SMBfwdname    0xD2   /* forward user name */
1087 #define SMBcancelf    0xD3   /* cancel forward */
1088 #define SMBgetmac     0xD4   /* get machine name */
1089 #define SMBsendstrt   0xD5   /* send start of multi-block message */
1090 #define SMBsendend    0xD6   /* send end of multi-block message */
1091 #define SMBsendtxt    0xD7   /* send text of multi-block message */
1092
1093 /* Core+ protocol */
1094 #define SMBlockread       0x13   /* Lock a range and read */
1095 #define SMBwriteunlock 0x14 /* Unlock a range then write */
1096 #define SMBreadbraw   0x1a  /* read a block of data with no smb header */
1097 #define SMBwritebraw  0x1d  /* write a block of data with no smb header */
1098 #define SMBwritec     0x20  /* secondary write request */
1099 #define SMBwriteclose 0x2c  /* write a file then close it */
1100
1101 /* dos extended protocol */
1102 #define SMBreadBraw      0x1A   /* read block raw */
1103 #define SMBreadBmpx      0x1B   /* read block multiplexed */
1104 #define SMBreadBs        0x1C   /* read block (secondary response) */
1105 #define SMBwriteBraw     0x1D   /* write block raw */
1106 #define SMBwriteBmpx     0x1E   /* write block multiplexed */
1107 #define SMBwriteBs       0x1F   /* write block (secondary request) */
1108 #define SMBwriteC        0x20   /* write complete response */
1109 #define SMBsetattrE      0x22   /* set file attributes expanded */
1110 #define SMBgetattrE      0x23   /* get file attributes expanded */
1111 #define SMBlockingX      0x24   /* lock/unlock byte ranges and X */
1112 #define SMBtrans         0x25   /* transaction - name, bytes in/out */
1113 #define SMBtranss        0x26   /* transaction (secondary request/response) */
1114 #define SMBioctl         0x27   /* IOCTL */
1115 #define SMBioctls        0x28   /* IOCTL  (secondary request/response) */
1116 #define SMBcopy          0x29   /* copy */
1117 #define SMBmove          0x2A   /* move */
1118 #define SMBecho          0x2B   /* echo */
1119 #define SMBopenX         0x2D   /* open and X */
1120 #define SMBreadX         0x2E   /* read and X */
1121 #define SMBwriteX        0x2F   /* write and X */
1122 #define SMBsesssetupX    0x73   /* Session Set Up & X (including User Logon) */
1123 #define SMBffirst        0x82   /* find first */
1124 #define SMBfunique       0x83   /* find unique */
1125 #define SMBfclose        0x84   /* find close */
1126 #define SMBinvalid       0xFE   /* invalid command */
1127
1128 /* Extended 2.0 protocol */
1129 #define SMBtrans2        0x32   /* TRANS2 protocol set */
1130 #define SMBtranss2       0x33   /* TRANS2 protocol set, secondary command */
1131 #define SMBfindclose     0x34   /* Terminate a TRANSACT2_FINDFIRST */
1132 #define SMBfindnclose    0x35   /* Terminate a TRANSACT2_FINDNOTIFYFIRST */
1133 #define SMBulogoffX      0x74   /* user logoff */
1134
1135 /* NT SMB extensions. */
1136 #define SMBnttrans       0xA0   /* NT transact */
1137 #define SMBnttranss      0xA1   /* NT transact secondary */
1138 #define SMBntcreateX     0xA2   /* NT create and X */
1139 #define SMBntcancel      0xA4   /* NT cancel */
1140
1141 /* These are the TRANS2 sub commands */
1142 #define TRANSACT2_OPEN                        0
1143 #define TRANSACT2_FINDFIRST                   1
1144 #define TRANSACT2_FINDNEXT                    2
1145 #define TRANSACT2_QFSINFO                     3
1146 #define TRANSACT2_SETFSINFO                   4
1147 #define TRANSACT2_QPATHINFO                   5
1148 #define TRANSACT2_SETPATHINFO                 6
1149 #define TRANSACT2_QFILEINFO                   7
1150 #define TRANSACT2_SETFILEINFO                 8
1151 #define TRANSACT2_FSCTL                       9
1152 #define TRANSACT2_IOCTL                     0xA
1153 #define TRANSACT2_FINDNOTIFYFIRST           0xB
1154 #define TRANSACT2_FINDNOTIFYNEXT            0xC
1155 #define TRANSACT2_MKDIR                     0xD
1156 #define TRANSACT2_SESSION_SETUP             0xE
1157 #define TRANSACT2_GET_DFS_REFERRAL         0x10
1158 #define TRANSACT2_REPORT_DFS_INCONSISTANCY 0x11
1159
1160 /* These are the NT transact sub commands. */
1161 #define NT_TRANSACT_CREATE                 1
1162 #define NT_TRANSACT_IOCTL                  2
1163 #define NT_TRANSACT_SET_SECURITY_DESC      3
1164 #define NT_TRANSACT_NOTIFY_CHANGE          4
1165 #define NT_TRANSACT_RENAME                 5
1166 #define NT_TRANSACT_QUERY_SECURITY_DESC    6
1167 #define NT_TRANSACT_GET_DFS_REFERRAL    0x10
1168
1169 /* these are the trans2 sub fields for primary requests */
1170 #define smb_tpscnt smb_vwv0
1171 #define smb_tdscnt smb_vwv1
1172 #define smb_mprcnt smb_vwv2
1173 #define smb_mdrcnt smb_vwv3
1174 #define smb_msrcnt smb_vwv4
1175 #define smb_flags smb_vwv5
1176 #define smb_timeout smb_vwv6
1177 #define smb_pscnt smb_vwv9
1178 #define smb_psoff smb_vwv10
1179 #define smb_dscnt smb_vwv11
1180 #define smb_dsoff smb_vwv12
1181 #define smb_suwcnt smb_vwv13
1182 #define smb_setup smb_vwv14
1183 #define smb_setup0 smb_setup
1184 #define smb_setup1 (smb_setup+2)
1185 #define smb_setup2 (smb_setup+4)
1186
1187 /* these are for the secondary requests */
1188 #define smb_spscnt smb_vwv2
1189 #define smb_spsoff smb_vwv3
1190 #define smb_spsdisp smb_vwv4
1191 #define smb_sdscnt smb_vwv5
1192 #define smb_sdsoff smb_vwv6
1193 #define smb_sdsdisp smb_vwv7
1194 #define smb_sfid smb_vwv8
1195
1196 /* and these for responses */
1197 #define smb_tprcnt smb_vwv0
1198 #define smb_tdrcnt smb_vwv1
1199 #define smb_prcnt smb_vwv3
1200 #define smb_proff smb_vwv4
1201 #define smb_prdisp smb_vwv5
1202 #define smb_drcnt smb_vwv6
1203 #define smb_droff smb_vwv7
1204 #define smb_drdisp smb_vwv8
1205
1206 /* these are for the NT trans primary request. */
1207 #define smb_nt_MaxSetupCount smb_vwv0
1208 #define smb_nt_Flags (smb_vwv0 + 1)
1209 #define smb_nt_TotalParameterCount (smb_vwv0 + 3)
1210 #define smb_nt_TotalDataCount (smb_vwv0 + 7)
1211 #define smb_nt_MaxParameterCount (smb_vwv0 + 11)
1212 #define smb_nt_MaxDataCount (smb_vwv0 + 15)
1213 #define smb_nt_ParameterCount (smb_vwv0 + 19)
1214 #define smb_nt_ParameterOffset (smb_vwv0 + 23)
1215 #define smb_nt_DataCount (smb_vwv0 + 27)
1216 #define smb_nt_DataOffset (smb_vwv0 + 31)
1217 #define smb_nt_SetupCount (smb_vwv0 + 35)
1218 #define smb_nt_Function (smb_vwv0 + 36)
1219 #define smb_nt_SetupStart (smb_vwv0 + 38)
1220
1221 /* these are for the NT trans secondary request. */
1222 #define smb_nts_TotalParameterCount (smb_vwv0 + 3)
1223 #define smb_nts_TotalDataCount (smb_vwv0 + 7)
1224 #define smb_nts_ParameterCount (smb_vwv0 + 11)
1225 #define smb_nts_ParameterOffset (smb_vwv0 + 15)
1226 #define smb_nts_ParameterDisplacement (smb_vwv0 + 19)
1227 #define smb_nts_DataCount (smb_vwv0 + 23)
1228 #define smb_nts_DataOffset (smb_vwv0 + 27)
1229 #define smb_nts_DataDisplacement (smb_vwv0 + 31)
1230
1231 /* these are for the NT trans reply. */
1232 #define smb_ntr_TotalParameterCount (smb_vwv0 + 3)
1233 #define smb_ntr_TotalDataCount (smb_vwv0 + 7)
1234 #define smb_ntr_ParameterCount (smb_vwv0 + 11)
1235 #define smb_ntr_ParameterOffset (smb_vwv0 + 15)
1236 #define smb_ntr_ParameterDisplacement (smb_vwv0 + 19)
1237 #define smb_ntr_DataCount (smb_vwv0 + 23)
1238 #define smb_ntr_DataOffset (smb_vwv0 + 27)
1239 #define smb_ntr_DataDisplacement (smb_vwv0 + 31)
1240
1241 /* these are for the NT create_and_X */
1242 #define smb_ntcreate_NameLength (smb_vwv0 + 5)
1243 #define smb_ntcreate_Flags (smb_vwv0 + 7)
1244 #define smb_ntcreate_RootDirectoryFid (smb_vwv0 + 11)
1245 #define smb_ntcreate_DesiredAccess (smb_vwv0 + 15)
1246 #define smb_ntcreate_AllocationSize (smb_vwv0 + 19)
1247 #define smb_ntcreate_FileAttributes (smb_vwv0 + 27)
1248 #define smb_ntcreate_ShareAccess (smb_vwv0 + 31)
1249 #define smb_ntcreate_CreateDisposition (smb_vwv0 + 35)
1250 #define smb_ntcreate_CreateOptions (smb_vwv0 + 39)
1251 #define smb_ntcreate_ImpersonationLevel (smb_vwv0 + 43)
1252 #define smb_ntcreate_SecurityFlags (smb_vwv0 + 47)
1253
1254 /* this is used on a TConX. I'm not sure the name is very helpful though */
1255 #define SMB_SUPPORT_SEARCH_BITS        0x0001
1256
1257 /* these are the constants used in the above call. */
1258 /* DesiredAccess */
1259 /* File Specific access rights. */
1260 #define FILE_READ_DATA        0x001
1261 #define FILE_WRITE_DATA       0x002
1262 #define FILE_APPEND_DATA      0x004
1263 #define FILE_READ_EA          0x008
1264 #define FILE_WRITE_EA         0x010
1265 #define FILE_EXECUTE          0x020
1266 #define FILE_DELETE_CHILD     0x040
1267 #define FILE_READ_ATTRIBUTES  0x080
1268 #define FILE_WRITE_ATTRIBUTES 0x100
1269  
1270 /* Generic access masks & rights. */
1271 #define SPECIFIC_RIGHTS_MASK 0x00FFFFL
1272 #define STANDARD_RIGHTS_MASK 0xFF0000L
1273 #define DELETE_ACCESS        (1L<<16)
1274 #define READ_CONTROL_ACCESS  (1L<<17)
1275 #define WRITE_DAC_ACCESS     (1L<<18)
1276 #define WRITE_OWNER_ACCESS   (1L<<19)
1277 #define SYNCHRONIZE_ACCESS   (1L<<20)
1278 #define SYSTEM_SECURITY_ACCESS (1L<<24)
1279
1280 /* Flags field. */
1281 #define REQUEST_OPLOCK 2
1282 #define REQUEST_BATCH_OPLOCK 4
1283 #define OPEN_DIRECTORY 8
1284
1285 /* ShareAccess field. */
1286 #define FILE_SHARE_NONE 0 /* Cannot be used in bitmask. */
1287 #define FILE_SHARE_READ 1
1288 #define FILE_SHARE_WRITE 2
1289 #define FILE_SHARE_DELETE 4
1290
1291 /* FileAttributesField */
1292 #define FILE_ATTRIBUTE_READONLY aRONLY
1293 #define FILE_ATTRIBUTE_HIDDEN aHIDDEN
1294 #define FILE_ATTRIBUTE_SYSTEM aSYSTEM
1295 #define FILE_ATTRIBUTE_DIRECTORY aDIR
1296 #define FILE_ATTRIBUTE_ARCHIVE aARCH
1297 #define FILE_ATTRIBUTE_NORMAL 0x80L
1298 #define FILE_ATTRIBUTE_TEMPORARY 0x100L
1299 #define FILE_ATTRIBUTE_COMPRESSED 0x800L
1300 #define SAMBA_ATTRIBUTES_MASK 0x7F
1301
1302 /* Flags - combined with attributes. */
1303 #define FILE_FLAG_WRITE_THROUGH    0x80000000L
1304 #define FILE_FLAG_NO_BUFFERING     0x20000000L
1305 #define FILE_FLAG_RANDOM_ACCESS    0x10000000L
1306 #define FILE_FLAG_SEQUENTIAL_SCAN  0x08000000L
1307 #define FILE_FLAG_DELETE_ON_CLOSE  0x04000000L
1308 #define FILE_FLAG_BACKUP_SEMANTICS 0x02000000L
1309 #define FILE_FLAG_POSIX_SEMANTICS  0x01000000L
1310
1311 /* CreateDisposition field. */
1312 #define FILE_SUPERSEDE 0
1313 #define FILE_OPEN 1
1314 #define FILE_CREATE 2
1315 #define FILE_OPEN_IF 3
1316 #define FILE_OVERWRITE 4
1317 #define FILE_OVERWRITE_IF 5
1318
1319 /* CreateOptions field. */
1320 #define FILE_DIRECTORY_FILE       0x0001
1321 #define FILE_WRITE_THROUGH        0x0002
1322 #define FILE_SEQUENTIAL_ONLY      0x0004
1323 #define FILE_NON_DIRECTORY_FILE   0x0040
1324 #define FILE_NO_EA_KNOWLEDGE      0x0200
1325 #define FILE_EIGHT_DOT_THREE_ONLY 0x0400
1326 #define FILE_RANDOM_ACCESS        0x0800
1327 #define FILE_DELETE_ON_CLOSE      0x1000
1328
1329 /* Responses when opening a file. */
1330 #define FILE_WAS_OPENED 1
1331 #define FILE_WAS_CREATED 2
1332 #define FILE_WAS_OVERWRITTEN 3
1333
1334 /* File type flags */
1335 #define FILE_TYPE_DISK  0
1336 #define FILE_TYPE_BYTE_MODE_PIPE 1
1337 #define FILE_TYPE_MESSAGE_MODE_PIPE 2
1338 #define FILE_TYPE_PRINTER 3
1339 #define FILE_TYPE_COMM_DEVICE 4
1340 #define FILE_TYPE_UNKNOWN 0xFFFF
1341
1342 /* Flag for NT transact rename call. */
1343 #define RENAME_REPLACE_IF_EXISTS 1
1344
1345 /* Filesystem Attributes. */
1346 #define FILE_CASE_SENSITIVE_SEARCH 0x1
1347 #define FILE_CASE_PRESERVED_NAMES 0x2
1348 #define FILE_UNICODE_ON_DISK 0x4
1349 #define FILE_PERISITANT_ACLS 0x8
1350
1351 /* ChangeNotify flags. */
1352 #define FILE_NOTIFY_CHANGE_FILE_NAME   0x001
1353 #define FILE_NOTIFY_CHANGE_DIR_NAME    0x002
1354 #define FILE_NOTIFY_CHANGE_ATTRIBUTES  0x004
1355 #define FILE_NOTIFY_CHANGE_SIZE        0x008
1356 #define FILE_NOTIFY_CHANGE_LAST_WRITE  0x010
1357 #define FILE_NOTIFY_CHANGE_LAST_ACCESS 0x020
1358 #define FILE_NOTIFY_CHANGE_CREATION    0x040
1359 #define FILE_NOTIFY_CHANGE_EA          0x080
1360 #define FILE_NOTIFY_CHANGE_SECURITY    0x100
1361
1362 /* where to find the base of the SMB packet proper */
1363 #define smb_base(buf) (((char *)(buf))+4)
1364
1365
1366 #define SMB_SUCCESS 0  /* The request was successful. */
1367 #define ERRDOS 0x01 /*  Error is from the core DOS operating system set. */
1368 #define ERRSRV 0x02  /* Error is generated by the server network file manager.*/
1369 #define ERRHRD 0x03  /* Error is an hardware error. */
1370 #define ERRCMD 0xFF  /* Command was not in the "SMB" format. */
1371
1372 #ifdef HAVE_STDARG_H
1373 int slprintf(char *str, int n, char *format, ...)
1374 #ifdef __GNUC__
1375      __attribute__ ((format (printf, 3, 4)))
1376 #endif
1377 ;
1378 #else
1379 int slprintf();
1380 #endif
1381
1382 #ifdef WITH_DFS
1383 void dfs_unlogin(void);
1384 extern int dcelogin_atmost_once;
1385 #endif
1386
1387 #ifdef NOSTRDUP
1388 char *strdup(char *s);
1389 #endif
1390
1391 #ifndef SIGNAL_CAST
1392 #define SIGNAL_CAST (RETSIGTYPE (*)(int))
1393 #endif
1394
1395 #ifndef SELECT_CAST
1396 #define SELECT_CAST
1397 #endif
1398
1399
1400 /* Some POSIX definitions for those without */
1401  
1402 #ifndef S_IFDIR
1403 #define S_IFDIR         0x4000
1404 #endif
1405 #ifndef S_ISDIR
1406 #define S_ISDIR(mode)   ((mode & 0xF000) == S_IFDIR)
1407 #endif
1408 #ifndef S_IRWXU
1409 #define S_IRWXU 00700           /* read, write, execute: owner */
1410 #endif
1411 #ifndef S_IRUSR
1412 #define S_IRUSR 00400           /* read permission: owner */
1413 #endif
1414 #ifndef S_IWUSR
1415 #define S_IWUSR 00200           /* write permission: owner */
1416 #endif
1417 #ifndef S_IXUSR
1418 #define S_IXUSR 00100           /* execute permission: owner */
1419 #endif
1420 #ifndef S_IRWXG
1421 #define S_IRWXG 00070           /* read, write, execute: group */
1422 #endif
1423 #ifndef S_IRGRP
1424 #define S_IRGRP 00040           /* read permission: group */
1425 #endif
1426 #ifndef S_IWGRP
1427 #define S_IWGRP 00020           /* write permission: group */
1428 #endif
1429 #ifndef S_IXGRP
1430 #define S_IXGRP 00010           /* execute permission: group */
1431 #endif
1432 #ifndef S_IRWXO
1433 #define S_IRWXO 00007           /* read, write, execute: other */
1434 #endif
1435 #ifndef S_IROTH
1436 #define S_IROTH 00004           /* read permission: other */
1437 #endif
1438 #ifndef S_IWOTH
1439 #define S_IWOTH 00002           /* write permission: other */
1440 #endif
1441 #ifndef S_IXOTH
1442 #define S_IXOTH 00001           /* execute permission: other */
1443 #endif
1444
1445
1446 /* these are used in NetServerEnum to choose what to receive */
1447 #define SV_TYPE_WORKSTATION         0x00000001
1448 #define SV_TYPE_SERVER              0x00000002
1449 #define SV_TYPE_SQLSERVER           0x00000004
1450 #define SV_TYPE_DOMAIN_CTRL         0x00000008
1451 #define SV_TYPE_DOMAIN_BAKCTRL      0x00000010
1452 #define SV_TYPE_TIME_SOURCE         0x00000020
1453 #define SV_TYPE_AFP                 0x00000040
1454 #define SV_TYPE_NOVELL              0x00000080
1455 #define SV_TYPE_DOMAIN_MEMBER       0x00000100
1456 #define SV_TYPE_PRINTQ_SERVER       0x00000200
1457 #define SV_TYPE_DIALIN_SERVER       0x00000400
1458 #define SV_TYPE_SERVER_UNIX         0x00000800
1459 #define SV_TYPE_NT                  0x00001000
1460 #define SV_TYPE_WFW                 0x00002000
1461 #define SV_TYPE_SERVER_MFPN         0x00004000
1462 #define SV_TYPE_SERVER_NT           0x00008000
1463 #define SV_TYPE_POTENTIAL_BROWSER   0x00010000
1464 #define SV_TYPE_BACKUP_BROWSER      0x00020000
1465 #define SV_TYPE_MASTER_BROWSER      0x00040000
1466 #define SV_TYPE_DOMAIN_MASTER       0x00080000
1467 #define SV_TYPE_SERVER_OSF          0x00100000
1468 #define SV_TYPE_SERVER_VMS          0x00200000
1469 #define SV_TYPE_WIN95_PLUS          0x00400000
1470 #define SV_TYPE_ALTERNATE_XPORT     0x20000000  
1471 #define SV_TYPE_LOCAL_LIST_ONLY     0x40000000  
1472 #define SV_TYPE_DOMAIN_ENUM         0x80000000
1473 #define SV_TYPE_ALL                 0xFFFFFFFF  
1474
1475 /* what server type are we currently  - JHT Says we ARE 4.20 */
1476 /* this was set by JHT in liaison with Jeremy Allison early 1997 */
1477 /* setting to 4.20 at same time as announcing ourselves as NT Server */
1478 /* History: */
1479 /* Version 4.0 - never made public */
1480 /* Version 4.10 - New to 1.9.16p2, lost in space 1.9.16p3 to 1.9.16p9 */
1481 /*              - Reappeared in 1.9.16p11 with fixed smbd services */
1482 /* Version 4.20 - To indicate that nmbd and browsing now works better */
1483
1484 #define DEFAULT_MAJOR_VERSION 0x04
1485 #define DEFAULT_MINOR_VERSION 0x02
1486
1487 /* Browser Election Values */
1488 #define BROWSER_ELECTION_VERSION        0x010f
1489 #define BROWSER_CONSTANT        0xaa55
1490
1491 /* NT Flags2 bits - cifs6.txt section 3.1.2 */
1492    
1493 #define FLAGS2_LONG_PATH_COMPONENTS   0x0001
1494 #define FLAGS2_EXTENDED_ATTRIBUTES    0x0002
1495 #define FLAGS2_DFS_PATHNAMES          0x1000
1496 #define FLAGS2_READ_PERMIT_NO_EXECUTE 0x2000
1497 #define FLAGS2_32_BIT_ERROR_CODES     0x4000 
1498 #define FLAGS2_UNICODE_STRINGS        0x8000
1499
1500 /* Capabilities.  see ftp.microsoft.com/developr/drg/cifs/cifs/cifs4.txt */
1501
1502 #define CAP_RAW_MODE         0x0001
1503 #define CAP_MPX_MODE         0x0002
1504 #define CAP_UNICODE          0x0004
1505 #define CAP_LARGE_FILES      0x0008
1506 #define CAP_NT_SMBS          0x0010
1507 #define CAP_RPC_REMOTE_APIS  0x0020
1508 #define CAP_STATUS32         0x0040
1509 #define CAP_LEVEL_II_OPLOCKS 0x0080
1510 #define CAP_LOCK_AND_READ    0x0100
1511 #define CAP_NT_FIND          0x0200
1512 #define CAP_DFS              0x1000
1513 #define CAP_LARGE_READX      0x4000
1514
1515 /* protocol types. It assumes that higher protocols include lower protocols
1516    as subsets */
1517 enum protocol_types {PROTOCOL_NONE,PROTOCOL_CORE,PROTOCOL_COREPLUS,PROTOCOL_LANMAN1,PROTOCOL_LANMAN2,PROTOCOL_NT1};
1518
1519 /* security levels */
1520 enum security_types {SEC_SHARE,SEC_USER,SEC_SERVER,SEC_DOMAIN};
1521
1522 /* server roles */
1523 enum server_types
1524 {
1525         ROLE_DOMAIN_NONE,
1526         ROLE_DOMAIN_MEMBER,
1527         ROLE_DOMAIN_BDC,
1528         ROLE_DOMAIN_PDC
1529 };
1530
1531 /* printing types */
1532 enum printing_types {PRINT_BSD,PRINT_SYSV,PRINT_AIX,PRINT_HPUX,
1533                      PRINT_QNX,PRINT_PLP,PRINT_LPRNG,PRINT_SOFTQ};
1534
1535 /* Remote architectures we know about. */
1536 enum remote_arch_types {RA_UNKNOWN, RA_WFWG, RA_OS2, RA_WIN95, RA_WINNT, RA_SAMBA};
1537
1538 /* case handling */
1539 enum case_handling {CASE_LOWER,CASE_UPPER};
1540
1541 #ifdef WITH_SSL
1542 /* SSL version options */
1543 enum ssl_version_enum {SMB_SSL_V2,SMB_SSL_V3,SMB_SSL_V23,SMB_SSL_TLS1};
1544 #endif /* WITH_SSL */
1545
1546 /*
1547  * Global value meaing that the smb_uid field should be
1548  * ingored (in share level security and protocol level == CORE)
1549  */
1550
1551 #define UID_FIELD_INVALID 0
1552 #define VUID_OFFSET 100 /* Amount to bias returned vuid numbers */
1553
1554 /* Defines needed for multi-codepage support. */
1555 #define MSDOS_LATIN_1_CODEPAGE 850
1556 #define KANJI_CODEPAGE 932
1557 #define HANGUL_CODEPAGE 949
1558 #define BIG5_CODEPAGE 950
1559 #define SIMPLIFIED_CHINESE_CODEPAGE 936
1560
1561 #ifdef KANJI
1562 /* 
1563  * Default client code page - Japanese 
1564  */
1565 #define DEFAULT_CLIENT_CODE_PAGE KANJI_CODEPAGE
1566 #else /* KANJI */
1567 /* 
1568  * Default client code page - 850 - Western European 
1569  */
1570 #define DEFAULT_CLIENT_CODE_PAGE MSDOS_LATIN_1_CODEPAGE
1571 #endif /* KANJI */
1572
1573 /* 
1574  * Size of buffer to use when moving files across filesystems. 
1575  */
1576 #define COPYBUF_SIZE (8*1024)
1577
1578 /* 
1579  * Integers used to override error codes. 
1580  */
1581 extern int unix_ERR_class;
1582 extern int unix_ERR_code;
1583
1584 /*
1585  * Map the Core and Extended Oplock requesst bits down
1586  * to common bits (EXCLUSIVE_OPLOCK & BATCH_OPLOCK).
1587  */
1588
1589 /*
1590  * Core protocol.
1591  */
1592 #define CORE_OPLOCK_REQUEST(inbuf) \
1593     ((CVAL(inbuf,smb_flg)&(FLAG_REQUEST_OPLOCK|FLAG_REQUEST_BATCH_OPLOCK))>>5)
1594
1595 /*
1596  * Extended protocol.
1597  */
1598 #define EXTENDED_OPLOCK_REQUEST(inbuf) ((SVAL(inbuf,smb_vwv2)&((1<<1)|(1<<2)))>>1)
1599
1600 /* Lock types. */
1601 #define LOCKING_ANDX_SHARED_LOCK 0x1
1602 #define LOCKING_ANDX_OPLOCK_RELEASE 0x2
1603 #define LOCKING_ANDX_CHANGE_LOCKTYPE 0x4
1604 #define LOCKING_ANDX_CANCEL_LOCK 0x8
1605 #define LOCKING_ANDX_LARGE_FILES 0x10
1606
1607 /* Oplock levels */
1608 #define OPLOCKLEVEL_NONE 0
1609 #define OPLOCKLEVEL_II 1
1610
1611 /*
1612  * Bits we test with.
1613  */
1614 #define EXCLUSIVE_OPLOCK 1
1615 #define BATCH_OPLOCK 2
1616
1617 #define CORE_OPLOCK_GRANTED (1<<5)
1618 #define EXTENDED_OPLOCK_GRANTED (1<<15)
1619
1620 /*
1621  * Loopback command offsets.
1622  */
1623
1624 #define OPBRK_CMD_LEN_OFFSET 0
1625 #define OPBRK_CMD_PORT_OFFSET 4
1626 #define OPBRK_CMD_HEADER_LEN 6
1627
1628 #define OPBRK_MESSAGE_CMD_OFFSET 0
1629
1630 /*
1631  * Oplock break command code to send over the udp socket.
1632  * 
1633  * Form of this is :
1634  *
1635  *  0     2       6        10       14    14+devsize 14+devsize+inodesize
1636  *  +----+--------+--------+--------+-------+--------+
1637  *  | cmd| pid    | sec    | usec   | dev   |  inode |
1638  *  +----+--------+--------+--------+-------+--------+
1639  */
1640
1641 #define OPLOCK_BREAK_CMD 0x1
1642 #define OPLOCK_BREAK_PID_OFFSET 2
1643 #define OPLOCK_BREAK_SEC_OFFSET 6
1644 #define OPLOCK_BREAK_USEC_OFFSET 10
1645 #define OPLOCK_BREAK_DEV_OFFSET 14
1646 #define OPLOCK_BREAK_INODE_OFFSET (OPLOCK_BREAK_DEV_OFFSET + sizeof(SMB_DEV_T))
1647 #define OPLOCK_BREAK_MSG_LEN (OPLOCK_BREAK_INODE_OFFSET + sizeof(SMB_INO_T))
1648
1649 /*
1650  * Capabilities abstracted for different systems.
1651  */
1652
1653 #define KERNEL_OPLOCK_CAPABILITY 0x1
1654
1655 #if defined(HAVE_KERNEL_OPLOCKS)
1656 /*
1657  * Oplock break command code sent via the kernel interface.
1658  *
1659  * Form of this is :
1660  *
1661  *  0     2       2+devsize 2+devsize+inodesize
1662  *  +----+--------+--------+
1663  *  | cmd| dev    |  inode |
1664  *  +----+--------+--------+
1665  */
1666
1667 #define KERNEL_OPLOCK_BREAK_CMD 0x2
1668 #define KERNEL_OPLOCK_BREAK_DEV_OFFSET 2
1669 #define KERNEL_OPLOCK_BREAK_INODE_OFFSET (KERNEL_OPLOCK_BREAK_DEV_OFFSET + sizeof(SMB_DEV_T))
1670 #define KERNEL_OPLOCK_BREAK_MSG_LEN (KERNEL_OPLOCK_BREAK_INODE_OFFSET + sizeof(SMB_INO_T))
1671
1672 #endif /* HAVE_KERNEL_OPLOCKS */
1673
1674 #define CMD_REPLY 0x8000
1675
1676 #include "smb_macros.h"
1677
1678 #include "nt_printing.h"
1679 #include "ntdomain.h"
1680
1681 /* A netbios name structure. */
1682 struct nmb_name {
1683   char         name[17];
1684   char         scope[64];
1685   unsigned int name_type;
1686 };
1687
1688 #include "client.h"
1689 #include "rpcclient.h"
1690
1691 #include "dfs.h"
1692
1693 /*
1694  * Size of new password account encoding string. DO NOT CHANGE.
1695  */
1696
1697 #define NEW_PW_FORMAT_SPACE_PADDED_LEN 14
1698
1699 /*
1700    Do you want session setups at user level security with a invalid
1701    password to be rejected or allowed in as guest? WinNT rejects them
1702    but it can be a pain as it means "net view" needs to use a password
1703
1704    You have 3 choices in the setting of map_to_guest:
1705
1706    "NEVER_MAP_TO_GUEST" means session setups with an invalid password
1707    are rejected. This is the default.
1708
1709    "MAP_TO_GUEST_ON_BAD_USER" means session setups with an invalid password
1710    are rejected, unless the username does not exist, in which case it
1711    is treated as a guest login
1712
1713    "MAP_TO_GUEST_ON_BAD_PASSWORD" means session setups with an invalid password
1714    are treated as a guest login
1715
1716    Note that map_to_guest only has an effect in user or server
1717    level security.
1718 */
1719
1720 #define NEVER_MAP_TO_GUEST 0
1721 #define MAP_TO_GUEST_ON_BAD_USER 1
1722 #define MAP_TO_GUEST_ON_BAD_PASSWORD 2
1723
1724 /* associate bit field or enumeration field with a string */
1725 struct field_info
1726 {
1727         uint32 bits;
1728         char *str;
1729 };
1730
1731 #endif /* _SMB_H */
1732
1733 /* _SMB_H */