lib/param: swap preferred name for 'lock dir' to match s3
[idra/samba.git] / lib / param / loadparm.c
index 2a251c140d393afcec9caee90c4dcb1f9ef35a1e..08d46b276546babb2ff61ea4e658d91199e66589 100644 (file)
@@ -65,6 +65,7 @@
 #include "s3_param.h"
 #include "lib/util/bitmap.h"
 #include "libcli/smb/smb_constants.h"
+#include "source4/dns_server/dns_update.h"
 
 #define standard_sub_basic talloc_strdup
 
@@ -81,6 +82,10 @@ static bool defaults_saved = false;
        char *tls_dhpfile;                                              \
        char *loglevel;                                                 \
        char *panic_action;                                             \
+       int server_role;                                                \
+       int security;                                                   \
+       int domain_master;                                              \
+       int domain_logons;                                              \
        int bPreferredMaster;
 
 #include "param_global.h"
@@ -100,77 +105,7 @@ static bool handle_debuglevel(struct loadparm_context *lp_ctx, int unused,
 static bool handle_logfile(struct loadparm_context *lp_ctx, int unused,
                           const char *pszParmValue, char **ptr);
 
-static const struct enum_list enum_protocol[] = {
-       {PROTOCOL_SMB2_02, "SMB2"},
-       {PROTOCOL_SMB2_02, "SMB2_02"},
-       {PROTOCOL_NT1, "NT1"},
-       {PROTOCOL_LANMAN2, "LANMAN2"},
-       {PROTOCOL_LANMAN1, "LANMAN1"},
-       {PROTOCOL_CORE, "CORE"},
-       {PROTOCOL_COREPLUS, "COREPLUS"},
-       {PROTOCOL_COREPLUS, "CORE+"},
-       {-1, NULL}
-};
-
-static const struct enum_list enum_security[] = {
-       {SEC_SHARE, "SHARE"},
-       {SEC_USER, "USER"},
-       {SEC_ADS, "ADS"},
-       {-1, NULL}
-};
-
-static const struct enum_list enum_bool_auto[] = {
-       {false, "No"},
-       {false, "False"},
-       {false, "0"},
-       {true, "Yes"},
-       {true, "True"},
-       {true, "1"},
-       {Auto, "Auto"},
-       {-1, NULL}
-};
-
-/* Client-side offline caching policy types */
-
-static const struct enum_list enum_csc_policy[] = {
-       {CSC_POLICY_MANUAL, "manual"},
-       {CSC_POLICY_DOCUMENTS, "documents"},
-       {CSC_POLICY_PROGRAMS, "programs"},
-       {CSC_POLICY_DISABLE, "disable"},
-       {-1, NULL}
-};
-
-/* SMB signing types. */
-static const struct enum_list enum_smb_signing_vals[] = {
-       {SMB_SIGNING_DEFAULT, "default"},
-       {SMB_SIGNING_OFF, "No"},
-       {SMB_SIGNING_OFF, "False"},
-       {SMB_SIGNING_OFF, "0"},
-       {SMB_SIGNING_OFF, "Off"},
-       {SMB_SIGNING_OFF, "disabled"},
-       {SMB_SIGNING_IF_REQUIRED, "if_required"},
-       {SMB_SIGNING_IF_REQUIRED, "Yes"},
-       {SMB_SIGNING_IF_REQUIRED, "True"},
-       {SMB_SIGNING_IF_REQUIRED, "1"},
-       {SMB_SIGNING_IF_REQUIRED, "On"},
-       {SMB_SIGNING_IF_REQUIRED, "enabled"},
-       {SMB_SIGNING_IF_REQUIRED, "auto"},
-       {SMB_SIGNING_REQUIRED, "required"},
-       {SMB_SIGNING_REQUIRED, "mandatory"},
-       {SMB_SIGNING_REQUIRED, "force"},
-       {SMB_SIGNING_REQUIRED, "forced"},
-       {SMB_SIGNING_REQUIRED, "enforced"},
-       {-1, NULL}
-};
-
-static const struct enum_list enum_server_role[] = {
-       {ROLE_STANDALONE, "standalone"},
-       {ROLE_DOMAIN_MEMBER, "member server"},
-       {ROLE_DOMAIN_MEMBER, "member"},
-       {ROLE_DOMAIN_CONTROLLER, "domain controller"},
-       {ROLE_DOMAIN_CONTROLLER, "dc"},
-       {-1, NULL}
-};
+#include "param_enums.c"
 
 #define GLOBAL_VAR(name) offsetof(struct loadparm_global, name)
 #define LOCAL_VAR(name) offsetof(struct loadparm_service, name)
@@ -184,6 +119,22 @@ static struct parm_struct parm_table[] = {
                .special        = NULL,
                .enum_list      = enum_server_role
        },
+       {
+               .label          = "domain logons",
+               .type           = P_ENUM,
+               .p_class        = P_GLOBAL,
+               .offset         = GLOBAL_VAR(domain_logons),
+               .special        = NULL,
+               .enum_list      = enum_bool_auto
+       },
+       {
+               .label          = "domain master",
+               .type           = P_ENUM,
+               .p_class        = P_GLOBAL,
+               .offset         = GLOBAL_VAR(domain_master),
+               .special        = NULL,
+               .enum_list      = enum_bool_auto
+       },
        {
                .label          = "dos charset",
                .type           = P_STRING,
@@ -214,7 +165,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_LOCAL,
                .offset         = LOCAL_VAR(comment),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT
        },
        {
                .label          = "path",
@@ -222,7 +174,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_LOCAL,
                .offset         = LOCAL_VAR(szPath),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT,
        },
        {
                .label          = "directory",
@@ -230,7 +183,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_LOCAL,
                .offset         = LOCAL_VAR(szPath),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_HIDE,
        },
        {
                .label          = "workgroup",
@@ -238,7 +192,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(szWorkgroup),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD,
        },
        {
                .label          = "realm",
@@ -246,7 +201,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(szRealm),
                .special        = handle_realm,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD,
        },
        {
                .label          = "netbios name",
@@ -254,7 +210,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(szNetbiosName),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD,
        },
        {
                .label          = "netbios aliases",
@@ -270,7 +227,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(szNetbiosScope),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED,
        },
        {
                .label          = "server string",
@@ -278,7 +236,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(szServerString),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_BASIC | FLAG_ADVANCED,
        },
        {
                .label          = "interfaces",
@@ -286,7 +245,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(szInterfaces),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD,
        },
        {
                .label          = "bind interfaces only",
@@ -294,7 +254,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(bBindInterfacesOnly),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED | FLAG_WIZARD,
        },
        {
                .label          = "ntvfs handler",
@@ -359,7 +320,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(bNullPasswords),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED | FLAG_DEPRECATED,
        },
        {
                .label          = "obey pam restrictions",
@@ -367,7 +329,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(bObeyPamRestrictions),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED,
        },
        {
                .label          = "password server",
@@ -407,7 +370,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(bLanmanAuth),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED,
        },
        {
                .label          = "ntlm auth",
@@ -415,7 +379,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(bNTLMAuth),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED,
        },
        {
                .label          = "client NTLMv2 auth",
@@ -423,7 +388,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(bClientNTLMv2Auth),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED,
        },
        {
                .label          = "client lanman auth",
@@ -431,7 +397,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(bClientLanManAuth),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED,
        },
        {
                .label          = "client plaintext auth",
@@ -439,7 +406,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(bClientPlaintextAuth),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED,
        },
        {
                .label          = "client use spnego principal",
@@ -531,7 +499,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(logfile),
                .special        = handle_logfile,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED,
        },
 
        {
@@ -644,7 +613,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(bLargeReadwrite),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED,
        },
        {
                .label          = "server max protocol",
@@ -654,6 +624,23 @@ static struct parm_struct parm_table[] = {
                .special        = NULL,
                .enum_list      = enum_protocol
        },
+       {
+               .label          = "max protocol",
+               .type           = P_ENUM,
+               .p_class        = P_GLOBAL,
+               .offset         = GLOBAL_VAR(srv_maxprotocol),
+               .special        = NULL,
+               .enum_list      = enum_protocol
+       },
+       {
+               .label          = "protocol",
+               .type           = P_ENUM,
+               .p_class        = P_GLOBAL,
+               .offset         = GLOBAL_VAR(srv_maxprotocol),
+               .special        = NULL,
+               .enum_list      = enum_protocol,
+               .flags          = FLAG_ADVANCED,
+       },
        {
                .label          = "server min protocol",
                .type           = P_ENUM,
@@ -662,6 +649,14 @@ static struct parm_struct parm_table[] = {
                .special        = NULL,
                .enum_list      = enum_protocol
        },
+       {
+               .label          = "min protocol",
+               .type           = P_ENUM,
+               .p_class        = P_GLOBAL,
+               .offset         = GLOBAL_VAR(srv_minprotocol),
+               .special        = NULL,
+               .enum_list      = enum_protocol
+       },
        {
                .label          = "client max protocol",
                .type           = P_ENUM,
@@ -726,7 +721,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(max_mux),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED,
        },
        {
                .label          = "max xmit",
@@ -734,7 +730,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(max_xmit),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED,
        },
 
        {
@@ -751,7 +748,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(max_wins_ttl),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED,
        },
        {
                .label          = "min wins ttl",
@@ -759,7 +757,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(min_wins_ttl),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED,
        },
        {
                .label          = "time server",
@@ -767,7 +766,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(bTimeServer),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED,
        },
        {
                .label          = "unix extensions",
@@ -775,7 +775,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(bUnixExtensions),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED,
        },
        {
                .label          = "use spnego",
@@ -791,7 +792,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(server_signing),
                .special        = NULL,
-               .enum_list      = enum_smb_signing_vals
+               .enum_list      = enum_smb_signing_vals,
+               .flags          = FLAG_ADVANCED,
        },
        {
                .label          = "client signing",
@@ -816,7 +818,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_LOCAL,
                .offset         = LOCAL_VAR(iMaxConnections),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED | FLAG_SHARE,
        },
        {
                .label          = "paranoid server security",
@@ -892,7 +895,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_LOCAL,
                .offset         = LOCAL_VAR(szPrintername),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED | FLAG_PRINT,
        },
        {
                .label          = "printer",
@@ -900,7 +904,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_LOCAL,
                .offset         = LOCAL_VAR(szPrintername),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_HIDE,
        },
 
        {
@@ -934,7 +939,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(bPreferredMaster),
                .special        = NULL,
-               .enum_list      = enum_bool_auto
+               .enum_list      = enum_bool_auto,
+               .flags          = FLAG_BASIC | FLAG_ADVANCED,
        },
        {
                .label          = "prefered master",
@@ -942,7 +948,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(bPreferredMaster),
                .special        = NULL,
-               .enum_list      = enum_bool_auto
+               .enum_list      = enum_bool_auto,
+               .flags          = FLAG_HIDE,
        },
        {
                .label          = "local master",
@@ -958,7 +965,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_LOCAL,
                .offset         = LOCAL_VAR(bBrowseable),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT,
        },
        {
                .label          = "browsable",
@@ -999,7 +1007,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(szWINSHook),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED,
        },
 
        {
@@ -1008,7 +1017,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_LOCAL,
                .offset         = LOCAL_VAR(iCSCPolicy),
                .special        = NULL,
-               .enum_list      = enum_csc_policy
+               .enum_list      = enum_csc_policy,
+               .flags          = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
        },
 
        {
@@ -1042,7 +1052,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(szAutoServices),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED,
        },
        {
                .label          = "auto services",
@@ -1050,23 +1061,26 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(szAutoServices),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED,
        },
        {
-               .label          = "lock dir",
+               .label          = "lock directory",
                .type           = P_STRING,
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(szLockDir),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED,
        },
        {
-               .label          = "lock directory",
+               .label          = "lock dir",
                .type           = P_STRING,
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(szLockDir),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_HIDE,
        },
        {
                .label          = "state directory",
@@ -1074,7 +1088,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(szStateDir),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED,
        },
        {
                .label          = "cache directory",
@@ -1082,7 +1097,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(szCacheDir),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED,
        },
        {
                .label          = "pid directory",
@@ -1107,7 +1123,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_LOCAL,
                .offset         = LOCAL_VAR(szCopy),
                .special        = handle_copy,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_HIDE,
        },
        {
                .label          = "include",
@@ -1132,7 +1149,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_LOCAL,
                .offset         = LOCAL_VAR(volume),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED | FLAG_SHARE,
        },
        {
                .label          = "fstype",
@@ -1166,7 +1184,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(bHostMSDfs),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED,
        },
        {
                .label          = "winbind separator",
@@ -1182,7 +1201,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(szWinbinddSocketDirectory),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED,
        },
        {
                .label          = "winbindd privileged socket directory",
@@ -1190,7 +1210,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(szWinbinddPrivilegedSocketDirectory),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED,
        },
        {
                .label          = "winbind sealed pipes",
@@ -1198,7 +1219,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(bWinbindSealedPipes),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED,
        },
        {
                .label          = "template shell",
@@ -1206,7 +1228,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(szTemplateShell),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED,
        },
        {
                .label          = "template homedir",
@@ -1214,7 +1237,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(szTemplateHomedir),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED,
        },
        {
                .label          = "idmap trusted only",
@@ -1222,7 +1246,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(bIdmapTrustedOnly),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED,
        },
 
        {
@@ -1231,7 +1256,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(szNTPSignDSocketDirectory),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED,
        },
        {
                .label          = "rndc command",
@@ -1239,7 +1265,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(szRNDCCommand),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED,
        },
        {
                .label          = "dns update command",
@@ -1247,7 +1274,8 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(szDNSUpdateCommand),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED,
        },
        {
                .label          = "spn update command",
@@ -1255,7 +1283,17 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(szSPNUpdateCommand),
                .special        = NULL,
-               .enum_list      = NULL
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED,
+       },
+       {
+               .label          = "samba kcc command",
+               .type           = P_CMDLIST,
+               .p_class        = P_GLOBAL,
+               .offset         = GLOBAL_VAR(szSambaKCCCommand),
+               .special        = NULL,
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED,
        },
        {
                .label          = "nsupdate command",
@@ -1263,6 +1301,33 @@ static struct parm_struct parm_table[] = {
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(szNSUpdateCommand),
                .special        = NULL,
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED,
+       },
+       {
+               .label          = "allow dns updates",
+               .type           = P_ENUM,
+               .p_class        = P_GLOBAL,
+               .offset         = GLOBAL_VAR(allow_dns_updates),
+               .special        = NULL,
+               .enum_list      = enum_dns_update_settings,
+               .flags          = FLAG_ADVANCED,
+       },
+       {
+               .label          = "dns forwarder",
+               .type           = P_STRING,
+               .p_class        = P_GLOBAL,
+               .offset         = GLOBAL_VAR(dns_forwarder),
+               .special        = NULL,
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED,
+       },
+       {
+               .label          = "dns recursive queries",
+               .type           = P_BOOL,
+               .p_class        = P_GLOBAL,
+               .offset         = GLOBAL_VAR(dns_recursive_queries),
+               .special        = NULL,
                .enum_list      = NULL
        },
 
@@ -1460,7 +1525,6 @@ static struct loadparm_context *global_loadparm_context;
 
 #include "lib/param/param_functions.c"
 
-FN_GLOBAL_INTEGER(server_role, server_role)
 FN_GLOBAL_LIST(smb_ports, smb_ports)
 FN_GLOBAL_INTEGER(nbt_port, nbt_port)
 FN_GLOBAL_INTEGER(dgram_port, dgram_port)
@@ -1490,6 +1554,7 @@ FN_GLOBAL_STRING(piddir, szPidDir)
 FN_GLOBAL_LIST(rndc_command, szRNDCCommand)
 FN_GLOBAL_LIST(dns_update_command, szDNSUpdateCommand)
 FN_GLOBAL_LIST(spn_update_command, szSPNUpdateCommand)
+FN_GLOBAL_LIST(samba_kcc_command, szSambaKCCCommand)
 FN_GLOBAL_LIST(nsupdate_command, szNSUpdateCommand)
 FN_GLOBAL_LIST(dcerpc_endpoint_servers, dcerpc_ep_servers)
 FN_GLOBAL_LIST(server_services, server_services)
@@ -1544,9 +1609,12 @@ FN_GLOBAL_INTEGER(srv_maxprotocol, srv_maxprotocol)
 FN_GLOBAL_INTEGER(srv_minprotocol, srv_minprotocol)
 FN_GLOBAL_INTEGER(cli_maxprotocol, cli_maxprotocol)
 FN_GLOBAL_INTEGER(cli_minprotocol, cli_minprotocol)
-FN_GLOBAL_INTEGER(security, security)
 FN_GLOBAL_BOOL(paranoid_server_security, paranoid_server_security)
 
+FN_GLOBAL_INTEGER(allow_dns_updates, allow_dns_updates)
+FN_GLOBAL_CONST_STRING(dns_forwarder, dns_forwarder)
+FN_GLOBAL_BOOL(dns_recursive_queries, dns_recursive_queries)
+
 FN_GLOBAL_INTEGER(server_signing, server_signing)
 FN_GLOBAL_INTEGER(client_signing, client_signing)
 
@@ -2132,6 +2200,7 @@ static void copy_service(struct loadparm_service *pserviceDest,
                                        break;
 
                                case P_INTEGER:
+                               case P_BYTES:
                                case P_OCTAL:
                                case P_ENUM:
                                        *(int *)dest_ptr = *(int *)src_ptr;
@@ -2173,7 +2242,7 @@ static void copy_service(struct loadparm_service *pserviceDest,
                        /* If we already have same option, override it */
                        if (strcmp(pdata->key, data->key) == 0) {
                                talloc_free(pdata->value);
-                               pdata->value = talloc_reference(pdata,
+                               pdata->value = talloc_strdup(pdata,
                                                             data->value);
                                not_added = false;
                                break;
@@ -2184,8 +2253,8 @@ static void copy_service(struct loadparm_service *pserviceDest,
                        paramo = talloc_zero(pserviceDest, struct parmlist_entry);
                        if (paramo == NULL)
                                smb_panic("OOM");
-                       paramo->key = talloc_reference(paramo, data->key);
-                       paramo->value = talloc_reference(paramo, data->value);
+                       paramo->key = talloc_strdup(paramo, data->key);
+                       paramo->value = talloc_strdup(paramo, data->value);
                        DLIST_ADD(pserviceDest->param_opt, paramo);
                }
                data = data->next;
@@ -2552,23 +2621,13 @@ static bool set_variable(TALLOC_CTX *mem_ctx, int parmnum, void *parm_ptr,
                        char **new_list = str_list_make(mem_ctx,
                                                        pszParmValue, NULL);
                        for (i=0; new_list[i]; i++) {
-                               if (new_list[i][0] == '+' && new_list[i][1] &&
-                                   (!str_list_check(*(const char ***)parm_ptr,
-                                                    &new_list[i][1]))) {
-                                       *(const char ***)parm_ptr = str_list_add(*(const char ***)parm_ptr,
-                                                                                &new_list[i][1]);
-                               } else if (new_list[i][0] == '-' && new_list[i][1]) {
-#if 0 /* This is commented out because we sometimes parse the list
-       * twice, and so we can't assert on this */
+                               if (new_list[i][0] == '+' && new_list[i][1]) {
                                        if (!str_list_check(*(const char ***)parm_ptr,
                                                            &new_list[i][1])) {
-                                               DEBUG(0, ("Unsupported value for: %s = %s, %s is not in the original list [%s]\n",
-                                                         pszParmName, pszParmValue, new_list[i],
-                                                         str_list_join_shell(mem_ctx, *(const char ***)parm_ptr, ' ')));
-                                               return false;
-
+                                               *(const char ***)parm_ptr = str_list_add(*(const char ***)parm_ptr,
+                                                                                        &new_list[i][1]);
                                        }
-#endif
+                               } else if (new_list[i][0] == '-' && new_list[i][1]) {
                                        str_list_remove(*(const char ***)parm_ptr,
                                                        &new_list[i][1]);
                                } else {
@@ -2608,6 +2667,9 @@ static bool set_variable(TALLOC_CTX *mem_ctx, int parmnum, void *parm_ptr,
                                return false;
                        }
                        break;
+
+               case P_SEP:
+                       break;
        }
 
 mark_non_default:
@@ -3010,6 +3072,8 @@ static bool is_default(struct loadparm_service *sDefault, int i)
                case P_ENUM:
                        return parm_table[i].def.ivalue ==
                                *(int *)def_ptr;
+               case P_SEP:
+                       break;
        }
        return false;
 }
@@ -3280,7 +3344,9 @@ struct loadparm_context *loadparm_init(TALLOC_CTX *mem_ctx)
 
        lpcfg_do_global_parameter(lp_ctx, "share backend", "classic");
 
-       lpcfg_do_global_parameter(lp_ctx, "server role", "standalone");
+       lpcfg_do_global_parameter(lp_ctx, "server role", "auto");
+       lpcfg_do_global_parameter(lp_ctx, "domain logons", "No");
+       lpcfg_do_global_parameter(lp_ctx, "domain master", "Auto");
 
        /* options that can be set on the command line must be initialised via
           the slower lpcfg_do_global_parameter() to ensure that FLAG_CMDLINE is obeyed */
@@ -3336,13 +3402,15 @@ struct loadparm_context *loadparm_init(TALLOC_CTX *mem_ctx)
 
        lpcfg_do_global_parameter(lp_ctx, "max mux", "50");
        lpcfg_do_global_parameter(lp_ctx, "max xmit", "12288");
+       lpcfg_do_global_parameter(lp_ctx, "host msdfs", "true");
+
        lpcfg_do_global_parameter(lp_ctx, "password level", "0");
        lpcfg_do_global_parameter(lp_ctx, "LargeReadwrite", "True");
        lpcfg_do_global_parameter(lp_ctx, "server min protocol", "CORE");
        lpcfg_do_global_parameter(lp_ctx, "server max protocol", "NT1");
        lpcfg_do_global_parameter(lp_ctx, "client min protocol", "CORE");
        lpcfg_do_global_parameter(lp_ctx, "client max protocol", "NT1");
-       lpcfg_do_global_parameter(lp_ctx, "security", "USER");
+       lpcfg_do_global_parameter(lp_ctx, "security", "AUTO");
        lpcfg_do_global_parameter(lp_ctx, "paranoid server security", "True");
        lpcfg_do_global_parameter(lp_ctx, "EncryptPasswords", "True");
        lpcfg_do_global_parameter(lp_ctx, "ReadRaw", "True");
@@ -3375,6 +3443,8 @@ struct loadparm_context *loadparm_init(TALLOC_CTX *mem_ctx)
        lpcfg_do_global_parameter(lp_ctx, "ntp signd socket directory", dyn_NTP_SIGND_SOCKET_DIR);
        lpcfg_do_global_parameter_var(lp_ctx, "dns update command", "%s/samba_dnsupdate", dyn_SCRIPTSBINDIR);
        lpcfg_do_global_parameter_var(lp_ctx, "spn update command", "%s/samba_spnupdate", dyn_SCRIPTSBINDIR);
+       lpcfg_do_global_parameter_var(lp_ctx, "samba kcc command",
+                                       "%s/samba_kcc", dyn_SCRIPTSBINDIR);
 #endif
        lpcfg_do_global_parameter(lp_ctx, "template shell", "/bin/false");
        lpcfg_do_global_parameter(lp_ctx, "template homedir", "/home/%WORKGROUP%/%ACCOUNTNAME%");
@@ -3409,6 +3479,10 @@ struct loadparm_context *loadparm_init(TALLOC_CTX *mem_ctx)
        lpcfg_do_global_parameter(lp_ctx, "rndc command", "/usr/sbin/rndc");
        lpcfg_do_global_parameter(lp_ctx, "nsupdate command", "/usr/bin/nsupdate -g");
 
+        lpcfg_do_global_parameter(lp_ctx, "allow dns updates", "False");
+        lpcfg_do_global_parameter(lp_ctx, "dns recursive queries", "False");
+        lpcfg_do_global_parameter(lp_ctx, "dns forwarder", "");
+
        for (i = 0; parm_table[i].label; i++) {
                if (!(lp_ctx->flags[i] & FLAG_CMDLINE)) {
                        lp_ctx->flags[i] |= FLAG_DEFAULT;
@@ -3762,7 +3836,7 @@ _PUBLIC_ char *lpcfg_tls_dhpfile(TALLOC_CTX *mem_ctx, struct loadparm_context *l
 
 struct gensec_settings *lpcfg_gensec_settings(TALLOC_CTX *mem_ctx, struct loadparm_context *lp_ctx)
 {
-       struct gensec_settings *settings = talloc(mem_ctx, struct gensec_settings);
+       struct gensec_settings *settings = talloc_zero(mem_ctx, struct gensec_settings);
        if (settings == NULL)
                return NULL;
        SMB_ASSERT(lp_ctx != NULL);
@@ -3771,3 +3845,25 @@ struct gensec_settings *lpcfg_gensec_settings(TALLOC_CTX *mem_ctx, struct loadpa
        return settings;
 }
 
+int lpcfg_server_role(struct loadparm_context *lp_ctx)
+{
+       if (lp_ctx->s3_fns) {
+               return lp_ctx->s3_fns->server_role();
+       }
+
+       return lp_find_server_role(lp_ctx->globals->server_role,
+                                  lp_ctx->globals->security,
+                                  lp_ctx->globals->domain_logons,
+                                  (lp_ctx->globals->domain_master == true) ||
+                                  (lp_ctx->globals->domain_master == Auto));
+}
+
+int lpcfg_security(struct loadparm_context *lp_ctx)
+{
+       if (lp_ctx->s3_fns) {
+               return lp_ctx->s3_fns->security();
+       }
+
+       return lp_find_security(lp_ctx->globals->server_role,
+                               lp_ctx->globals->security);
+}