r13244: Allow control of the location of the Samba3-compatible winbindd pipe
[jelmer/samba4-debian.git] / source / param / loadparm.c
index 3f6a22d404f4c76ed3e1d55470d0e35097d803be..96ba2bbc736795b7dfa1dcbe26cbb328d82835ea 100644 (file)
  */
 
 #include "includes.h"
+#include "smb.h"
 #include "version.h"
 #include "dynconfig.h"
+#include "pstring.h"
 #include "system/time.h"
 #include "system/iconv.h"
-#include "system/network.h"
-#include "system/printing.h"
 #include "librpc/gen_ndr/ndr_svcctl.h"
 #include "librpc/gen_ndr/ndr_samr.h"
-#include "librpc/gen_ndr/ndr_nbt.h"
 #include "dlinklist.h"
 #include "param/loadparm.h"
 
 static BOOL bLoaded = False;
 
-#ifndef GLOBAL_NAME
-#define GLOBAL_NAME "global"
-#endif
-
-#ifndef PRINTERS_NAME
-#define PRINTERS_NAME "printers"
-#endif
-
-#ifndef HOMES_NAME
-#define HOMES_NAME "homes"
-#endif
-
 /* some helpful bits */
 #define LP_SNUM_OK(i) (((i) >= 0) && ((i) < iNumServices) && ServicePtrs[(i)]->valid)
 #define VALID(i) ServicePtrs[i]->valid
@@ -101,6 +88,8 @@ struct param_opt {
  */
 typedef struct
 {
+       int server_role;
+
        char **smb_ports;
        char *dos_charset;
        char *unix_charset;
@@ -114,9 +103,9 @@ typedef struct
        char *szPasswdChat;
        char *szLogFile;
        char *szConfigFile;
-       char *szSMBPasswdFile;
        char *szSAM_URL;
        char *szSPOOLSS_URL;
+       char *szWINS_CONFIG_URL;
        char *szWINS_URL;
        char *szPrivateDir;
        char **jsInclude;
@@ -138,6 +127,8 @@ typedef struct
        char **server_services;
        char *ntptr_providor;
        char *szWinbindSeparator;
+       char *szWinbinddSocketDirectory;
+       BOOL bWinbindSealedPipes;
        char *swat_directory;
        BOOL tls_enabled;
        char *tls_keyfile;
@@ -159,13 +150,14 @@ typedef struct
        int dgram_port;
        int cldap_port;
        int krb5_port;
+       int kpasswd_port;
        int web_port;
        char *socket_options;
        BOOL bWINSsupport;
+       BOOL bWINSdnsProxy;
+       char *szWINSHook; 
        BOOL bLocalMaster;
        BOOL bPreferredMaster;
-       BOOL bDomainMaster;
-       BOOL bDomainLogons;
        BOOL bEncryptPasswords;
        BOOL bNullPasswords;
        BOOL bObeyPamRestrictions;
@@ -184,6 +176,7 @@ typedef struct
        BOOL bClientPlaintextAuth;
        BOOL bClientLanManAuth;
        BOOL bClientNTLMv2Auth;
+       BOOL client_use_spnego_principal;
        BOOL bHostMSDfs;
        BOOL bUnicode;
        BOOL bUnixExtensions;
@@ -273,7 +266,6 @@ static service **ServicePtrs = NULL;
 static int iNumServices = 0;
 static int iServiceIndex = 0;
 static BOOL bInGlobalSection = True;
-static int server_role;
 static int default_server_announce;
 
 #define NUMPARAMETERS (sizeof(parm_table) / sizeof(struct parm_struct))
@@ -282,7 +274,6 @@ static int default_server_announce;
 static BOOL handle_include(const char *pszParmValue, char **ptr);
 static BOOL handle_copy(const char *pszParmValue, char **ptr);
 
-static void set_server_role(void);
 static void set_default_server_announce_type(void);
 
 static const struct enum_list enum_protocol[] = {
@@ -298,11 +289,6 @@ static const struct enum_list enum_protocol[] = {
 static const struct enum_list enum_security[] = {
        {SEC_SHARE, "SHARE"},
        {SEC_USER, "USER"},
-       {SEC_SERVER, "SERVER"},
-       {SEC_DOMAIN, "DOMAIN"},
-#ifdef HAVE_ADS
-       {SEC_ADS, "ADS"},
-#endif
        {-1, NULL}
 };
 
@@ -367,6 +353,14 @@ static const struct enum_list enum_smb_signing_vals[] = {
        {-1, NULL}
 };
 
+static const struct enum_list enum_server_role[] = {
+       {ROLE_STANDALONE, "standalone"},
+       {ROLE_DOMAIN_MEMBER, "member server"},
+       {ROLE_DOMAIN_BDC, "bdc"},
+       {ROLE_DOMAIN_PDC, "pdc"},
+       {-1, NULL}
+};
+
 
 /* Note: We do not initialise the defaults union - it is not allowed in ANSI C
  *
@@ -381,6 +375,8 @@ static const struct enum_list enum_smb_signing_vals[] = {
 static struct parm_struct parm_table[] = {
        {"Base Options", P_SEP, P_SEPARATOR},
 
+       {"server role", P_ENUM, P_GLOBAL, &Globals.server_role, NULL, enum_server_role, FLAG_BASIC},
+
        {"dos charset", P_STRING, P_GLOBAL, &Globals.dos_charset, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
        {"unix charset", P_STRING, P_GLOBAL, &Globals.unix_charset, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
        {"ncalrpc dir", P_STRING, P_GLOBAL, &Globals.ncalrpc_dir, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
@@ -409,12 +405,11 @@ static struct parm_struct parm_table[] = {
        {"null passwords", P_BOOL, P_GLOBAL, &Globals.bNullPasswords, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
        {"obey pam restrictions", P_BOOL, P_GLOBAL, &Globals.bObeyPamRestrictions, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
        {"password server", P_LIST, P_GLOBAL, &Globals.szPasswordServers, NULL, NULL, FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
-       {"smb passwd file", P_STRING, P_GLOBAL, &Globals.szSMBPasswdFile, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
        {"sam database", P_STRING, P_GLOBAL, &Globals.szSAM_URL, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
        {"spoolss database", P_STRING, P_GLOBAL, &Globals.szSPOOLSS_URL, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
+       {"wins config database", P_STRING, P_GLOBAL, &Globals.szWINS_CONFIG_URL, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
        {"wins database", P_STRING, P_GLOBAL, &Globals.szWINS_URL, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
        {"private dir", P_STRING, P_GLOBAL, &Globals.szPrivateDir, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
-       
        {"passwd chat", P_STRING, P_GLOBAL, &Globals.szPasswdChat, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
        {"password level", P_INTEGER, P_GLOBAL, &Globals.pwordlevel, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
        {"lanman auth", P_BOOL, P_GLOBAL, &Globals.bLanmanAuth, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
@@ -422,6 +417,7 @@ static struct parm_struct parm_table[] = {
        {"client NTLMv2 auth", P_BOOL, P_GLOBAL, &Globals.bClientNTLMv2Auth, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
        {"client lanman auth", P_BOOL, P_GLOBAL, &Globals.bClientLanManAuth, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
        {"client plaintext auth", P_BOOL, P_GLOBAL, &Globals.bClientPlaintextAuth, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
+       {"client use spnego principal", P_BOOL, P_GLOBAL, &Globals.client_use_spnego_principal, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
        
        {"read only", P_BOOL, P_LOCAL, &sDefault.bRead_only, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE},
 
@@ -441,6 +437,7 @@ static struct parm_struct parm_table[] = {
        {"dgram port", P_INTEGER, P_GLOBAL, &Globals.dgram_port, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
        {"cldap port", P_INTEGER, P_GLOBAL, &Globals.cldap_port, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
        {"krb5 port", P_INTEGER, P_GLOBAL, &Globals.krb5_port, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
+       {"kpasswd port", P_INTEGER, P_GLOBAL, &Globals.kpasswd_port, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
        {"web port", P_INTEGER, P_GLOBAL, &Globals.web_port, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
        {"tls enabled", P_BOOL, P_GLOBAL, &Globals.tls_enabled, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
        {"tls keyfile", P_STRING, P_GLOBAL, &Globals.tls_keyfile, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
@@ -501,14 +498,12 @@ static struct parm_struct parm_table[] = {
        
        {"Logon Options", P_SEP, P_SEPARATOR},
 
-       {"domain logons", P_BOOL, P_GLOBAL, &Globals.bDomainLogons, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
 
        {"Browse Options", P_SEP, P_SEPARATOR},
        
        {"preferred master", P_ENUM, P_GLOBAL, &Globals.bPreferredMaster, NULL, enum_bool_auto, FLAG_BASIC | FLAG_ADVANCED | FLAG_DEVELOPER},
        {"prefered master", P_ENUM, P_GLOBAL, &Globals.bPreferredMaster, NULL, enum_bool_auto, FLAG_HIDE},
        {"local master", P_BOOL, P_GLOBAL, &Globals.bLocalMaster, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_DEVELOPER},
-       {"domain master", P_ENUM, P_GLOBAL, &Globals.bDomainMaster, NULL, enum_bool_auto, FLAG_BASIC | FLAG_ADVANCED | FLAG_DEVELOPER},
        {"browseable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT | FLAG_DEVELOPER},
        {"browsable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL, FLAG_HIDE},
 
@@ -516,6 +511,8 @@ static struct parm_struct parm_table[] = {
        
        {"wins server", P_LIST, P_GLOBAL, &Globals.szWINSservers, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
        {"wins support", P_BOOL, P_GLOBAL, &Globals.bWINSsupport, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
+       {"dns proxy", P_BOOL, P_GLOBAL, &Globals.bWINSdnsProxy, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
+       {"wins hook", P_STRING, P_GLOBAL, &Globals.szWINSHook, NULL, NULL, FLAG_ADVANCED}, 
 
        {"Locking Options", P_SEP, P_SEPARATOR},
        
@@ -549,6 +546,8 @@ static struct parm_struct parm_table[] = {
        {"msdfs root", P_BOOL, P_LOCAL, &sDefault.bMSDfsRoot, NULL, NULL, FLAG_SHARE},
        {"host msdfs", P_BOOL, P_GLOBAL, &Globals.bHostMSDfs, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
        {"winbind separator", P_STRING, P_GLOBAL, &Globals.szWinbindSeparator, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER },
+       {"winbindd socket directory", P_STRING, P_GLOBAL, &Globals.szWinbinddSocketDirectory, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER },
+       {"winbind sealed pipes", P_BOOL, P_GLOBAL, &Globals.bWinbindSealedPipes, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER },
 
        {NULL, P_BOOL, P_NONE, NULL, NULL, NULL, 0}
 };
@@ -583,6 +582,8 @@ static void init_globals(void)
 
        do_parameter("config file", dyn_CONFIGFILE, NULL);
 
+       do_parameter("server role", "standalone", NULL);
+
        /* options that can be set on the command line must be initialised via
           the slower do_parameter() to ensure that FLAG_CMDLINE is obeyed */
 #ifdef TCP_NODELAY
@@ -600,13 +601,13 @@ static void init_globals(void)
        do_parameter("max connections", "-1", NULL);
 
        do_parameter("dcerpc endpoint servers", "epmapper srvsvc wkssvc rpcecho samr netlogon lsarpc spoolss drsuapi winreg dssetup", NULL);
-       do_parameter("server services", "smb rpc nbt ldap cldap web kdc", NULL);
+       do_parameter("server services", "smb rpc nbt wrepl ldap cldap web kdc winbind", NULL);
        do_parameter("ntptr providor", "simple_ldb", NULL);
        do_parameter("auth methods", "anonymous sam_ignoredomain", NULL);
-       do_parameter("smb passwd file", dyn_SMB_PASSWD_FILE, NULL);
        do_parameter("private dir", dyn_PRIVATE_DIR, NULL);
        do_parameter("sam database", "sam.ldb", NULL);
        do_parameter("spoolss database", "spoolss.ldb", NULL);
+       do_parameter("wins config database", "wins_config.ldb", NULL);
        do_parameter("wins database", "wins.ldb", NULL);
        do_parameter("registry:HKEY_LOCAL_MACHINE", "hklm.ldb", NULL);
 
@@ -659,16 +660,19 @@ static void init_globals(void)
        do_parameter("ClientLanManAuth", "True", NULL);
        do_parameter("LanmanAuth", "True", NULL);
        do_parameter("NTLMAuth", "True", NULL);
+       do_parameter("client use spnego principal", "False", NULL);
        
        do_parameter("UnixExtensions", "False", NULL);
 
        do_parameter("PreferredMaster", "Auto", NULL);
        do_parameter("LocalMaster", "True", NULL);
-       do_parameter("DomainMaster", "Auto", NULL);     /* depending on bDomainLogons */
-       do_parameter("DomainLogons", "False", NULL);
-       do_parameter("WINSsupport", "False", NULL);
+
+       do_parameter("wins support", "False", NULL);
+       do_parameter("dns proxy", "True", NULL);
 
        do_parameter("winbind separator", "\\", NULL);
+       do_parameter("winbind sealed pipes", "True", NULL);
+       do_parameter("winbindd socket directory", dyn_WINBINDD_SOCKET_DIR, NULL);
 
        do_parameter("client signing", "Yes", NULL);
        do_parameter("server signing", "auto", NULL);
@@ -680,20 +684,27 @@ static void init_globals(void)
        do_parameter("dgram port", "138", NULL);
        do_parameter("cldap port", "389", NULL);
        do_parameter("krb5 port", "88", NULL);
+       do_parameter("kpasswd port", "464", NULL);
        do_parameter("web port", "901", NULL);
        do_parameter("swat directory", dyn_SWATDIR, NULL);
 
        do_parameter("nt status support", "True", NULL);
 
-       do_parameter("max wins ttl", "432000", NULL);
+       do_parameter("max wins ttl", "518400", NULL); /* 6 days */
        do_parameter("min wins ttl", "10", NULL);
 
        do_parameter("tls enabled", "True", NULL);
        do_parameter("tls keyfile", "tls/key.pem", NULL);
        do_parameter("tls certfile", "tls/cert.pem", NULL);
        do_parameter("tls cafile", "tls/ca.pem", NULL);
-       do_parameter_var("js include", "%s/js", dyn_LIBDIR);
-       do_parameter_var("setup directory", "%s/setup", dyn_LIBDIR);
+       do_parameter_var("js include", "%s", dyn_JSDIR);
+       do_parameter_var("setup directory", "%s", dyn_SETUPDIR);
+
+       for (i = 0; parm_table[i].label; i++) {
+               if (!(parm_table[i].flags & FLAG_CMDLINE)) {
+                       parm_table[i].flags |= FLAG_DEFAULT;
+               }
+       }
 }
 
 static TALLOC_CTX *lp_talloc;
@@ -788,11 +799,13 @@ static const char *lp_string(const char *s)
 #define FN_LOCAL_INTEGER(fn_name,val) \
  int fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
 
+FN_GLOBAL_INTEGER(lp_server_role, &Globals.server_role)
 FN_GLOBAL_LIST(lp_smb_ports, &Globals.smb_ports)
 FN_GLOBAL_INTEGER(lp_nbt_port, &Globals.nbt_port)
 FN_GLOBAL_INTEGER(lp_dgram_port, &Globals.dgram_port)
 FN_GLOBAL_INTEGER(lp_cldap_port, &Globals.cldap_port)
 FN_GLOBAL_INTEGER(lp_krb5_port, &Globals.krb5_port)
+FN_GLOBAL_INTEGER(lp_kpasswd_port, &Globals.kpasswd_port)
 FN_GLOBAL_INTEGER(lp_web_port, &Globals.web_port)
 FN_GLOBAL_STRING(lp_dos_charset, &Globals.dos_charset)
 FN_GLOBAL_STRING(lp_swat_directory, &Globals.swat_directory)
@@ -805,11 +818,13 @@ FN_GLOBAL_STRING(lp_unix_charset, &Globals.unix_charset)
 FN_GLOBAL_STRING(lp_display_charset, &Globals.display_charset)
 FN_GLOBAL_STRING(lp_logfile, &Globals.szLogFile)
 FN_GLOBAL_STRING(lp_configfile, &Globals.szConfigFile)
-FN_GLOBAL_STRING(lp_smb_passwd_file, &Globals.szSMBPasswdFile)
 FN_GLOBAL_STRING(lp_sam_url, &Globals.szSAM_URL)
 FN_GLOBAL_STRING(lp_spoolss_url, &Globals.szSPOOLSS_URL)
+FN_GLOBAL_STRING(lp_wins_config_url, &Globals.szWINS_CONFIG_URL)
 FN_GLOBAL_STRING(lp_wins_url, &Globals.szWINS_URL)
 FN_GLOBAL_CONST_STRING(lp_winbind_separator, &Globals.szWinbindSeparator)
+FN_GLOBAL_CONST_STRING(lp_winbindd_socket_directory, &Globals.szWinbinddSocketDirectory)
+FN_GLOBAL_BOOL(lp_winbind_sealed_pipes, &Globals.bWinbindSealedPipes)
 FN_GLOBAL_STRING(lp_private_dir, &Globals.szPrivateDir)
 FN_GLOBAL_STRING(lp_serverstring, &Globals.szServerString)
 FN_GLOBAL_STRING(lp_lockdir, &Globals.szLockDir)
@@ -836,8 +851,9 @@ FN_GLOBAL_STRING(lp_panic_action, &Globals.szPanicAction)
 
 FN_GLOBAL_BOOL(lp_disable_netbios, &Globals.bDisableNetbios)
 FN_GLOBAL_BOOL(lp_wins_support, &Globals.bWINSsupport)
+FN_GLOBAL_BOOL(lp_wins_dns_proxy, &Globals.bWINSdnsProxy)
+FN_GLOBAL_STRING(lp_wins_hook, &Globals.szWINSHook)
 FN_GLOBAL_BOOL(lp_local_master, &Globals.bLocalMaster)
-FN_GLOBAL_BOOL(lp_domain_logons, &Globals.bDomainLogons)
 FN_GLOBAL_BOOL(lp_readraw, &Globals.bReadRaw)
 FN_GLOBAL_BOOL(lp_large_readwrite, &Globals.bLargeReadwrite)
 FN_GLOBAL_BOOL(lp_writeraw, &Globals.bWriteRaw)
@@ -853,6 +869,7 @@ FN_GLOBAL_BOOL(lp_ntlm_auth, &Globals.bNTLMAuth)
 FN_GLOBAL_BOOL(lp_client_plaintext_auth, &Globals.bClientPlaintextAuth)
 FN_GLOBAL_BOOL(lp_client_lanman_auth, &Globals.bClientLanManAuth)
 FN_GLOBAL_BOOL(lp_client_ntlmv2_auth, &Globals.bClientNTLMv2Auth)
+FN_GLOBAL_BOOL(lp_client_use_spnego_principal, &Globals.client_use_spnego_principal)
 FN_GLOBAL_BOOL(lp_host_msdfs, &Globals.bHostMSDfs)
 FN_GLOBAL_BOOL(lp_unix_extensions, &Globals.bUnixExtensions)
 FN_GLOBAL_BOOL(lp_use_spnego, &Globals.bUseSpnego)
@@ -899,7 +916,6 @@ FN_GLOBAL_INTEGER(lp_client_signing, &Globals.client_signing)
 /* local prototypes */
 
 static int map_parameter(const char *pszParmName);
-static BOOL set_boolean(BOOL *pb, const char *pszParmValue);
 static int getservicebyname(const char *pszServiceName,
                            service * pserviceDest);
 static void copy_service(service * pserviceDest,
@@ -991,7 +1007,7 @@ static BOOL lp_bool(const char *s)
                return False;
        }
        
-       if (!set_boolean(&ret,s)) {
+       if (!set_boolean(s, &ret)) {
                DEBUG(0,("lp_bool(%s): value is not boolean!\n",s));
                return False;
        }
@@ -1360,34 +1376,6 @@ void *lp_parm_ptr(int snum, struct parm_struct *parm)
        return ((char *)ServicePtrs[snum]) + PTR_DIFF(parm->ptr, &sDefault);
 }
 
-/***************************************************************************
- Set a boolean variable from the text value stored in the passed string.
- Returns True in success, False if the passed string does not correctly 
- represent a boolean.
-***************************************************************************/
-
-static BOOL set_boolean(BOOL *pb, const char *pszParmValue)
-{
-       BOOL bRetval;
-
-       bRetval = True;
-       if (strwicmp(pszParmValue, "yes") == 0 ||
-           strwicmp(pszParmValue, "true") == 0 ||
-           strwicmp(pszParmValue, "1") == 0)
-               *pb = True;
-       else if (strwicmp(pszParmValue, "no") == 0 ||
-                   strwicmp(pszParmValue, "False") == 0 ||
-                   strwicmp(pszParmValue, "0") == 0)
-               *pb = False;
-       else {
-               DEBUG(0,
-                     ("ERROR: Badly formed boolean in configuration file: \"%s\".\n",
-                      pszParmValue));
-               bRetval = False;
-       }
-       return (bRetval);
-}
-
 /***************************************************************************
 Find a service by name. Otherwise works like get_service.
 ***************************************************************************/
@@ -1483,7 +1471,9 @@ static void copy_service(service * pserviceDest, service * pserviceSource, BOOL
                        pdata = pdata->next;
                }
                if (not_added) {
-                       paramo = smb_xmalloc_p(struct param_opt);
+                       paramo = malloc_p(struct param_opt);
+                       if (!paramo)
+                               smb_panic("OOM");
                        paramo->key = strdup(data->key);
                        paramo->value = strdup(data->value);
                        DLIST_ADD(pserviceDest->param_opt, paramo);
@@ -1740,7 +1730,9 @@ static BOOL lp_do_parameter_parametric(int snum, const char *pszParmName, const
                }
        }
 
-       paramo = smb_xmalloc_p(struct param_opt);
+       paramo = malloc_p(struct param_opt);
+       if (!paramo)
+               smb_panic("OOM");
        paramo->key = strdup(name);
        paramo->value = strdup(pszParmValue);
        paramo->flags = flags;
@@ -1824,7 +1816,10 @@ BOOL lp_do_parameter(int snum, const char *pszParmName, const char *pszParmValue
        switch (parm_table[parmnum].type)
        {
                case P_BOOL:
-                       set_boolean(parm_ptr, pszParmValue);
+                       if (!set_boolean(pszParmValue, parm_ptr)) {
+                               DEBUG(0,("lp_do_parameter(%s): value is not boolean!\n", pszParmValue));
+                               return False;
+                       }
                        break;
 
                case P_INTEGER:
@@ -1866,6 +1861,17 @@ BOOL lp_do_parameter(int snum, const char *pszParmName, const char *pszParmValue
                        break;
        }
 
+       if (parm_table[parmnum].flags & FLAG_DEFAULT) {
+               parm_table[parmnum].flags &= ~FLAG_DEFAULT;
+               /* we have to also unset FLAG_DEFAULT on aliases */
+               for (i=parmnum-1;i>=0 && parm_table[i].ptr == parm_table[parmnum].ptr;i--) {
+                       parm_table[i].flags &= ~FLAG_DEFAULT;
+               }
+               for (i=parmnum+1;i<NUMPARAMETERS && parm_table[i].ptr == parm_table[parmnum].ptr;i++) {
+                       parm_table[i].flags &= ~FLAG_DEFAULT;
+               }
+       }
+
        return (True);
 }
 
@@ -2131,7 +2137,7 @@ static BOOL is_default(int i)
 Display the contents of the global structure.
 ***************************************************************************/
 
-static void dump_globals(FILE *f)
+static void dump_globals(FILE *f, BOOL show_defaults)
 {
        int i;
        struct param_opt *data;
@@ -2142,7 +2148,7 @@ static void dump_globals(FILE *f)
                if (parm_table[i].class == P_GLOBAL &&
                    parm_table[i].ptr &&
                    (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr))) {
-                       if (defaults_saved && is_default(i))
+                       if (!show_defaults && (parm_table[i].flags & FLAG_DEFAULT)) 
                                continue;
                        fprintf(f, "\t%s = ", parm_table[i].label);
                        print_parameter(&parm_table[i], parm_table[i].ptr, f);
@@ -2203,6 +2209,35 @@ static void dump_a_service(service * pService, FILE * f)
         }
 }
 
+BOOL lp_dump_a_parameter(int snum, char *parm_name, FILE * f, BOOL isGlobal)
+{
+       service * pService = ServicePtrs[snum];
+       parm_class p_class;
+       unsigned flag = 0;
+       struct parm_struct *parm;
+       void *ptr;
+       if (isGlobal) {
+               p_class = P_GLOBAL;
+               flag = FLAG_GLOBAL;
+       } else
+               p_class = P_LOCAL;
+       
+       parm = lp_parm_struct(parm_name);
+       if (!parm) {
+               return False;
+       }
+       
+       if (isGlobal)
+               ptr = parm->ptr;
+       else
+               ptr = ((char *)pService) +
+                       PTR_DIFF(parm->ptr, &sDefault);
+       
+       print_parameter(parm,
+                       ptr, f);
+       fprintf(f, "\n");
+       return True;
+}
 
 /***************************************************************************
  Return info about the next service  in a service. snum==-1 gives the globals.
@@ -2329,63 +2364,6 @@ void lp_killservice(int iServiceIn)
        }
 }
 
-/*******************************************************************
- Set the server type we will announce as via nmbd.
-********************************************************************/
-
-static void set_server_role(void)
-{
-       server_role = ROLE_STANDALONE;
-
-       switch (lp_security()) {
-               case SEC_SHARE:
-                       if (lp_domain_logons())
-                               DEBUG(0, ("Server's Role (logon server) conflicts with share-level security\n"));
-                       break;
-               case SEC_SERVER:
-               case SEC_DOMAIN:
-               case SEC_ADS:
-                       if (lp_domain_logons()) {
-                               if (Globals.bDomainMaster) /* auto or yes */ 
-                                       server_role = ROLE_DOMAIN_PDC;
-                               else
-                                       server_role = ROLE_DOMAIN_BDC;
-                               break;
-                       }
-                       server_role = ROLE_DOMAIN_MEMBER;
-                       break;
-               case SEC_USER:
-                       if (lp_domain_logons()) {
-
-                               if (Globals.bDomainMaster) /* auto or yes */ 
-                                       server_role = ROLE_DOMAIN_PDC;
-                               else
-                                       server_role = ROLE_DOMAIN_BDC;
-                       }
-                       break;
-               default:
-                       DEBUG(0, ("Server's Role undefined due to unknown security mode\n"));
-                       break;
-       }
-
-       DEBUG(10, ("set_server_role: role = "));
-
-       switch(server_role) {
-       case ROLE_STANDALONE:
-               DEBUGADD(10, ("ROLE_STANDALONE\n"));
-               break;
-       case ROLE_DOMAIN_MEMBER:
-               DEBUGADD(10, ("ROLE_DOMAIN_MEMBER\n"));
-               break;
-       case ROLE_DOMAIN_BDC:
-               DEBUGADD(10, ("ROLE_DOMAIN_BDC\n"));
-               break;
-       case ROLE_DOMAIN_PDC:
-               DEBUGADD(10, ("ROLE_DOMAIN_PDC\n"));
-               break;
-       }
-}
-
 /***************************************************************************
  Load the services array from the services file. Return True on success, 
  False on failure.
@@ -2436,12 +2414,11 @@ BOOL lp_load(void)
        lp_add_hidden("IPC$", "IPC");
        lp_add_hidden("ADMIN$", "DISK");
 
-       set_server_role();
        set_default_server_announce_type();
 
        bLoaded = True;
 
-       if (Globals.bWINSsupport) {
+       if (!Globals.szWINSservers && Globals.bWINSsupport) {
                lp_do_parameter(-1, "wins server", "127.0.0.1");
        }
 
@@ -2479,7 +2456,7 @@ void lp_dump(FILE *f, BOOL show_defaults, int maxtoprint)
        if (show_defaults)
                defaults_saved = False;
 
-       dump_globals(f);
+       dump_globals(f, show_defaults);
 
        dump_a_service(&sDefault, f);
 
@@ -2597,24 +2574,21 @@ static void set_default_server_announce_type(void)
 }
 
 /***********************************************************
- returns role of Samba server
+ If we are PDC then prefer us as DMB
 ************************************************************/
 
-int lp_server_role(void)
+BOOL lp_domain_master(void)
 {
-       return server_role;
+       return (lp_server_role() == ROLE_DOMAIN_PDC);
 }
 
 /***********************************************************
  If we are PDC then prefer us as DMB
 ************************************************************/
 
-BOOL lp_domain_master(void)
+BOOL lp_domain_logons(void)
 {
-       if (Globals.bDomainMaster == Auto)
-               return (lp_server_role() == ROLE_DOMAIN_PDC);
-
-       return Globals.bDomainMaster;
+       return (lp_server_role() == ROLE_DOMAIN_PDC) || (lp_server_role() == ROLE_DOMAIN_BDC);
 }
 
 /***********************************************************
@@ -2623,10 +2597,7 @@ BOOL lp_domain_master(void)
 
 BOOL lp_preferred_master(void)
 {
-       if (Globals.bPreferredMaster == Auto)
-               return (lp_local_master() && lp_domain_master());
-
-       return Globals.bPreferredMaster;
+       return (lp_local_master() && lp_domain_master());
 }
 
 /*******************************************************************