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#if defined(LARGE_SMB_OFF_T)
28#define BUFFER_SIZE (128*1024)
29#else /* no large readwrite possible */
30#define BUFFER_SIZE (0xFFFF)
31#endif
32
33#define SAFETY_MARGIN 1024
34#define LARGE_WRITEX_HDR_SIZE 65
35
36#define NMB_PORT 137
37#define DGRAM_PORT 138
38#define SMB_PORT 139
39
40#define False (0)
41#define True (1)
42#define BOOLSTR(b) ((b) ? "Yes" : "No")
43#define BITSETB(ptr,bit) ((((char *)ptr)[0] & (1<<(bit)))!=0)
44#define BITSETW(ptr,bit) ((SVAL(ptr,0) & (1<<(bit)))!=0)
45
46#define IS_BITS_SET_ALL(var,bit) (((var)&(bit))==(bit))
47#define IS_BITS_SET_SOME(var,bit) (((var)&(bit))!=0)
48#define IS_BITS_CLR_ALL(var,bit) (((var)&(bit))==0)
49
50#define PTR_DIFF(p1,p2) ((ptrdiff_t)(((const char *)(p1)) - (const char *)(p2)))
51
52typedef int BOOL;
53
54/* limiting size of ipc replies */
55#define REALLOC(ptr,size) Realloc(ptr,MAX((size),4*1024))
56
57#define SIZEOFWORD 2
58
59#ifndef DEF_CREATE_MASK
60#define DEF_CREATE_MASK (0755)
61#endif
62
63/* how long to wait for secondary SMB packets (milli-seconds) */
64#define SMB_SECONDARY_WAIT (60*1000)
65
66/* -------------------------------------------------------------------------- **
67 * Debugging code.  See also debug.c
68 */
69
70/* mkproto.awk has trouble with ifdef'd function definitions (it ignores
71 * the #ifdef directive and will read both definitions, thus creating two
72 * diffferent prototype declarations), so we must do these by hand.
73 */
74/* I know the __attribute__ stuff is ugly, but it does ensure we get the
75   arguemnts to DEBUG() right. We have got them wrong too often in the
76   past */
77#ifdef HAVE_STDARG_H
78int  Debug1( char *, ... )
79#ifdef __GNUC__
80     __attribute__ ((format (printf, 1, 2)))
81#endif
82;
83BOOL dbgtext( char *, ... )
84#ifdef __GNUC__
85     __attribute__ ((format (printf, 1, 2)))
86#endif
87;
88#else
89int  Debug1();
90BOOL dbgtext();
91#endif
92
93/* If we have these macros, we can add additional info to the header. */
94#ifdef HAVE_FILE_MACRO
95#define FILE_MACRO (__FILE__)
96#else
97#define FILE_MACRO ("")
98#endif
99
100#ifdef HAVE_FUNCTION_MACRO
101#define FUNCTION_MACRO  (__FUNCTION__)
102#else
103#define FUNCTION_MACRO  ("")
104#endif
105
106/* Debugging macros.
107 *  DEBUGLVL() - If level is <= the system-wide DEBUGLEVEL then generate a
108 *               header using the default macros for file, line, and
109 *               function name.
110 *               Returns True if the debug level was <= DEBUGLEVEL.
111 *               Example usage:
112 *                 if( DEBUGLVL( 2 ) )
113 *                   dbgtext( "Some text.\n" );
114 *  DEGUG()    - Good old DEBUG().  Each call to DEBUG() will generate a new
115 *               header *unless* the previous debug output was unterminated
116 *               (i.e., no '\n').  See debug.c:dbghdr() for more info.
117 *               Example usage:
118 *                 DEBUG( 2, ("Some text.\n") );
119 *  DEBUGADD() - If level <= DEBUGLEVEL, then the text is appended to the
120 *               current message (i.e., no header).
121 *               Usage:
122 *                 DEBUGADD( 2, ("Some additional text.\n") );
123 */
124
125#ifdef NDEBUG
126
127#define DEBUGLVL( level ) \
128  ( (0 == (level)) \
129   && dbghdr( level, FILE_MACRO, FUNCTION_MACRO, (__LINE__) ) )
130
131#define DEBUG( level, body ) \
132  (void)( (0 == (level)) \
133       && (dbghdr( level, FILE_MACRO, FUNCTION_MACRO, (__LINE__) )) \
134       && (dbgtext body) )
135
136#define DEBUGADD( level, body )	\
137  (void)( (0 == (level)) && (dbgtext body) )
138
139#else
140#define DEBUGLVL( level ) \
141  ( (DEBUGLEVEL >= (level)) \
142   && dbghdr( level, FILE_MACRO, FUNCTION_MACRO, (__LINE__) ) )
143
144#if 0
145
146#define DEBUG( level, body ) \
147  ( ( DEBUGLEVEL >= (level) \
148   && dbghdr( level, FILE_MACRO, FUNCTION_MACRO, (__LINE__) ) ) \
149      ? (void)(dbgtext body) : (void)0 )
150
151#define DEBUGADD( level, body ) \
152     ( (DEBUGLEVEL >= (level)) ? (void)(dbgtext body) : (void)0 )
153
154#else
155
156#define DEBUG( level, body ) \
157  (void)( (DEBUGLEVEL >= (level)) \
158       && (dbghdr( level, FILE_MACRO, FUNCTION_MACRO, (__LINE__) )) \
159       && (dbgtext body) )
160
161#define DEBUGADD( level, body ) \
162  (void)( (DEBUGLEVEL >= (level)) && (dbgtext body) )
163
164#endif
165#endif
166/* End Debugging code section.
167 * -------------------------------------------------------------------------- **
168 */
169
170/* this defines the error codes that receive_smb can put in smb_read_error */
171#define READ_TIMEOUT 1
172#define READ_EOF 2
173#define READ_ERROR 3
174
175
176#define DIR_STRUCT_SIZE 43
177
178/* these define all the command types recognised by the server - there
179are lots of gaps so probably there are some rare commands that are not
180implemented */
181
182#define pSETDIR '\377'
183
184/* these define the attribute byte as seen by DOS */
185#define aRONLY (1L<<0)
186#define aHIDDEN (1L<<1)
187#define aSYSTEM (1L<<2)
188#define aVOLID (1L<<3)
189#define aDIR (1L<<4)
190#define aARCH (1L<<5)
191
192/* for readability... */
193#define IS_DOS_READONLY(test_mode) (((test_mode) & aRONLY) != 0)
194#define IS_DOS_DIR(test_mode) (((test_mode) & aDIR) != 0)
195#define IS_DOS_ARCHIVE(test_mode) (((test_mode) & aARCH) != 0)
196#define IS_DOS_SYSTEM(test_mode) (((test_mode) & aSYSTEM) != 0)
197#define IS_DOS_HIDDEN(test_mode) (((test_mode) & aHIDDEN) != 0)
198
199/* deny modes */
200#define DENY_DOS 0
201#define DENY_ALL 1
202#define DENY_WRITE 2
203#define DENY_READ 3
204#define DENY_NONE 4
205#define DENY_FCB 7
206
207/* open modes */
208#define DOS_OPEN_RDONLY 0
209#define DOS_OPEN_WRONLY 1
210#define DOS_OPEN_RDWR 2
211#define DOS_OPEN_FCB 0xF
212
213/* define shifts and masks for share and open modes. */
214#define OPEN_MODE_MASK 0xF
215#define SHARE_MODE_SHIFT 4
216#define SHARE_MODE_MASK 0x7
217#define GET_OPEN_MODE(x) ((x) & OPEN_MODE_MASK)
218#define SET_OPEN_MODE(x) ((x) & OPEN_MODE_MASK)
219#define GET_DENY_MODE(x) (((x)>>SHARE_MODE_SHIFT) & SHARE_MODE_MASK)
220#define SET_DENY_MODE(x) ((x)<<SHARE_MODE_SHIFT)
221
222/* Sync on open file (not sure if used anymore... ?) */
223#define FILE_SYNC_OPENMODE (1<<14)
224#define GET_FILE_SYNC_OPENMODE(x) (((x) & FILE_SYNC_OPENMODE) ? True : False)
225
226/* allow delete on open file mode (used by NT SMB's). */
227#define ALLOW_SHARE_DELETE (1<<15)
228#define GET_ALLOW_SHARE_DELETE(x) (((x) & ALLOW_SHARE_DELETE) ? True : False)
229#define SET_ALLOW_SHARE_DELETE(x) ((x) ? ALLOW_SHARE_DELETE : 0)
230
231/* delete on close flag (used by NT SMB's). */
232#define DELETE_ON_CLOSE_FLAG (1<<16)
233#define GET_DELETE_ON_CLOSE_FLAG(x) (((x) & DELETE_ON_CLOSE_FLAG) ? True : False)
234#define SET_DELETE_ON_CLOSE_FLAG(x) ((x) ? DELETE_ON_CLOSE_FLAG : 0)
235
236/* open disposition values */
237#define FILE_EXISTS_FAIL 0
238#define FILE_EXISTS_OPEN 1
239#define FILE_EXISTS_TRUNCATE 2
240
241/* mask for open disposition. */
242#define FILE_OPEN_MASK 0x3
243
244#define GET_FILE_OPEN_DISPOSITION(x) ((x) & FILE_OPEN_MASK)
245#define SET_FILE_OPEN_DISPOSITION(x) ((x) & FILE_OPEN_MASK)
246
247/* The above can be OR'ed with... */
248#define FILE_CREATE_IF_NOT_EXIST 0x10
249#define FILE_FAIL_IF_NOT_EXIST 0
250
251#define GET_FILE_CREATE_DISPOSITION(x) ((x) & (FILE_CREATE_IF_NOT_EXIST|FILE_FAIL_IF_NOT_EXIST))
252
253/* share types */
254#define STYPE_DISKTREE  0	/* Disk drive */
255#define STYPE_PRINTQ    1	/* Spooler queue */
256#define STYPE_DEVICE    2	/* Serial device */
257#define STYPE_IPC       3	/* Interprocess communication (IPC) */
258#define STYPE_HIDDEN    0x80000000 /* share is a hidden one (ends with $) */
259
260/* SMB X/Open error codes for the ERRDOS error class */
261#define ERRbadfunc 1 /* Invalid function (or system call) */
262#define ERRbadfile 2 /* File not found (pathname error) */
263#define ERRbadpath 3 /* Directory not found */
264#define ERRnofids 4 /* Too many open files */
265#define ERRnoaccess 5 /* Access denied */
266#define ERRbadfid 6 /* Invalid fid */
267#define ERRnomem 8 /* Out of memory */
268#define ERRbadmem 9 /* Invalid memory block address */
269#define ERRbadenv 10 /* Invalid environment */
270#define ERRbadaccess 12 /* Invalid open mode */
271#define ERRbaddata 13 /* Invalid data (only from ioctl call) */
272#define ERRres 14 /* reserved */
273#define ERRbaddrive 15 /* Invalid drive */
274#define ERRremcd 16 /* Attempt to delete current directory */
275#define ERRdiffdevice 17 /* rename/move across different filesystems */
276#define ERRnofiles 18 /* no more files found in file search */
277#define ERRbadshare 32 /* Share mode on file conflict with open mode */
278#define ERRlock 33 /* Lock request conflicts with existing lock */
279#define ERRunsup 50 /* Request unsupported, returned by Win 95, RJS 20Jun98 */
280#define ERRfilexists 80 /* File in operation already exists */
281#define ERRinvalidparam 87
282#define ERRcannotopen 110 /* Cannot open the file specified */
283#define ERRunknownlevel 124
284#define ERRrename 183
285#define ERRbadpipe 230 /* Named pipe invalid */
286#define ERRpipebusy 231 /* All instances of pipe are busy */
287#define ERRpipeclosing 232 /* named pipe close in progress */
288#define ERRnotconnected 233 /* No process on other end of named pipe */
289#define ERRmoredata 234 /* More data to be returned */
290#define ERRbaddirectory 267 /* Invalid directory name in a path. */
291#define ERROR_EAS_DIDNT_FIT 275 /* Extended attributes didn't fit */
292#define ERROR_EAS_NOT_SUPPORTED 282 /* Extended attributes not supported */
293#define ERROR_NOTIFY_ENUM_DIR 1022 /* Buffer too small to return change notify. */
294#define ERRunknownipc 2142
295
296
297/* here's a special one from observing NT */
298#define ERRnoipc 66 /* don't support ipc */
299
300/* Error codes for the ERRSRV class */
301
302#define ERRerror 1 /* Non specific error code */
303#define ERRbadpw 2 /* Bad password */
304#define ERRbadtype 3 /* reserved */
305#define ERRaccess 4 /* No permissions to do the requested operation */
306#define ERRinvnid 5 /* tid invalid */
307#define ERRinvnetname 6 /* Invalid servername */
308#define ERRinvdevice 7 /* Invalid device */
309#define ERRqfull 49 /* Print queue full */
310#define ERRqtoobig 50 /* Queued item too big */
311#define ERRinvpfid 52 /* Invalid print file in smb_fid */
312#define ERRsmbcmd 64 /* Unrecognised command */
313#define ERRsrverror 65 /* smb server internal error */
314#define ERRfilespecs 67 /* fid and pathname invalid combination */
315#define ERRbadlink 68 /* reserved */
316#define ERRbadpermits 69 /* Access specified for a file is not valid */
317#define ERRbadpid 70 /* reserved */
318#define ERRsetattrmode 71 /* attribute mode invalid */
319#define ERRpaused 81 /* Message server paused */
320#define ERRmsgoff 82 /* Not receiving messages */
321#define ERRnoroom 83 /* No room for message */
322#define ERRrmuns 87 /* too many remote usernames */
323#define ERRtimeout 88 /* operation timed out */
324#define ERRnoresource  89 /* No resources currently available for request. */
325#define ERRtoomanyuids 90 /* too many userids */
326#define ERRbaduid 91 /* bad userid */
327#define ERRuseMPX 250 /* temporarily unable to use raw mode, use MPX mode */
328#define ERRuseSTD 251 /* temporarily unable to use raw mode, use standard mode */
329#define ERRcontMPX 252 /* resume MPX mode */
330#define ERRbadPW /* reserved */
331#define ERRnosupport 0xFFFF
332#define ERRunknownsmb 22 /* from NT 3.5 response */
333
334
335/* Error codes for the ERRHRD class */
336
337#define ERRnowrite 19 /* read only media */
338#define ERRbadunit 20 /* Unknown device */
339#define ERRnotready 21 /* Drive not ready */
340#define ERRbadcmd 22 /* Unknown command */
341#define ERRdata 23 /* Data (CRC) error */
342#define ERRbadreq 24 /* Bad request structure length */
343#define ERRseek 25
344#define ERRbadmedia 26
345#define ERRbadsector 27
346#define ERRnopaper 28
347#define ERRwrite 29 /* write fault */
348#define ERRread 30 /* read fault */
349#define ERRgeneral 31 /* General hardware failure */
350#define ERRwrongdisk 34
351#define ERRFCBunavail 35
352#define ERRsharebufexc 36 /* share buffer exceeded */
353#define ERRdiskfull 39
354
355
356typedef char pstring[1024];
357typedef char fstring[128];
358
359/*
360 * SMB UCS2 (16-bit unicode) internal type.
361 */
362
363typedef uint16 smb_ucs2_t;
364
365/* ucs2 string types. */
366typedef smb_ucs2_t wpstring[1024];
367typedef smb_ucs2_t wfstring[128];
368
369/* pipe string names */
370#define PIPE_LANMAN   "\\PIPE\\LANMAN"
371#define PIPE_SRVSVC   "\\PIPE\\srvsvc"
372#define PIPE_SAMR     "\\PIPE\\samr"
373#define PIPE_WINREG   "\\PIPE\\winreg"
374#define PIPE_WKSSVC   "\\PIPE\\wkssvc"
375#define PIPE_NETLOGON "\\PIPE\\NETLOGON"
376#define PIPE_NTLSA    "\\PIPE\\ntlsa"
377#define PIPE_NTSVCS   "\\PIPE\\ntsvcs"
378#define PIPE_LSASS    "\\PIPE\\lsass"
379#define PIPE_LSARPC   "\\PIPE\\lsarpc"
380
381
382/* 64 bit time (100usec) since ????? - cifs6.txt, section 3.5, page 30 */
383typedef struct nttime_info
384{
385  uint32 low;
386  uint32 high;
387
388} NTTIME;
389
390/* Allowable account control bits */
391#define ACB_DISABLED   0x0001  /* 1 = User account disabled */
392#define ACB_HOMDIRREQ  0x0002  /* 1 = Home directory required */
393#define ACB_PWNOTREQ   0x0004  /* 1 = User password not required */
394#define ACB_TEMPDUP    0x0008  /* 1 = Temporary duplicate account */
395#define ACB_NORMAL     0x0010  /* 1 = Normal user account */
396#define ACB_MNS        0x0020  /* 1 = MNS logon user account */
397#define ACB_DOMTRUST   0x0040  /* 1 = Interdomain trust account */
398#define ACB_WSTRUST    0x0080  /* 1 = Workstation trust account */
399#define ACB_SVRTRUST   0x0100  /* 1 = Server trust account */
400#define ACB_PWNOEXP    0x0200  /* 1 = User password does not expire */
401#define ACB_AUTOLOCK   0x0400  /* 1 = Account auto locked */
402
403#define MAX_HOURS_LEN 32
404
405struct sam_passwd
406{
407	time_t logon_time;            /* logon time */
408	time_t logoff_time;           /* logoff time */
409	time_t kickoff_time;          /* kickoff time */
410	time_t pass_last_set_time;    /* password last set time */
411	time_t pass_can_change_time;  /* password can change time */
412	time_t pass_must_change_time; /* password must change time */
413
414	char *smb_name;     /* username string */
415	char *full_name;    /* user's full name string */
416	char *home_dir;     /* home directory string */
417	char *dir_drive;    /* home directory drive string */
418	char *logon_script; /* logon script string */
419	char *profile_path; /* profile path string */
420	char *acct_desc  ;  /* user description string */
421	char *workstations; /* login from workstations string */
422	char *unknown_str ; /* don't know what this is, yet. */
423	char *munged_dial ; /* munged path name and dial-back tel number */
424
425	uid_t smb_userid;       /* this is actually the unix uid_t */
426	gid_t smb_grpid;        /* this is actually the unix gid_t */
427	uint32 user_rid;      /* Primary User ID */
428	uint32 group_rid;     /* Primary Group ID */
429
430	unsigned char *smb_passwd; /* Null if no password */
431	unsigned char *smb_nt_passwd; /* Null if no password */
432
433	uint16 acct_ctrl; /* account info (ACB_xxxx bit-mask) */
434	uint32 unknown_3; /* 0x00ff ffff */
435
436	uint16 logon_divs; /* 168 - number of hours in a week */
437	uint32 hours_len; /* normally 21 bytes */
438	uint8 hours[MAX_HOURS_LEN];
439
440	uint32 unknown_5; /* 0x0002 0000 */
441	uint32 unknown_6; /* 0x0000 04ec */
442};
443
444struct smb_passwd
445{
446	uid_t smb_userid;     /* this is actually the unix uid_t */
447	char *smb_name;     /* username string */
448
449	unsigned char *smb_passwd; /* Null if no password */
450	unsigned char *smb_nt_passwd; /* Null if no password */
451
452	uint16 acct_ctrl; /* account info (ACB_xxxx bit-mask) */
453	time_t pass_last_set_time;    /* password last set time */
454};
455
456
457struct sam_disp_info
458{
459	uint32 user_rid;      /* Primary User ID */
460	char *smb_name;     /* username string */
461	char *full_name;    /* user's full name string */
462};
463
464#define MAXSUBAUTHS 15 /* max sub authorities in a SID */
465
466/* DOM_SID - security id */
467typedef struct sid_info
468{
469  uint8  sid_rev_num;             /* SID revision number */
470  uint8  num_auths;               /* number of sub-authorities */
471  uint8  id_auth[6];              /* Identifier Authority */
472  /*
473   * Note that the values in these uint32's are in *native* byteorder,
474   * not neccessarily little-endian...... JRA.
475   */
476  uint32 sub_auths[MAXSUBAUTHS];  /* pointer to sub-authorities. */
477
478} DOM_SID;
479
480
481/*** query a local group, get a list of these: shows who is in that group ***/
482
483/* local group member info */
484typedef struct local_grp_member_info
485{
486	DOM_SID sid    ; /* matches with name */
487	uint8   sid_use; /* usr=1 grp=2 dom=3 alias=4 wkng=5 del=6 inv=7 unk=8 */
488	fstring name   ; /* matches with sid: must be of the form "DOMAIN\account" */
489
490} LOCAL_GRP_MEMBER;
491
492/* enumerate these to get list of local groups */
493
494/* local group info */
495typedef struct local_grp_info
496{
497	fstring name;
498	fstring comment;
499
500} LOCAL_GRP;
501
502/*** enumerate these to get list of domain groups ***/
503
504/* domain group member info */
505typedef struct domain_grp_info
506{
507	fstring name;
508	fstring comment;
509	uint32  rid; /* group rid */
510	uint8   attr; /* attributes forced to be set to 0x7: SE_GROUP_xxx */
511
512} DOMAIN_GRP;
513
514/*** query a domain group, get a list of these: shows who is in that group ***/
515
516/* domain group info */
517typedef struct domain_grp_member_info
518{
519	fstring name;
520	uint8   attr; /* attributes forced to be set to 0x7: SE_GROUP_xxx */
521
522} DOMAIN_GRP_MEMBER;
523
524/* DOM_CHAL - challenge info */
525typedef struct chal_info
526{
527  uchar data[8]; /* credentials */
528} DOM_CHAL;
529
530/* 32 bit time (sec) since 01jan1970 - cifs6.txt, section 3.5, page 30 */
531typedef struct time_info
532{
533  uint32 time;
534} UTIME;
535
536/* DOM_CREDs - timestamped client or server credentials */
537typedef struct cred_info
538{
539  DOM_CHAL challenge; /* credentials */
540  UTIME timestamp;    /* credential time-stamp */
541} DOM_CRED;
542
543/* Structure used when SMBwritebmpx is active */
544typedef struct
545{
546  size_t wr_total_written; /* So we know when to discard this */
547  int32 wr_timeout;
548  int32 wr_errclass;
549  int32 wr_error; /* Cached errors */
550  BOOL  wr_mode; /* write through mode) */
551  BOOL  wr_discard; /* discard all further data */
552} write_bmpx_struct;
553
554/*
555 * Structure used to indirect fd's from the files_struct.
556 * Needed as POSIX locking is based on file and process, not
557 * file descriptor and process.
558 */
559
560typedef struct file_fd_struct
561{
562	struct file_fd_struct *next, *prev;
563	uint16 ref_count;
564	uint16 uid_cache_count;
565	uid_t uid_users_cache[10];
566	SMB_DEV_T dev;
567	SMB_INO_T inode;
568	int fd;
569	int fd_readonly;
570	int fd_writeonly;
571	int real_open_flags;
572	BOOL delete_on_close;
573} file_fd_struct;
574
575/*
576 * Structure used to keep directory state information around.
577 * Used in NT change-notify code.
578 */
579
580typedef struct
581{
582  time_t modify_time;
583  time_t status_time;
584} dir_status_struct;
585
586struct uid_cache {
587  int entries;
588  uid_t list[UID_CACHE_SIZE];
589};
590
591typedef struct
592{
593  char *name;
594  BOOL is_wild;
595} name_compare_entry;
596
597typedef struct connection_struct
598{
599	struct connection_struct *next, *prev;
600	unsigned cnum; /* an index passed over the wire */
601	int service;
602	BOOL force_user;
603	struct uid_cache uid_cache;
604	void *dirptr;
605	BOOL printer;
606	BOOL ipc;
607	BOOL read_only;
608	BOOL admin_user;
609	char *dirpath;
610	char *connectpath;
611	char *origpath;
612	char *user; /* name of user who *opened* this connection */
613	uid_t uid; /* uid of user who *opened* this connection */
614	gid_t gid; /* gid of user who *opened* this connection */
615	char client_address[18]; /* String version of client IP address. */
616
617	uint16 vuid; /* vuid of user who *opened* this connection, or UID_FIELD_INVALID */
618
619	/* following groups stuff added by ih */
620
621	/* This groups info is valid for the user that *opened* the connection */
622	int ngroups;
623	gid_t *groups;
624
625	time_t lastused;
626	BOOL used;
627	int num_files_open;
628	name_compare_entry *hide_list; /* Per-share list of files to return as hidden. */
629	name_compare_entry *veto_list; /* Per-share list of files to veto (never show). */
630	name_compare_entry *veto_oplock_list; /* Per-share list of files to refuse oplocks on. */
631
632} connection_struct;
633
634struct current_user
635{
636	connection_struct *conn;
637	uint16 vuid;
638	uid_t uid;
639	gid_t gid;
640	int ngroups;
641	gid_t *groups;
642};
643
644typedef struct write_cache
645{
646    SMB_OFF_T file_size;
647    SMB_OFF_T offset;
648    size_t alloc_size;
649    size_t data_size;
650    char *data;
651} write_cache;
652
653/*
654 * Reasons for cache flush.
655 */
656
657#define NUM_FLUSH_REASONS 8 /* Keep this in sync with the enum below. */
658enum flush_reason_enum { SEEK_FLUSH, READ_FLUSH, WRITE_FLUSH, READRAW_FLUSH,
659                         OPLOCK_RELEASE_FLUSH, CLOSE_FLUSH, SYNC_FLUSH, SIZECHANGE_FLUSH };
660
661typedef struct files_struct
662{
663	struct files_struct *next, *prev;
664	int fnum;
665	connection_struct *conn;
666	file_fd_struct *fd_ptr;
667	SMB_OFF_T pos;
668	SMB_OFF_T size;
669	mode_t mode;
670	uint16 vuid;
671	write_bmpx_struct *wbmpx_ptr;
672    write_cache *wcp;
673	struct timeval open_time;
674	int share_mode;
675	time_t pending_modtime;
676	int oplock_type;
677	int sent_oplock_break;
678	BOOL open;
679	BOOL can_lock;
680	BOOL can_read;
681	BOOL can_write;
682	BOOL print_file;
683	BOOL modified;
684	BOOL is_directory;
685	BOOL directory_delete_on_close;
686	BOOL stat_open;
687	char *fsp_name;
688} files_struct;
689
690/* Defines for the sent_oplock_break field above. */
691#define NO_BREAK_SENT 0
692#define EXCLUSIVE_BREAK_SENT 1
693#define LEVEL_II_BREAK_SENT 2
694
695/* Domain controller authentication protocol info */
696struct dcinfo
697{
698  DOM_CHAL clnt_chal; /* Initial challenge received from client */
699  DOM_CHAL srv_chal;  /* Initial server challenge */
700  DOM_CRED clnt_cred; /* Last client credential */
701  DOM_CRED srv_cred;  /* Last server credential */
702
703  uchar  sess_key[8]; /* Session key */
704  uchar  md4pw[16];   /* md4(machine password) */
705};
706
707typedef struct
708{
709  uid_t uid; /* uid of a validated user */
710  gid_t gid; /* gid of a validated user */
711
712  fstring requested_name; /* user name from the client */
713  fstring name; /* unix user name of a validated user */
714  fstring real_name;   /* to store real name from password file - simeon */
715  BOOL guest;
716
717  /* following groups stuff added by ih */
718  /* This groups info is needed for when we become_user() for this uid */
719  int n_groups;
720  gid_t *groups;
721
722  int n_sids;
723  int *sids;
724
725  /* per-user authentication information on NT RPCs */
726  struct dcinfo dc;
727
728} user_struct;
729
730
731enum {LPQ_QUEUED,LPQ_PAUSED,LPQ_SPOOLING,LPQ_PRINTING};
732
733typedef struct
734{
735  int job;
736  int size;
737  int status;
738  int priority;
739  time_t time;
740  char user[30];
741  char file[100];
742} print_queue_struct;
743
744enum {LPSTAT_OK, LPSTAT_STOPPED, LPSTAT_ERROR};
745
746typedef struct
747{
748  fstring message;
749  int status;
750}  print_status_struct;
751
752/* used for server information: client, nameserv and ipc */
753struct server_info_struct
754{
755  fstring name;
756  uint32 type;
757  fstring comment;
758  fstring domain; /* used ONLY in ipc.c NOT namework.c */
759  BOOL server_added; /* used ONLY in ipc.c NOT namework.c */
760};
761
762
763/* used for network interfaces */
764struct interface
765{
766	struct interface *next, *prev;
767	struct in_addr ip;
768	struct in_addr bcast;
769	struct in_addr nmask;
770};
771
772/* struct returned by get_share_modes */
773typedef struct
774{
775  pid_t pid;
776  uint16 op_port;
777  uint16 op_type;
778  int share_mode;
779  struct timeval time;
780} share_mode_entry;
781
782
783/* each implementation of the share mode code needs
784   to support the following operations */
785struct share_ops {
786	BOOL (*stop_mgmt)(void);
787	BOOL (*lock_entry)(connection_struct *, SMB_DEV_T , SMB_INO_T , int *);
788	BOOL (*unlock_entry)(connection_struct *, SMB_DEV_T , SMB_INO_T , int );
789	int (*get_entries)(connection_struct *, int , SMB_DEV_T , SMB_INO_T , share_mode_entry **);
790	void (*del_entry)(int , files_struct *);
791	BOOL (*set_entry)(int, files_struct *, uint16 , uint16 );
792    BOOL (*mod_entry)(int, files_struct *, void (*)(share_mode_entry *, SMB_DEV_T, SMB_INO_T, void *), void *);
793	int (*forall)(void (*)(share_mode_entry *, char *));
794	void (*status)(FILE *);
795};
796
797/* each implementation of the shared memory code needs
798   to support the following operations */
799struct shmem_ops {
800	BOOL (*shm_close)( void );
801	int (*shm_alloc)(int );
802	BOOL (*shm_free)(int );
803	int (*get_userdef_off)(void);
804	void *(*offset2addr)(int );
805	int (*addr2offset)(void *addr);
806	BOOL (*lock_hash_entry)(unsigned int);
807	BOOL (*unlock_hash_entry)( unsigned int );
808	BOOL (*get_usage)(int *,int *,int *);
809	unsigned (*hash_size)(void);
810};
811
812/*
813 * Each implementation of the password database code needs
814 * to support the following operations.
815 */
816
817struct passdb_ops {
818  /*
819   * Password database ops.
820   */
821  void *(*startsmbpwent)(BOOL);
822  void (*endsmbpwent)(void *);
823  SMB_BIG_UINT (*getsmbpwpos)(void *);
824  BOOL (*setsmbpwpos)(void *, SMB_BIG_UINT);
825
826  /*
827   * smb password database query functions.
828   */
829  struct smb_passwd *(*getsmbpwnam)(char *);
830  struct smb_passwd *(*getsmbpwuid)(uid_t);
831  struct smb_passwd *(*getsmbpwrid)(uint32);
832  struct smb_passwd *(*getsmbpwent)(void *);
833
834  /*
835   * smb password database modification functions.
836   */
837  BOOL (*add_smbpwd_entry)(struct smb_passwd *);
838  BOOL (*mod_smbpwd_entry)(struct smb_passwd *, BOOL);
839  BOOL (*del_smbpwd_entry)(const char *);
840
841  /*
842   * Functions that manupulate a struct sam_passwd.
843   */
844  struct sam_passwd *(*getsam21pwent)(void *);
845
846  /*
847   * sam password database query functions.
848   */
849  struct sam_passwd *(*getsam21pwnam)(char *);
850  struct sam_passwd *(*getsam21pwuid)(uid_t);
851  struct sam_passwd *(*getsam21pwrid)(uint32);
852
853  /*
854   * sam password database modification functions.
855   */
856  BOOL (*add_sam21pwd_entry)(struct sam_passwd *);
857  BOOL (*mod_sam21pwd_entry)(struct sam_passwd *, BOOL);
858
859  /*
860   * sam query display info functions.
861   */
862  struct sam_disp_info *(*getsamdispnam)(char *);
863  struct sam_disp_info *(*getsamdisprid)(uint32);
864  struct sam_disp_info *(*getsamdispent)(void *);
865
866#if 0
867  /*
868   * password checking functions
869   */
870  struct smb_passwd *(*smb_password_chal  )(char *username, char lm_pass[24], char nt_pass[24], char chal[8]);
871  struct smb_passwd *(*smb_password_check )(char *username, char lm_hash[16], char nt_hash[16]);
872  struct passwd     *(*unix_password_check)(char *username, char *pass, int pass_len);
873#endif
874};
875
876/*
877 * Flags for local user manipulation.
878 */
879
880#define LOCAL_ADD_USER 0x1
881#define LOCAL_DELETE_USER 0x2
882#define LOCAL_DISABLE_USER 0x4
883#define LOCAL_ENABLE_USER 0x8
884#define LOCAL_TRUST_ACCOUNT 0x10
885#define LOCAL_SET_NO_PASSWORD 0x20
886
887/* this is used for smbstatus */
888
889struct connect_record
890{
891  int magic;
892  pid_t pid;
893  int cnum;
894  uid_t uid;
895  gid_t gid;
896  char name[24];
897  char addr[24];
898  char machine[128];
899  time_t start;
900};
901
902/* the following are used by loadparm for option lists */
903typedef enum
904{
905  P_BOOL,P_BOOLREV,P_CHAR,P_INTEGER,P_OCTAL,
906  P_STRING,P_USTRING,P_GSTRING,P_UGSTRING,P_ENUM,P_SEP
907} parm_type;
908
909typedef enum
910{
911  P_LOCAL,P_GLOBAL,P_SEPARATOR,P_NONE
912} parm_class;
913
914/* passed to br lock code */
915enum brl_type {READ_LOCK, WRITE_LOCK};
916
917struct enum_list {
918	int value;
919	char *name;
920};
921
922struct parm_struct
923{
924	char *label;
925	parm_type type;
926	parm_class class;
927	void *ptr;
928	BOOL (*special)(char *, char **);
929	struct enum_list *enum_list;
930	unsigned flags;
931	union {
932		BOOL bvalue;
933		int ivalue;
934		char *svalue;
935		char cvalue;
936	} def;
937};
938
939struct bitmap {
940	uint32 *b;
941	int n;
942};
943
944#define FLAG_BASIC 	0x01 /* fundamental options */
945#define FLAG_SHARE 	0x02 /* file sharing options */
946#define FLAG_PRINT 	0x04 /* printing options */
947#define FLAG_GLOBAL 	0x08 /* local options that should be globally settable in SWAT */
948#define FLAG_DEPRECATED 0x10 /* options that should no longer be used */
949#define FLAG_HIDE  	0x20 /* options that should be hidden in SWAT */
950#define FLAG_DOS_STRING 0x40 /* convert from UNIX to DOS codepage when reading this string. */
951
952#ifndef LOCKING_VERSION
953#define LOCKING_VERSION 4
954#endif /* LOCKING_VERSION */
955
956/* these are useful macros for checking validity of handles */
957#define OPEN_FSP(fsp)    ((fsp) && (fsp)->open && !(fsp)->is_directory)
958#define OPEN_CONN(conn)    ((conn) && (conn)->open)
959#define IS_IPC(conn)       ((conn) && (conn)->ipc)
960#define IS_PRINT(conn)       ((conn) && (conn)->printer)
961#define FNUM_OK(fsp,c) (OPEN_FSP(fsp) && (c)==(fsp)->conn)
962
963#define CHECK_FSP(fsp,conn) if (!FNUM_OK(fsp,conn)) \
964                               return(ERROR(ERRDOS,ERRbadfid)); \
965                            else if((fsp)->fd_ptr == NULL) \
966                               return(ERROR(ERRDOS,ERRbadaccess))
967
968#define CHECK_READ(fsp) if (!(fsp)->can_read) \
969                               return(ERROR(ERRDOS,ERRbadaccess))
970#define CHECK_WRITE(fsp) if (!(fsp)->can_write) \
971                               return(ERROR(ERRDOS,ERRbadaccess))
972#define CHECK_ERROR(fsp) if (HAS_CACHED_ERROR(fsp)) \
973                               return(CACHED_ERROR(fsp))
974
975/* translates a connection number into a service number */
976#define SNUM(conn)         ((conn)?(conn)->service:-1)
977
978/* access various service details */
979#define SERVICE(snum)      (lp_servicename(snum))
980#define PRINTCAP           (lp_printcapname())
981#define PRINTCOMMAND(snum) (lp_printcommand(snum))
982#define PRINTERNAME(snum)  (lp_printername(snum))
983#define CAN_WRITE(conn)    (!conn->read_only)
984#define VALID_SNUM(snum)   (lp_snum_ok(snum))
985#define GUEST_OK(snum)     (VALID_SNUM(snum) && lp_guest_ok(snum))
986#define GUEST_ONLY(snum)   (VALID_SNUM(snum) && lp_guest_only(snum))
987#define CAN_SETDIR(snum)   (!lp_no_set_dir(snum))
988#define CAN_PRINT(conn)    ((conn) && lp_print_ok((conn)->service))
989#define MAP_HIDDEN(conn)   ((conn) && lp_map_hidden((conn)->service))
990#define MAP_SYSTEM(conn)   ((conn) && lp_map_system((conn)->service))
991#define MAP_ARCHIVE(conn)   ((conn) && lp_map_archive((conn)->service))
992#define IS_HIDDEN_PATH(conn,path)  ((conn) && is_in_path((path),(conn)->hide_list))
993#define IS_VETO_PATH(conn,path)  ((conn) && is_in_path((path),(conn)->veto_list))
994#define IS_VETO_OPLOCK_PATH(conn,path)  ((conn) && is_in_path((path),(conn)->veto_oplock_list))
995
996/*
997 * Used by the stat cache code to check if a returned
998 * stat structure is valid.
999 */
1000
1001#define VALID_STAT(st) (st.st_nlink != 0)
1002#define VALID_STAT_OF_DIR(st) (VALID_STAT(st) && S_ISDIR(st.st_mode))
1003
1004#define SMBENCRYPT()       (lp_encrypted_passwords())
1005
1006/* the basic packet size, assuming no words or bytes */
1007#define smb_size 39
1008
1009/* offsets into message for common items */
1010#define smb_com 8
1011#define smb_rcls 9
1012#define smb_reh 10
1013#define smb_err 11
1014#define smb_flg 13
1015#define smb_flg2 14
1016#define smb_reb 13
1017#define smb_tid 28
1018#define smb_pid 30
1019#define smb_uid 32
1020#define smb_mid 34
1021#define smb_wct 36
1022#define smb_vwv 37
1023#define smb_vwv0 37
1024#define smb_vwv1 39
1025#define smb_vwv2 41
1026#define smb_vwv3 43
1027#define smb_vwv4 45
1028#define smb_vwv5 47
1029#define smb_vwv6 49
1030#define smb_vwv7 51
1031#define smb_vwv8 53
1032#define smb_vwv9 55
1033#define smb_vwv10 57
1034#define smb_vwv11 59
1035#define smb_vwv12 61
1036#define smb_vwv13 63
1037#define smb_vwv14 65
1038#define smb_vwv15 67
1039#define smb_vwv16 69
1040#define smb_vwv17 71
1041
1042/* flag defines. CIFS spec 3.1.1 */
1043#define FLAG_SUPPORT_LOCKREAD       0x01
1044#define FLAG_CLIENT_BUF_AVAIL       0x02
1045#define FLAG_RESERVED               0x04
1046#define FLAG_CASELESS_PATHNAMES     0x08
1047#define FLAG_CANONICAL_PATHNAMES    0x10
1048#define FLAG_REQUEST_OPLOCK         0x20
1049#define FLAG_REQUEST_BATCH_OPLOCK   0x40
1050#define FLAG_REPLY                  0x80
1051
1052/* the complete */
1053#define SMBmkdir      0x00   /* create directory */
1054#define SMBrmdir      0x01   /* delete directory */
1055#define SMBopen       0x02   /* open file */
1056#define SMBcreate     0x03   /* create file */
1057#define SMBclose      0x04   /* close file */
1058#define SMBflush      0x05   /* flush file */
1059#define SMBunlink     0x06   /* delete file */
1060#define SMBmv         0x07   /* rename file */
1061#define SMBgetatr     0x08   /* get file attributes */
1062#define SMBsetatr     0x09   /* set file attributes */
1063#define SMBread       0x0A   /* read from file */
1064#define SMBwrite      0x0B   /* write to file */
1065#define SMBlock       0x0C   /* lock byte range */
1066#define SMBunlock     0x0D   /* unlock byte range */
1067#define SMBctemp      0x0E   /* create temporary file */
1068#define SMBmknew      0x0F   /* make new file */
1069#define SMBchkpth     0x10   /* check directory path */
1070#define SMBexit       0x11   /* process exit */
1071#define SMBlseek      0x12   /* seek */
1072#define SMBtcon       0x70   /* tree connect */
1073#define SMBtconX      0x75   /* tree connect and X*/
1074#define SMBtdis       0x71   /* tree disconnect */
1075#define SMBnegprot    0x72   /* negotiate protocol */
1076#define SMBdskattr    0x80   /* get disk attributes */
1077#define SMBsearch     0x81   /* search directory */
1078#define SMBsplopen    0xC0   /* open print spool file */
1079#define SMBsplwr      0xC1   /* write to print spool file */
1080#define SMBsplclose   0xC2   /* close print spool file */
1081#define SMBsplretq    0xC3   /* return print queue */
1082#define SMBsends      0xD0   /* send single block message */
1083#define SMBsendb      0xD1   /* send broadcast message */
1084#define SMBfwdname    0xD2   /* forward user name */
1085#define SMBcancelf    0xD3   /* cancel forward */
1086#define SMBgetmac     0xD4   /* get machine name */
1087#define SMBsendstrt   0xD5   /* send start of multi-block message */
1088#define SMBsendend    0xD6   /* send end of multi-block message */
1089#define SMBsendtxt    0xD7   /* send text of multi-block message */
1090
1091/* Core+ protocol */
1092#define SMBlockread	  0x13   /* Lock a range and read */
1093#define SMBwriteunlock 0x14 /* Unlock a range then write */
1094#define SMBreadbraw   0x1a  /* read a block of data with no smb header */
1095#define SMBwritebraw  0x1d  /* write a block of data with no smb header */
1096#define SMBwritec     0x20  /* secondary write request */
1097#define SMBwriteclose 0x2c  /* write a file then close it */
1098
1099/* dos extended protocol */
1100#define SMBreadBraw      0x1A   /* read block raw */
1101#define SMBreadBmpx      0x1B   /* read block multiplexed */
1102#define SMBreadBs        0x1C   /* read block (secondary response) */
1103#define SMBwriteBraw     0x1D   /* write block raw */
1104#define SMBwriteBmpx     0x1E   /* write block multiplexed */
1105#define SMBwriteBs       0x1F   /* write block (secondary request) */
1106#define SMBwriteC        0x20   /* write complete response */
1107#define SMBsetattrE      0x22   /* set file attributes expanded */
1108#define SMBgetattrE      0x23   /* get file attributes expanded */
1109#define SMBlockingX      0x24   /* lock/unlock byte ranges and X */
1110#define SMBtrans         0x25   /* transaction - name, bytes in/out */
1111#define SMBtranss        0x26   /* transaction (secondary request/response) */
1112#define SMBioctl         0x27   /* IOCTL */
1113#define SMBioctls        0x28   /* IOCTL  (secondary request/response) */
1114#define SMBcopy          0x29   /* copy */
1115#define SMBmove          0x2A   /* move */
1116#define SMBecho          0x2B   /* echo */
1117#define SMBopenX         0x2D   /* open and X */
1118#define SMBreadX         0x2E   /* read and X */
1119#define SMBwriteX        0x2F   /* write and X */
1120#define SMBsesssetupX    0x73   /* Session Set Up & X (including User Logon) */
1121#define SMBffirst        0x82   /* find first */
1122#define SMBfunique       0x83   /* find unique */
1123#define SMBfclose        0x84   /* find close */
1124#define SMBinvalid       0xFE   /* invalid command */
1125
1126/* Extended 2.0 protocol */
1127#define SMBtrans2        0x32   /* TRANS2 protocol set */
1128#define SMBtranss2       0x33   /* TRANS2 protocol set, secondary command */
1129#define SMBfindclose     0x34   /* Terminate a TRANSACT2_FINDFIRST */
1130#define SMBfindnclose    0x35   /* Terminate a TRANSACT2_FINDNOTIFYFIRST */
1131#define SMBulogoffX      0x74   /* user logoff */
1132
1133/* NT SMB extensions. */
1134#define SMBnttrans       0xA0   /* NT transact */
1135#define SMBnttranss      0xA1   /* NT transact secondary */
1136#define SMBntcreateX     0xA2   /* NT create and X */
1137#define SMBntcancel      0xA4   /* NT cancel */
1138
1139/* These are the TRANS2 sub commands */
1140#define TRANSACT2_OPEN                        0
1141#define TRANSACT2_FINDFIRST                   1
1142#define TRANSACT2_FINDNEXT                    2
1143#define TRANSACT2_QFSINFO                     3
1144#define TRANSACT2_SETFSINFO                   4
1145#define TRANSACT2_QPATHINFO                   5
1146#define TRANSACT2_SETPATHINFO                 6
1147#define TRANSACT2_QFILEINFO                   7
1148#define TRANSACT2_SETFILEINFO                 8
1149#define TRANSACT2_FSCTL                       9
1150#define TRANSACT2_IOCTL                     0xA
1151#define TRANSACT2_FINDNOTIFYFIRST           0xB
1152#define TRANSACT2_FINDNOTIFYNEXT            0xC
1153#define TRANSACT2_MKDIR                     0xD
1154#define TRANSACT2_SESSION_SETUP             0xE
1155#define TRANSACT2_GET_DFS_REFERRAL         0x10
1156#define TRANSACT2_REPORT_DFS_INCONSISTANCY 0x11
1157
1158/* These are the NT transact sub commands. */
1159#define NT_TRANSACT_CREATE                1
1160#define NT_TRANSACT_IOCTL                 2
1161#define NT_TRANSACT_SET_SECURITY_DESC     3
1162#define NT_TRANSACT_NOTIFY_CHANGE         4
1163#define NT_TRANSACT_RENAME                5
1164#define NT_TRANSACT_QUERY_SECURITY_DESC   6
1165
1166/* Relevant IOCTL codes */
1167#define IOCTL_QUERY_JOB_INFO      0x530060
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/* Named pipe write mode flags. Used in writeX calls. */
1258#define PIPE_RAW_MODE 0x4
1259#define PIPE_START_MESSAGE 0x8
1260
1261/* these are the constants used in the above call. */
1262/* DesiredAccess */
1263/* File Specific access rights. */
1264#define FILE_READ_DATA        0x001
1265#define FILE_WRITE_DATA       0x002
1266#define FILE_APPEND_DATA      0x004
1267#define FILE_READ_EA          0x008
1268#define FILE_WRITE_EA         0x010
1269#define FILE_EXECUTE          0x020
1270#define FILE_DELETE_CHILD     0x040
1271#define FILE_READ_ATTRIBUTES  0x080
1272#define FILE_WRITE_ATTRIBUTES 0x100
1273
1274#define FILE_ALL_ATTRIBUTES   0x1FF
1275
1276/* Generic access masks & rights. */
1277#define SPECIFIC_RIGHTS_MASK 0x00FFFFL
1278#define STANDARD_RIGHTS_MASK 0xFF0000L
1279#define DELETE_ACCESS        (1L<<16)
1280#define READ_CONTROL_ACCESS  (1L<<17)
1281#define WRITE_DAC_ACCESS     (1L<<18)
1282#define WRITE_OWNER_ACCESS   (1L<<19)
1283#define SYNCHRONIZE_ACCESS   (1L<<20)
1284
1285#define SYSTEM_SECURITY_ACCESS (1L<<24)
1286#define GENERIC_ALL_ACCESS   (1<<28)
1287#define GENERIC_EXECUTE_ACCESS  (1<<29)
1288#define GENERIC_WRITE_ACCESS   (1<<30)
1289#define GENERIC_READ_ACCESS   (((unsigned)1)<<31)
1290
1291#define FILE_ALL_STANDARD_ACCESS 0x1F0000
1292
1293/* Mapping of access rights to UNIX perms. */
1294#if 0 /* Don't use all here... JRA. */
1295#define UNIX_ACCESS_RWX (FILE_ALL_ATTRIBUTES|FILE_ALL_STANDARD_ACCESS)
1296#else
1297#define UNIX_ACCESS_RWX (UNIX_ACCESS_R|UNIX_ACCESS_W|UNIX_ACCESS_X)
1298#endif
1299
1300#define UNIX_ACCESS_R (READ_CONTROL_ACCESS|SYNCHRONIZE_ACCESS|\
1301			FILE_READ_ATTRIBUTES|FILE_READ_EA|FILE_READ_DATA)
1302#define UNIX_ACCESS_W (READ_CONTROL_ACCESS|SYNCHRONIZE_ACCESS|\
1303			FILE_WRITE_ATTRIBUTES|FILE_WRITE_EA|\
1304			FILE_APPEND_DATA|FILE_WRITE_DATA)
1305#define UNIX_ACCESS_X (READ_CONTROL_ACCESS|SYNCHRONIZE_ACCESS|\
1306			FILE_EXECUTE|FILE_READ_ATTRIBUTES)
1307
1308#define UNIX_ACCESS_NONE (WRITE_OWNER_ACCESS)
1309
1310/* Flags field. */
1311#define REQUEST_OPLOCK 2
1312#define REQUEST_BATCH_OPLOCK 4
1313#define OPEN_DIRECTORY 8
1314
1315/* ShareAccess field. */
1316#define FILE_SHARE_NONE 0 /* Cannot be used in bitmask. */
1317#define FILE_SHARE_READ 1
1318#define FILE_SHARE_WRITE 2
1319#define FILE_SHARE_DELETE 4
1320
1321/* FileAttributesField */
1322#define FILE_ATTRIBUTE_READONLY aRONLY
1323#define FILE_ATTRIBUTE_HIDDEN aHIDDEN
1324#define FILE_ATTRIBUTE_SYSTEM aSYSTEM
1325#define FILE_ATTRIBUTE_DIRECTORY aDIR
1326#define FILE_ATTRIBUTE_ARCHIVE aARCH
1327#define FILE_ATTRIBUTE_NORMAL 0x80L
1328#define FILE_ATTRIBUTE_TEMPORARY 0x100L
1329#define FILE_ATTRIBUTE_COMPRESSED 0x800L
1330#define SAMBA_ATTRIBUTES_MASK 0x7F
1331
1332/* Flags - combined with attributes. */
1333#define FILE_FLAG_WRITE_THROUGH    0x80000000L
1334#define FILE_FLAG_NO_BUFFERING     0x20000000L
1335#define FILE_FLAG_RANDOM_ACCESS    0x10000000L
1336#define FILE_FLAG_SEQUENTIAL_SCAN  0x08000000L
1337#define FILE_FLAG_DELETE_ON_CLOSE  0x04000000L
1338#define FILE_FLAG_BACKUP_SEMANTICS 0x02000000L
1339#define FILE_FLAG_POSIX_SEMANTICS  0x01000000L
1340
1341/* CreateDisposition field. */
1342#define FILE_SUPERSEDE 0
1343#define FILE_OPEN 1
1344#define FILE_CREATE 2
1345#define FILE_OPEN_IF 3
1346#define FILE_OVERWRITE 4
1347#define FILE_OVERWRITE_IF 5
1348
1349/* CreateOptions field. */
1350#define FILE_DIRECTORY_FILE       0x0001
1351#define FILE_WRITE_THROUGH        0x0002
1352#define FILE_SEQUENTIAL_ONLY      0x0004
1353#define FILE_NON_DIRECTORY_FILE   0x0040
1354#define FILE_NO_EA_KNOWLEDGE      0x0200
1355#define FILE_EIGHT_DOT_THREE_ONLY 0x0400
1356#define FILE_RANDOM_ACCESS        0x0800
1357#define FILE_DELETE_ON_CLOSE      0x1000
1358
1359/* Responses when opening a file. */
1360#define FILE_WAS_OPENED 1
1361#define FILE_WAS_CREATED 2
1362#define FILE_WAS_OVERWRITTEN 3
1363
1364/* File type flags */
1365#define FILE_TYPE_DISK  0
1366#define FILE_TYPE_BYTE_MODE_PIPE 1
1367#define FILE_TYPE_MESSAGE_MODE_PIPE 2
1368#define FILE_TYPE_PRINTER 3
1369#define FILE_TYPE_COMM_DEVICE 4
1370#define FILE_TYPE_UNKNOWN 0xFFFF
1371
1372/* Flag for NT transact rename call. */
1373#define RENAME_REPLACE_IF_EXISTS 1
1374
1375/* Filesystem Attributes. */
1376#define FILE_CASE_SENSITIVE_SEARCH 0x01
1377#define FILE_CASE_PRESERVED_NAMES 0x02
1378#define FILE_UNICODE_ON_DISK 0x04
1379/* According to cifs9f, this is 4, not 8 */
1380/* Acconding to testing, this actually sets the security attribute! */
1381#define FILE_PERSISTENT_ACLS 0x08
1382/* These entries added from cifs9f --tsb */
1383#define FILE_FILE_COMPRESSION 0x08
1384#define FILE_VOLUME_QUOTAS 0x10
1385#define FILE_DEVICE_IS_MOUNTED 0x20
1386#define FILE_VOLUME_IS_COMPRESSED 0x8000
1387
1388/* ChangeNotify flags. */
1389#define FILE_NOTIFY_CHANGE_FILE_NAME   0x001
1390#define FILE_NOTIFY_CHANGE_DIR_NAME    0x002
1391#define FILE_NOTIFY_CHANGE_ATTRIBUTES  0x004
1392#define FILE_NOTIFY_CHANGE_SIZE        0x008
1393#define FILE_NOTIFY_CHANGE_LAST_WRITE  0x010
1394#define FILE_NOTIFY_CHANGE_LAST_ACCESS 0x020
1395#define FILE_NOTIFY_CHANGE_CREATION    0x040
1396#define FILE_NOTIFY_CHANGE_EA          0x080
1397#define FILE_NOTIFY_CHANGE_SECURITY    0x100
1398
1399/* where to find the base of the SMB packet proper */
1400#define smb_base(buf) (((char *)(buf))+4)
1401
1402/* Extra macros added by Ying Chen at IBM - speed increase by inlining. */
1403#define smb_buf(buf) (buf + smb_size + CVAL(buf,smb_wct)*2)
1404#define smb_buflen(buf) (SVAL(buf,smb_vwv0 + (int)CVAL(buf, smb_wct)*2))
1405
1406/* Note that chain_size must be available as an extern int to this macro. */
1407#define smb_offset(p,buf) (PTR_DIFF(p,buf+4) + chain_size)
1408
1409#define smb_len(buf) (PVAL(buf,3)|(PVAL(buf,2)<<8)|((PVAL(buf,1)&1)<<16))
1410#define _smb_setlen(buf,len) buf[0] = 0; buf[1] = (len&0x10000)>>16; \
1411        buf[2] = (len&0xFF00)>>8; buf[3] = len&0xFF;
1412
1413/*********************************************************
1414* Routine to check if a given string matches exactly.
1415* Case can be significant or not.
1416**********************************************************/
1417
1418#define exact_match(str, regexp, case_sig) \
1419  ((case_sig?strcmp(str,regexp):strcasecmp(str,regexp)) == 0)
1420
1421/*******************************************************************
1422find the difference in milliseconds between two struct timeval
1423values
1424********************************************************************/
1425
1426#define TvalDiff(tvalold,tvalnew) \
1427  (((tvalnew)->tv_sec - (tvalold)->tv_sec)*1000 +  \
1428	 ((int)(tvalnew)->tv_usec - (int)(tvalold)->tv_usec)/1000)
1429
1430/****************************************************************************
1431true if two IP addresses are equal
1432****************************************************************************/
1433
1434#define ip_equal(ip1,ip2) ((ip1).s_addr == (ip2).s_addr)
1435
1436/*****************************************************************
1437 splits out the last subkey of a key
1438 *****************************************************************/
1439
1440#define reg_get_subkey(full_keyname, key_name, subkey_name) \
1441	split_at_last_component(full_keyname, key_name, '\\', subkey_name)
1442
1443/****************************************************************************
1444 Used by dptr_zero.
1445****************************************************************************/
1446
1447#define DPTR_MASK ((uint32)(((uint32)1)<<31))
1448
1449/****************************************************************************
1450 Return True if the offset is at zero.
1451****************************************************************************/
1452
1453#define dptr_zero(buf) ((IVAL(buf,1)&~DPTR_MASK) == 0)
1454
1455/*******************************************************************
1456copy an IP address from one buffer to another
1457********************************************************************/
1458
1459#define putip(dest,src) memcpy(dest,src,4)
1460
1461/****************************************************************************
1462 Make a filename into unix format.
1463****************************************************************************/
1464
1465#define unix_format(fname) string_replace(fname,'\\','/')
1466
1467/****************************************************************************
1468 Make a file into DOS format.
1469****************************************************************************/
1470
1471#define dos_format(fname) string_replace(fname,'/','\\')
1472
1473/* we don't allow server strings to be longer than 48 characters as
1474   otherwise NT will not honour the announce packets */
1475#define MAX_SERVER_STRING_LENGTH 48
1476
1477
1478#define SMB_SUCCESS 0  /* The request was successful. */
1479#define ERRDOS 0x01 /*  Error is from the core DOS operating system set. */
1480#define ERRSRV 0x02  /* Error is generated by the server network file manager.*/
1481#define ERRHRD 0x03  /* Error is an hardware error. */
1482#define ERRCMD 0xFF  /* Command was not in the "SMB" format. */
1483
1484#ifdef HAVE_STDARG_H
1485int slprintf(char *str, int n, char *format, ...)
1486#ifdef __GNUC__
1487     __attribute__ ((format (printf, 3, 4)))
1488#endif
1489;
1490#else
1491int slprintf();
1492#endif
1493
1494#ifdef WITH_DFS
1495void dfs_unlogin(void);
1496extern int dcelogin_atmost_once;
1497#endif
1498
1499#ifdef NOSTRDUP
1500char *strdup(char *s);
1501#endif
1502
1503#ifndef MIN
1504#define MIN(a,b) ((a)<(b)?(a):(b))
1505#endif
1506#ifndef MAX
1507#define MAX(a,b) ((a)>(b)?(a):(b))
1508#endif
1509
1510#ifndef ABS
1511#define ABS(a) ((a)>0?(a):(-(a)))
1512#endif
1513
1514#ifndef SIGNAL_CAST
1515#define SIGNAL_CAST (RETSIGTYPE (*)(int))
1516#endif
1517
1518#ifndef SELECT_CAST
1519#define SELECT_CAST
1520#endif
1521
1522
1523/* Some POSIX definitions for those without */
1524
1525#ifndef S_IFDIR
1526#define S_IFDIR         0x4000
1527#endif
1528#ifndef S_ISDIR
1529#define S_ISDIR(mode)   ((mode & 0xF000) == S_IFDIR)
1530#endif
1531#ifndef S_IRWXU
1532#define S_IRWXU 00700           /* read, write, execute: owner */
1533#endif
1534#ifndef S_IRUSR
1535#define S_IRUSR 00400           /* read permission: owner */
1536#endif
1537#ifndef S_IWUSR
1538#define S_IWUSR 00200           /* write permission: owner */
1539#endif
1540#ifndef S_IXUSR
1541#define S_IXUSR 00100           /* execute permission: owner */
1542#endif
1543#ifndef S_IRWXG
1544#define S_IRWXG 00070           /* read, write, execute: group */
1545#endif
1546#ifndef S_IRGRP
1547#define S_IRGRP 00040           /* read permission: group */
1548#endif
1549#ifndef S_IWGRP
1550#define S_IWGRP 00020           /* write permission: group */
1551#endif
1552#ifndef S_IXGRP
1553#define S_IXGRP 00010           /* execute permission: group */
1554#endif
1555#ifndef S_IRWXO
1556#define S_IRWXO 00007           /* read, write, execute: other */
1557#endif
1558#ifndef S_IROTH
1559#define S_IROTH 00004           /* read permission: other */
1560#endif
1561#ifndef S_IWOTH
1562#define S_IWOTH 00002           /* write permission: other */
1563#endif
1564#ifndef S_IXOTH
1565#define S_IXOTH 00001           /* execute permission: other */
1566#endif
1567
1568
1569/* these are used in NetServerEnum to choose what to receive */
1570#define SV_TYPE_WORKSTATION         0x00000001
1571#define SV_TYPE_SERVER              0x00000002
1572#define SV_TYPE_SQLSERVER           0x00000004
1573#define SV_TYPE_DOMAIN_CTRL         0x00000008
1574#define SV_TYPE_DOMAIN_BAKCTRL      0x00000010
1575#define SV_TYPE_TIME_SOURCE         0x00000020
1576#define SV_TYPE_AFP                 0x00000040
1577#define SV_TYPE_NOVELL              0x00000080
1578#define SV_TYPE_DOMAIN_MEMBER       0x00000100
1579#define SV_TYPE_PRINTQ_SERVER       0x00000200
1580#define SV_TYPE_DIALIN_SERVER       0x00000400
1581#define SV_TYPE_SERVER_UNIX         0x00000800
1582#define SV_TYPE_NT                  0x00001000
1583#define SV_TYPE_WFW                 0x00002000
1584#define SV_TYPE_SERVER_MFPN         0x00004000
1585#define SV_TYPE_SERVER_NT           0x00008000
1586#define SV_TYPE_POTENTIAL_BROWSER   0x00010000
1587#define SV_TYPE_BACKUP_BROWSER      0x00020000
1588#define SV_TYPE_MASTER_BROWSER      0x00040000
1589#define SV_TYPE_DOMAIN_MASTER       0x00080000
1590#define SV_TYPE_SERVER_OSF          0x00100000
1591#define SV_TYPE_SERVER_VMS          0x00200000
1592#define SV_TYPE_WIN95_PLUS          0x00400000
1593#define SV_TYPE_ALTERNATE_XPORT     0x20000000
1594#define SV_TYPE_LOCAL_LIST_ONLY     0x40000000
1595#define SV_TYPE_DOMAIN_ENUM         0x80000000
1596#define SV_TYPE_ALL                 0xFFFFFFFF
1597
1598/* what server type are we currently  - JHT Says we ARE 4.20 */
1599/* this was set by JHT in liaison with Jeremy Allison early 1997 */
1600/* setting to 4.20 at same time as announcing ourselves as NT Server */
1601/* History: */
1602/* Version 4.0 - never made public */
1603/* Version 4.10 - New to 1.9.16p2, lost in space 1.9.16p3 to 1.9.16p9 */
1604/*		- Reappeared in 1.9.16p11 with fixed smbd services */
1605/* Version 4.20 - To indicate that nmbd and browsing now works better */
1606
1607#define DEFAULT_MAJOR_VERSION 0x04
1608#define DEFAULT_MINOR_VERSION 0x02
1609
1610/* Browser Election Values */
1611#define BROWSER_ELECTION_VERSION	0x010f
1612#define BROWSER_CONSTANT	0xaa55
1613
1614/* NT Flags2 bits - cifs6.txt section 3.1.2 */
1615
1616#define FLAGS2_LONG_PATH_COMPONENTS   0x0001
1617#define FLAGS2_EXTENDED_ATTRIBUTES    0x0002
1618#define FLAGS2_DFS_PATHNAMES          0x1000
1619#define FLAGS2_READ_PERMIT_NO_EXECUTE 0x2000
1620#define FLAGS2_32_BIT_ERROR_CODES     0x4000
1621#define FLAGS2_UNICODE_STRINGS        0x8000
1622
1623#define FLAGS2_WIN2K_SIGNATURE        0xC852
1624
1625/* Capabilities.  see ftp.microsoft.com/developr/drg/cifs/cifs/cifs4.txt */
1626
1627#define CAP_RAW_MODE         0x0001
1628#define CAP_MPX_MODE         0x0002
1629#define CAP_UNICODE          0x0004
1630#define CAP_LARGE_FILES      0x0008
1631#define CAP_NT_SMBS          0x0010
1632#define CAP_RPC_REMOTE_APIS  0x0020
1633#define CAP_STATUS32         0x0040
1634#define CAP_LEVEL_II_OPLOCKS 0x0080
1635#define CAP_LOCK_AND_READ    0x0100
1636#define CAP_NT_FIND          0x0200
1637#define CAP_DFS              0x1000
1638#define CAP_W2K_SMBS         0x2000
1639#define CAP_LARGE_READX      0x4000
1640#define CAP_LARGE_WRITEX     0x8000
1641#define CAP_EXTENDED_SECURITY 0x80000000
1642
1643/* protocol types. It assumes that higher protocols include lower protocols
1644   as subsets */
1645enum protocol_types {PROTOCOL_NONE,PROTOCOL_CORE,PROTOCOL_COREPLUS,PROTOCOL_LANMAN1,PROTOCOL_LANMAN2,PROTOCOL_NT1};
1646
1647/* security levels */
1648enum security_types {SEC_SHARE,SEC_USER,SEC_SERVER,SEC_DOMAIN};
1649
1650/* printing types */
1651enum printing_types {PRINT_BSD,PRINT_SYSV,PRINT_AIX,PRINT_HPUX,
1652		     PRINT_QNX,PRINT_PLP,PRINT_LPRNG,PRINT_SOFTQ,PRINT_CUPS};
1653
1654/* Remote architectures we know about. */
1655enum remote_arch_types {RA_UNKNOWN, RA_WFWG, RA_OS2, RA_WIN95, RA_WINNT, RA_WIN2K, RA_SAMBA};
1656
1657/* case handling */
1658enum case_handling {CASE_LOWER,CASE_UPPER};
1659
1660#ifdef WITH_SSL
1661/* SSL version options */
1662enum ssl_version_enum {SMB_SSL_V2,SMB_SSL_V3,SMB_SSL_V23,SMB_SSL_TLS1};
1663#endif /* WITH_SSL */
1664
1665/* Macros to get at offsets within smb_lkrng and smb_unlkrng
1666   structures. We cannot define these as actual structures
1667   due to possible differences in structure packing
1668   on different machines/compilers. */
1669
1670#define SMB_LPID_OFFSET(indx) (10 * (indx))
1671#define SMB_LKOFF_OFFSET(indx) ( 2 + (10 * (indx)))
1672#define SMB_LKLEN_OFFSET(indx) ( 6 + (10 * (indx)))
1673#define SMB_LARGE_LKOFF_OFFSET_HIGH(indx) (4 + (20 * (indx)))
1674#define SMB_LARGE_LKOFF_OFFSET_LOW(indx) (8 + (20 * (indx)))
1675#define SMB_LARGE_LKLEN_OFFSET_HIGH(indx) (12 + (20 * (indx)))
1676#define SMB_LARGE_LKLEN_OFFSET_LOW(indx) (16 + (20 * (indx)))
1677
1678/* Macro to cache an error in a write_bmpx_struct */
1679#define CACHE_ERROR(w,c,e) ((w)->wr_errclass = (c), (w)->wr_error = (e), \
1680			    w->wr_discard = True, -1)
1681/* Macro to test if an error has been cached for this fnum */
1682#define HAS_CACHED_ERROR(fsp) ((fsp)->open && (fsp)->wbmpx_ptr && \
1683				(fsp)->wbmpx_ptr->wr_discard)
1684/* Macro to turn the cached error into an error packet */
1685#define CACHED_ERROR(fsp) cached_error_packet(inbuf,outbuf,fsp,__LINE__)
1686
1687/* these are the datagram types */
1688#define DGRAM_DIRECT_UNIQUE 0x10
1689
1690#define ERROR(class,x) error_packet(inbuf,outbuf,class,x,__LINE__)
1691
1692/* this is how errors are generated */
1693#define UNIXERROR(defclass,deferror) unix_error_packet(inbuf,outbuf,defclass,deferror,__LINE__)
1694
1695#define SMB_ROUNDUP(x,g) (((x)+((g)-1))&~((g)-1))
1696
1697/*
1698 * Global value meaing that the smb_uid field should be
1699 * ingored (in share level security and protocol level == CORE)
1700 */
1701
1702#define UID_FIELD_INVALID 0
1703#define VUID_OFFSET 100 /* Amount to bias returned vuid numbers */
1704
1705/* Defines needed for multi-codepage support. */
1706#define MSDOS_LATIN_1_CODEPAGE 850
1707#define KANJI_CODEPAGE 932
1708#define HANGUL_CODEPAGE 949
1709#define BIG5_CODEPAGE 950
1710#define SIMPLIFIED_CHINESE_CODEPAGE 936
1711
1712#ifdef KANJI
1713/*
1714 * Default client code page - Japanese
1715 */
1716#define DEFAULT_CLIENT_CODE_PAGE KANJI_CODEPAGE
1717#else /* KANJI */
1718/*
1719 * Default client code page - 850 - Western European
1720 */
1721#define DEFAULT_CLIENT_CODE_PAGE MSDOS_LATIN_1_CODEPAGE
1722#endif /* KANJI */
1723
1724/* Global val set if multibyte codepage. */
1725extern int global_is_multibyte_codepage;
1726
1727#define get_character_len(x) (global_is_multibyte_codepage ? skip_multibyte_char((x)) : 0)
1728
1729/*
1730 * Size of buffer to use when moving files across filesystems.
1731 */
1732#define COPYBUF_SIZE (8*1024)
1733
1734/*
1735 * Integers used to override error codes.
1736 */
1737extern int unix_ERR_class;
1738extern int unix_ERR_code;
1739
1740/*
1741 * Used in chaining code.
1742 */
1743extern int chain_size;
1744
1745/*
1746 * Map the Core and Extended Oplock requesst bits down
1747 * to common bits (EXCLUSIVE_OPLOCK & BATCH_OPLOCK).
1748 */
1749
1750/*
1751 * Core protocol.
1752 */
1753#define CORE_OPLOCK_REQUEST(inbuf) \
1754    ((CVAL(inbuf,smb_flg)&(FLAG_REQUEST_OPLOCK|FLAG_REQUEST_BATCH_OPLOCK))>>5)
1755
1756/*
1757 * Extended protocol.
1758 */
1759#define EXTENDED_OPLOCK_REQUEST(inbuf) ((SVAL(inbuf,smb_vwv2)&((1<<1)|(1<<2)))>>1)
1760
1761/* Lock types. */
1762#define LOCKING_ANDX_SHARED_LOCK 0x1
1763#define LOCKING_ANDX_OPLOCK_RELEASE 0x2
1764#define LOCKING_ANDX_CHANGE_LOCKTYPE 0x4
1765#define LOCKING_ANDX_CANCEL_LOCK 0x8
1766#define LOCKING_ANDX_LARGE_FILES 0x10
1767
1768/* Oplock levels */
1769#define OPLOCKLEVEL_NONE 0
1770#define OPLOCKLEVEL_II 1
1771
1772/*
1773 * Bits we test with.
1774 */
1775
1776#define NO_OPLOCK 0
1777#define EXCLUSIVE_OPLOCK 1
1778#define BATCH_OPLOCK 2
1779#define LEVEL_II_OPLOCK 4
1780
1781#define EXCLUSIVE_OPLOCK_TYPE(lck) ((lck) & (EXCLUSIVE_OPLOCK|BATCH_OPLOCK))
1782#define BATCH_OPLOCK_TYPE(lck) ((lck) & BATCH_OPLOCK)
1783#define LEVEL_II_OPLOCK_TYPE(lck) ((lck) & LEVEL_II_OPLOCK)
1784
1785#define CORE_OPLOCK_GRANTED (1<<5)
1786#define EXTENDED_OPLOCK_GRANTED (1<<15)
1787
1788/*
1789 * Return values for oplock types.
1790 */
1791
1792#define NO_OPLOCK_RETURN 0
1793#define EXCLUSIVE_OPLOCK_RETURN 1
1794#define BATCH_OPLOCK_RETURN 2
1795#define LEVEL_II_OPLOCK_RETURN 3
1796
1797/*
1798 * Loopback command offsets.
1799 */
1800
1801#define OPBRK_CMD_LEN_OFFSET 0
1802#define OPBRK_CMD_PORT_OFFSET 4
1803#define OPBRK_CMD_HEADER_LEN 6
1804
1805#define OPBRK_MESSAGE_CMD_OFFSET 0
1806
1807/*
1808 * Oplock break command code to send over the udp socket.
1809 * The same message is sent for both exlusive and level II breaks.
1810 *
1811 * The form of this is :
1812 *
1813 *  0     2       6        10       14    14+devsize 14+devsize+inodesize
1814 *  +----+--------+--------+--------+-------+--------+
1815 *  | cmd| pid    | sec    | usec   | dev   |  inode |
1816 *  +----+--------+--------+--------+-------+--------+
1817 */
1818
1819#define OPLOCK_BREAK_CMD 0x1
1820#define OPLOCK_BREAK_PID_OFFSET 2
1821#define OPLOCK_BREAK_SEC_OFFSET (OPLOCK_BREAK_PID_OFFSET + sizeof(pid_t))
1822#define OPLOCK_BREAK_USEC_OFFSET (OPLOCK_BREAK_SEC_OFFSET + sizeof(time_t))
1823#define OPLOCK_BREAK_DEV_OFFSET (OPLOCK_BREAK_USEC_OFFSET + sizeof(long))
1824#define OPLOCK_BREAK_INODE_OFFSET (OPLOCK_BREAK_DEV_OFFSET + sizeof(SMB_DEV_T))
1825#define OPLOCK_BREAK_MSG_LEN (OPLOCK_BREAK_INODE_OFFSET + sizeof(SMB_INO_T))
1826
1827#define LEVEL_II_OPLOCK_BREAK_CMD 0x3
1828
1829/*
1830 * Capabilities abstracted for different systems.
1831 */
1832
1833#define KERNEL_OPLOCK_CAPABILITY 0x1
1834
1835#if defined(HAVE_KERNEL_OPLOCKS)
1836/*
1837 * Oplock break command code sent via the kernel interface.
1838 *
1839 * Form of this is :
1840 *
1841 *  0     2       2+devsize 2+devsize+inodesize
1842 *  +----+--------+--------+
1843 *  | cmd| dev    |  inode |
1844 *  +----+--------+--------+
1845 */
1846
1847#define KERNEL_OPLOCK_BREAK_CMD 0x2
1848#define KERNEL_OPLOCK_BREAK_DEV_OFFSET 2
1849#define KERNEL_OPLOCK_BREAK_INODE_OFFSET (KERNEL_OPLOCK_BREAK_DEV_OFFSET + sizeof(SMB_DEV_T))
1850#define KERNEL_OPLOCK_BREAK_MSG_LEN (KERNEL_OPLOCK_BREAK_INODE_OFFSET + sizeof(SMB_INO_T))
1851
1852#endif /* HAVE_KERNEL_OPLOCKS */
1853
1854#define CMD_REPLY 0x8000
1855
1856/* useful macros */
1857
1858/* zero a structure */
1859#define ZERO_STRUCT(x) memset((char *)&(x), 0, sizeof(x))
1860
1861/* zero a structure given a pointer to the structure - no zero check */
1862#define ZERO_STRUCTPN(x) memset((char *)(x), 0, sizeof(*(x)))
1863
1864/* zero a structure given a pointer to the structure */
1865#define ZERO_STRUCTP(x) { if ((x) != NULL) ZERO_STRUCTPN(x); }
1866
1867/* zero an array - note that sizeof(array) must work - ie. it must not be a
1868   pointer */
1869#define ZERO_ARRAY(x) memset((char *)(x), 0, sizeof(x))
1870
1871#define SMB_ASSERT(b) ((b)?(void)0: \
1872        (DEBUG(0,("PANIC: assert failed at %s(%d)\n", \
1873		 __FILE__, __LINE__)), smb_panic("assert failed")))
1874#define SMB_ASSERT_ARRAY(a,n) SMB_ASSERT((sizeof(a)/sizeof((a)[0])) >= (n))
1875
1876#include "ntdomain.h"
1877
1878/* A netbios name structure. */
1879struct nmb_name {
1880  char         name[17];
1881  char         scope[64];
1882  unsigned int name_type;
1883};
1884
1885#include "client.h"
1886#include "rpcclient.h"
1887
1888/*
1889 * Size of new password account encoding string. DO NOT CHANGE.
1890 */
1891
1892#define NEW_PW_FORMAT_SPACE_PADDED_LEN 14
1893
1894/*
1895   Do you want session setups at user level security with a invalid
1896   password to be rejected or allowed in as guest? WinNT rejects them
1897   but it can be a pain as it means "net view" needs to use a password
1898
1899   You have 3 choices in the setting of map_to_guest:
1900
1901   "NEVER_MAP_TO_GUEST" means session setups with an invalid password
1902   are rejected. This is the default.
1903
1904   "MAP_TO_GUEST_ON_BAD_USER" means session setups with an invalid password
1905   are rejected, unless the username does not exist, in which case it
1906   is treated as a guest login
1907
1908   "MAP_TO_GUEST_ON_BAD_PASSWORD" means session setups with an invalid password
1909   are treated as a guest login
1910
1911   Note that map_to_guest only has an effect in user or server
1912   level security.
1913*/
1914
1915#define NEVER_MAP_TO_GUEST 0
1916#define MAP_TO_GUEST_ON_BAD_USER 1
1917#define MAP_TO_GUEST_ON_BAD_PASSWORD 2
1918
1919#define SAFE_NETBIOS_CHARS ". -_"
1920
1921#ifndef SAFE_FREE
1922#define SAFE_FREE(x) do { if ((x) != NULL) {free((x)); (x)=NULL;} } while(0)
1923#endif
1924#endif /* _SMB_H */
1925