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