This is the 'multiple pdb backends' patch from ctrlsoft, aka Jelmer Vernooij
[kai/samba.git] / source3 / include / smb.h
index 1d7612e9e8c43c676e59d150ed50c42daaf58292..52b475ff272f57f440a51a68c9a3343773a1912e 100644 (file)
@@ -1,11 +1,13 @@
 /* 
-   Unix SMB/Netbios implementation.
-   Version 1.9.
-   SMB parameters and setup
+   Unix SMB/CIFS implementation.
+   SMB parameters and setup, plus a whole lot more.
+   
    Copyright (C) Andrew Tridgell              1992-2000
    Copyright (C) John H Terpstra              1996-2000
    Copyright (C) Luke Kenneth Casson Leighton 1996-2000
    Copyright (C) Paul Ashton                  1998-2000
+   Copyright (C) Simo Sorce                   2001-2002
+   Copyright (C) Martin Pool                 2002
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 #ifndef _SMB_H
 #define _SMB_H
 
+#if defined(LARGE_SMB_OFF_T)
+#define BUFFER_SIZE (128*1024)
+#else /* no large readwrite possible */
 #define BUFFER_SIZE (0xFFFF)
+#endif
+
 #define SAFETY_MARGIN 1024
 #define LARGE_WRITEX_HDR_SIZE 65
 
@@ -69,22 +76,15 @@ typedef int BOOL;
 #define READ_EOF 2
 #define READ_ERROR 3
 
-
 #define DIR_STRUCT_SIZE 43
 
-/* these define all the command types recognised by the server - there
-are lots of gaps so probably there are some rare commands that are not
-implemented */
-
-#define pSETDIR '\377'
-
 /* these define the attribute byte as seen by DOS */
-#define aRONLY (1L<<0)
-#define aHIDDEN (1L<<1)
-#define aSYSTEM (1L<<2)
-#define aVOLID (1L<<3)
-#define aDIR (1L<<4)
-#define aARCH (1L<<5)
+#define aRONLY (1L<<0)         /* 0x01 */
+#define aHIDDEN (1L<<1)                /* 0x02 */
+#define aSYSTEM (1L<<2)                /* 0x04 */
+#define aVOLID (1L<<3)         /* 0x08 */
+#define aDIR (1L<<4)           /* 0x10 */
+#define aARCH (1L<<5)          /* 0x20 */
 
 /* deny modes */
 #define DENY_DOS 0
@@ -123,11 +123,6 @@ implemented */
 #define GET_DELETE_ON_CLOSE_FLAG(x) (((x) & DELETE_ON_CLOSE_FLAG) ? True : False)
 #define SET_DELETE_ON_CLOSE_FLAG(x) ((x) ? DELETE_ON_CLOSE_FLAG : 0)
 
-/* was delete access requested in NT open ? */
-#define DELETE_ACCESS_REQUESTED (1<<17)
-#define GET_DELETE_ACCESS_REQUESTED(x) (((x) & DELETE_ACCESS_REQUESTED) ? True : False)
-#define SET_DELETE_ACCESS_REQUESTED(x) ((x) ? DELETE_ACCESS_REQUESTED : 0)
-
 /* open disposition values */
 #define FILE_EXISTS_FAIL 0
 #define FILE_EXISTS_OPEN 1
@@ -154,18 +149,6 @@ implemented */
 
 #include "doserr.h"
 
-#ifndef _PSTRING
-
-#define PSTRING_LEN 1024
-#define FSTRING_LEN 256
-
-typedef char pstring[PSTRING_LEN];
-typedef char fstring[FSTRING_LEN];
-
-#define _PSTRING
-
-#endif
-
 /*
  * SMB UCS2 (16-bit unicode) internal type.
  */
@@ -208,11 +191,18 @@ typedef struct nttime_info
 } NTTIME;
 
 
+/* The Splint code analysis tool doesn't like immediate structures. */
+
+#ifdef _SPLINT_                      /* http://www.splint.org */
+#undef HAVE_IMMEDIATE_STRUCTURES
+#endif
+
 /* the following rather strange looking definitions of NTSTATUS and WERROR
    and there in order to catch common coding errors where different error types
    are mixed up. This is especially important as we slowly convert Samba
    from using BOOL for internal functions 
 */
+
 #if defined(HAVE_IMMEDIATE_STRUCTURES)
 typedef struct {uint32 v;} NTSTATUS;
 #define NT_STATUS(x) ((NTSTATUS) { x })
@@ -254,29 +244,10 @@ typedef uint32 WERROR;
  
 #define MAX_HOURS_LEN 32
 
-typedef struct
-{
-        uint32 pid;
-        uint16 vuid;
-
-}
-vuser_key;
-
-
-struct use_info
-{
-       BOOL connected;
-       char *srv_name;
-       vuser_key key;
-       char *user_name;
-       char *domain;
-};
-
 #ifndef MAXSUBAUTHS
 #define MAXSUBAUTHS 15 /* max sub authorities in a SID */
 #endif
 
-#ifndef _DOM_SID
 /**
  * @brief Security Identifier
  *
@@ -296,8 +267,6 @@ typedef struct sid_info
   uint32 sub_auths[MAXSUBAUTHS];  
 
 } DOM_SID;
-#define _DOM_SID
-#endif
 
 /*
  * The complete list of SIDS belonging to this user.
@@ -306,19 +275,16 @@ typedef struct sid_info
  *
  * token->user_sids[0] = primary user SID.
  * token->user_sids[1] = primary group SID.
- * token->user_sids[2-num_sids] = supplementary group SIDS.
+ * token->user_sids[2..num_sids] = supplementary group SIDS.
  */
 
 #define PRIMARY_USER_SID_INDEX 0
 #define PRIMARY_GROUP_SID_INDEX 1
 
-#ifndef _NT_USER_TOKEN
 typedef struct _nt_user_token {
        size_t num_sids;
        DOM_SID *user_sids;
 } NT_USER_TOKEN;
-#define _NT_USER_TOKEN
-#endif
 
 /*** query a local group, get a list of these: shows who is in that group ***/
 
@@ -391,10 +357,8 @@ typedef struct write_cache
 
 typedef struct
 {
-       smb_ucs2_t *path;
-       smb_ucs2_t *name;
-       smb_ucs2_t *unixname;
-       smb_ucs2_t *dosname;
+       smb_ucs2_t *origname;
+       smb_ucs2_t *filename;
        SMB_STRUCT_STAT *statinfo;
 } smb_filename;
 
@@ -417,6 +381,7 @@ typedef struct files_struct
        write_cache *wcp;
        struct timeval open_time;
        int share_mode;
+       uint32 desired_access;
        time_t pending_modtime;
        int oplock_type;
        int sent_oplock_break;
@@ -428,10 +393,16 @@ typedef struct files_struct
        BOOL modified;
        BOOL is_directory;
        BOOL directory_delete_on_close;
-       BOOL stat_open;
        char *fsp_name;
 } files_struct;
 
+/* used to hold an arbitrary blob of data */
+typedef struct data_blob {
+       uint8 *data;
+       size_t length;
+       void (*free)(struct data_blob *data_blob);
+} DATA_BLOB;
+
 /*
  * Structure used to keep directory state information around.
  * Used in NT change-notify code.
@@ -456,6 +427,7 @@ typedef struct
 
 /* Include VFS stuff */
 
+#include "smb_acls.h"
 #include "vfs.h"
 
 typedef struct connection_struct
@@ -477,6 +449,7 @@ typedef struct connection_struct
        struct vfs_ops vfs_ops;                   /* Filesystem operations */
        /* Handle on dlopen() call */
        void *dl_handle;
+       void *vfs_private;
 
        char *user; /* name of user who *opened* this connection */
        uid_t uid; /* uid of user who *opened* this connection */
@@ -533,11 +506,12 @@ typedef struct _print_queue_struct
 {
   int job;
   int size;
+  int page_count;
   int status;
   int priority;
   time_t time;
-  fstring user;
-  fstring file;
+  fstring fs_user;
+  fstring fs_file;
 } print_queue_struct;
 
 enum {LPSTAT_OK, LPSTAT_STOPPED, LPSTAT_ERROR};
@@ -575,6 +549,7 @@ typedef struct {
        uint16 op_port;
        uint16 op_type;
        int share_mode;
+       uint32 desired_access;
        struct timeval time;
        SMB_DEV_T dev;
        SMB_INO_T inode;
@@ -588,48 +563,101 @@ typedef struct {
 #define SHAREMODE_FN(fn) \
        void (*fn)(share_mode_entry *, char*)
 
+#define NT_HASH_LEN 16
+#define LM_HASH_LEN 16
+
+/*
+ * bit flags representing initialized fields in SAM_ACCOUNT
+ */
+#define FLAG_SAM_UNINIT                0x00000000
+#define FLAG_SAM_UID           0x00000001
+#define FLAG_SAM_GID           0x00000002
+#define FLAG_SAM_SMBHOME       0x00000004
+#define FLAG_SAM_PROFILE       0x00000008
+#define FLAG_SAM_DRIVE          0x00000010
+#define FLAG_SAM_LOGONSCRIPT   0x00000020
+#define FLAG_SAM_LOGONTIME     0x00000040
+#define FLAG_SAM_LOGOFFTIME    0x00000080
+#define FLAG_SAM_KICKOFFTIME   0x00000100
+#define FLAG_SAM_CANCHANGETIME 0x00000200
+#define FLAG_SAM_MUSTCHANGETIME        0x00000400
+
+
+#define IS_SAM_UNIX_USER(x) \
+       ((pdb_get_init_flag(x) & FLAG_SAM_UID) \
+        && (pdb_get_init_flag(x) & FLAG_SAM_GID))
+
+#define IS_SAM_SET(x, flag)    ((x)->private.init_flag & (flag))
+               
 typedef struct sam_passwd
 {
-       time_t logon_time;            /* logon time */
-       time_t logoff_time;           /* logoff time */
-       time_t kickoff_time;          /* kickoff time */
-       time_t pass_last_set_time;    /* password last set time */
-       time_t pass_can_change_time;  /* password can change time */
-       time_t pass_must_change_time; /* password must change time */
-
-       pstring username;     /* UNIX username string */
-       pstring domain;       /* Windows Domain name */
-       pstring nt_username;  /* Windows username string */
-       pstring full_name;    /* user's full name string */
-       pstring home_dir;     /* home directory string */
-       pstring dir_drive;    /* home directory drive string */
-       pstring logon_script; /* logon script string */
-       pstring profile_path; /* profile path string */
-       pstring acct_desc  ;  /* user description string */
-       pstring workstations; /* login from workstations string */
-       pstring unknown_str ; /* don't know what this is, yet. */
-       pstring munged_dial ; /* munged path name and dial-back tel number */
-
-        uid_t *uid;          /* this is a pointer to the unix uid_t */
-        gid_t *gid;          /* this is a pointer to the unix gid_t */
-        uint32 user_rid;    /* Primary User ID */
-        uint32 group_rid;   /* Primary Group ID */
-
-        unsigned char *lm_pw; /* Null if no password */
-        unsigned char *nt_pw; /* Null if no password */
-
-        uint16 acct_ctrl; /* account info (ACB_xxxx bit-mask) */
-        uint32 unknown_3; /* 0x00ff ffff */
-
-        uint16 logon_divs; /* 168 - number of hours in a week */
-        uint32 hours_len; /* normally 21 bytes */
-        uint8 hours[MAX_HOURS_LEN];
-
-        uint32 unknown_5; /* 0x0002 0000 */
-        uint32 unknown_6; /* 0x0000 04ec */
+       TALLOC_CTX *mem_ctx;
+       
+       void (*free_fn)(struct sam_passwd **);
+
+    struct pdb_methods *methods;
+
+       struct user_data {
+               /* initiailization flags */
+               uint32 init_flag;
+               
+               time_t logon_time;            /* logon time */
+               time_t logoff_time;           /* logoff time */
+               time_t kickoff_time;          /* kickoff time */
+               time_t pass_last_set_time;    /* password last set time */
+               time_t pass_can_change_time;  /* password can change time */
+               time_t pass_must_change_time; /* password must change time */
+               
+               char * username;     /* UNIX username string */
+               char * domain;       /* Windows Domain name */
+               char * nt_username;  /* Windows username string */
+               char * full_name;    /* user's full name string */
+               char * home_dir;     /* home directory string */
+               char * dir_drive;    /* home directory drive string */
+               char * logon_script; /* logon script string */
+               char * profile_path; /* profile path string */
+               char * acct_desc  ;  /* user description string */
+               char * workstations; /* login from workstations string */
+               char * unknown_str ; /* don't know what this is, yet. */
+               char * munged_dial ; /* munged path name and dial-back tel number */
+               
+               uid_t uid;          /* this is a unix uid_t */
+               gid_t gid;          /* this is a unix gid_t */
+               uint32 user_rid;    /* Primary User ID */
+               uint32 group_rid;   /* Primary Group ID */
+               
+               DATA_BLOB lm_pw; /* .data is Null if no password */
+               DATA_BLOB nt_pw; /* .data is Null if no password */
+               
+               uint16 acct_ctrl; /* account info (ACB_xxxx bit-mask) */
+               uint32 unknown_3; /* 0x00ff ffff */
+               
+               uint16 logon_divs; /* 168 - number of hours in a week */
+               uint32 hours_len; /* normally 21 bytes */
+               uint8 hours[MAX_HOURS_LEN];
+               
+               uint32 unknown_5; /* 0x0002 0000 */
+               uint32 unknown_6; /* 0x0000 04ec */
+       } private;
+       /* Lets see if the remaining code can get the hint that you
+          are meant to use the pdb_...() functions. */
        
 } SAM_ACCOUNT;
 
+/*
+ * Flags for account policy.
+ */
+#define AP_MIN_PASSWORD_LEN            1
+#define AP_PASSWORD_HISTORY            2
+#define AP_USER_MUST_LOGON_TO_CHG_PASS 3
+#define AP_MAX_PASSWORD_AGE            4
+#define AP_MIN_PASSWORD_AGE            5
+#define AP_LOCK_ACCOUNT_DURATION       6
+#define AP_RESET_COUNT_TIME            7
+#define AP_BAD_ATTEMPT_LOCKOUT         8
+#define AP_TIME_TO_LOGOUT              9
+
+
 /*
  * Flags for local user manipulation.
  */
@@ -641,6 +669,8 @@ typedef struct sam_passwd
 #define LOCAL_TRUST_ACCOUNT 0x10
 #define LOCAL_SET_NO_PASSWORD 0x20
 #define LOCAL_SET_PASSWORD 0x40
+#define LOCAL_SET_LDAP_ADMIN_PW 0x80
+#define LOCAL_INTERDOM_ACCOUNT 0x100
 
 /* key and data in the connections database - used in smbstatus and smbd */
 struct connections_key {
@@ -1021,11 +1051,11 @@ struct bitmap {
 /* Generic access masks & rights. */
 #define SPECIFIC_RIGHTS_MASK 0x00FFFFL
 #define STANDARD_RIGHTS_MASK 0xFF0000L
-#define DELETE_ACCESS        (1L<<16)
-#define READ_CONTROL_ACCESS  (1L<<17)
-#define WRITE_DAC_ACCESS     (1L<<18)
-#define WRITE_OWNER_ACCESS   (1L<<19)
-#define SYNCHRONIZE_ACCESS   (1L<<20)
+#define DELETE_ACCESS        (1L<<16) /* 0x00010000 */
+#define READ_CONTROL_ACCESS  (1L<<17) /* 0x00020000 */
+#define WRITE_DAC_ACCESS     (1L<<18) /* 0x00040000 */
+#define WRITE_OWNER_ACCESS   (1L<<19) /* 0x00080000 */
+#define SYNCHRONIZE_ACCESS   (1L<<20) /* 0x00100000 */
 
 /* Combinations of standard masks. */
 #define STANDARD_RIGHTS_ALL_ACCESS (DELETE_ACCESS|READ_CONTROL_ACCESS|WRITE_DAC_ACCESS|WRITE_OWNER_ACCESS|SYNCHRONIZE_ACCESS)
@@ -1034,12 +1064,12 @@ struct bitmap {
 #define STANDARD_RIGHTS_REQUIRED_ACCESS (DELETE_ACCESS|READ_CONTROL_ACCESS|WRITE_DAC_ACCESS|WRITE_OWNER_ACCESS)
 #define STANDARD_RIGHTS_WRITE_ACCESS (READ_CONTROL_ACCESS)
 
-#define SYSTEM_SECURITY_ACCESS (1L<<24)
-#define MAXIMUM_ALLOWED_ACCESS (1L<<25)
-#define GENERIC_ALL_ACCESS   (1<<28)
-#define GENERIC_EXECUTE_ACCESS  (1<<29)
-#define GENERIC_WRITE_ACCESS   (1<<30)
-#define GENERIC_READ_ACCESS   (((unsigned)1)<<31)
+#define SYSTEM_SECURITY_ACCESS (1L<<24)                  /* 0x01000000 */
+#define MAXIMUM_ALLOWED_ACCESS (1L<<25)                  /* 0x02000000 */
+#define GENERIC_ALL_ACCESS     (1<<28)            /* 0x10000000 */
+#define GENERIC_EXECUTE_ACCESS (1<<29)            /* 0x20000000 */
+#define GENERIC_WRITE_ACCESS   (1<<30)            /* 0x40000000 */
+#define GENERIC_READ_ACCESS   (((unsigned)1)<<31) /* 0x80000000 */
 
 /* Mapping of generic access rights for files to specific rights. */
 
@@ -1251,6 +1281,7 @@ char *strdup(char *s);
    
 #define FLAGS2_LONG_PATH_COMPONENTS   0x0001
 #define FLAGS2_EXTENDED_ATTRIBUTES    0x0002
+#define FLAGS2_IS_LONG_NAME           0x0040
 #define FLAGS2_EXTENDED_SECURITY      0x0800 
 #define FLAGS2_DFS_PATHNAMES          0x1000
 #define FLAGS2_READ_PERMIT_NO_EXECUTE 0x2000
@@ -1275,6 +1306,7 @@ char *strdup(char *s);
 #define CAP_W2K_SMBS         0x2000
 #define CAP_LARGE_READX      0x4000
 #define CAP_LARGE_WRITEX     0x8000
+#define CAP_UNIX                0x800000 /* Capabilities for UNIX extensions. Created by HP. */
 #define CAP_EXTENDED_SECURITY 0x80000000
 
 /* protocol types. It assumes that higher protocols include lower protocols
@@ -1302,6 +1334,12 @@ enum printing_types {PRINT_BSD,PRINT_SYSV,PRINT_AIX,PRINT_HPUX,
 #endif /* DEVELOPER */
 };
 
+/* LDAP schema types */
+enum schema_types {SCHEMA_COMPAT, SCHEMA_AD, SCHEMA_SAMBA};
+
+/* LDAP SSL options */
+enum ldap_ssl_types {LDAP_SSL_ON, LDAP_SSL_OFF, LDAP_SSL_START_TLS};
+
 /* Remote architectures we know about. */
 enum remote_arch_types {RA_UNKNOWN, RA_WFWG, RA_OS2, RA_WIN95, RA_WINNT, RA_WIN2K, RA_SAMBA};
 
@@ -1351,7 +1389,7 @@ extern int global_is_multibyte_codepage;
 #define COPYBUF_SIZE (8*1024)
 
 /* 
- * Integers used to override error codes. 
+ * Values used to override error codes. 
  */
 extern int unix_ERR_class;
 extern int unix_ERR_code;
@@ -1509,12 +1547,6 @@ struct node_status {
        unsigned char flags;
 };
 
-
-
-#define AGENT_CMD_CON       0
-#define AGENT_CMD_CON_ANON  2
-#define AGENT_CMD_CON_REUSE 1
-
 struct pwd_info
 {
        BOOL null_pwd;
@@ -1537,18 +1569,6 @@ struct pwd_info
        uchar sess_key[16];
 };
 
-/*
- * Network Computing Architechture Context Name Named Pipe
- * See MSDN docs for more information
- */
-struct ncacn_np
-{
-        fstring pipe_name;
-        struct cli_state *smb;
-        uint16 fnum;
-        BOOL initialised;
-};
-
 #include "rpc_creds.h"
 #include "rpc_misc.h"
 #include "rpc_secdes.h"
@@ -1562,6 +1582,8 @@ typedef struct user_struct
        gid_t gid; /* gid of a validated user */
 
        userdom_struct user;
+       char *homedir;
+       
        BOOL guest;
 
        /* following groups stuff added by ih */
@@ -1571,15 +1593,18 @@ typedef struct user_struct
 
        NT_USER_TOKEN *nt_user_token;
 
+       uint8 session_key[16];
+
        int session_id; /* used by utmp and pam session code */
 } user_struct;
 
-/* used to hold an arbitrary blob of data */
-typedef struct {
-       uint8 *data;
-       size_t length;
-} DATA_BLOB;
 
+struct unix_error_map {
+       int unix_error;
+       int dos_class;
+       int dos_code;
+       NTSTATUS nt_error;
+};
 
 #include "ntdomain.h"
 
@@ -1621,7 +1646,6 @@ typedef struct {
 #define SAFE_NETBIOS_CHARS ". -_"
 
 #include "nsswitch/winbindd_nss.h"
-#include "smb_acls.h"
 
 /* generic iconv conversion structure */
 typedef struct {
@@ -1632,6 +1656,13 @@ typedef struct {
        size_t (*push)(void *cd, char **inbuf, size_t *inbytesleft,
                       char **outbuf, size_t *outbytesleft);
        void *cd_direct, *cd_pull, *cd_push;
+       char *from_name, *to_name;
 } *smb_iconv_t;
 
+/* The maximum length of a trust account password.
+   Used when we randomly create it, 15 char passwords
+   exceed NT4's max password length */
+
+#define DEFAULT_TRUST_ACCOUNT_PASSWORD_LENGTH 14
+
 #endif /* _SMB_H */