Add new parameter, "min receivefile size" (by default set
[samba.git] / source3 / param / loadparm.c
index 856b7c4b0e467aafc2e865be4c2d70c6306b9a62..a5b264756795ef6ada87b6c0f62cd4bc2625bf9c 100644 (file)
@@ -12,7 +12,7 @@
    
    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
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
@@ -21,8 +21,7 @@
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 /*
@@ -53,8 +52,8 @@
 
 #include "includes.h"
 
-BOOL in_client = False;                /* Not in the client by default */
-BOOL bLoaded = False;
+bool in_client = False;                /* Not in the client by default */
+bool bLoaded = False;
 
 extern pstring user_socket_options;
 extern enum protocol_types Protocol;
@@ -81,7 +80,7 @@ extern userdom_struct current_user_info;
 #endif
 
 static int regdb_last_seqnum = 0;
-static BOOL include_registry_globals = False;
+static bool include_registry_globals = False;
 
 /* some helpful bits */
 #define LP_SNUM_OK(i) (((i) >= 0) && ((i) < iNumServices) && (ServicePtrs != NULL) && ServicePtrs[(i)]->valid)
@@ -90,11 +89,11 @@ static BOOL include_registry_globals = False;
 #define USERSHARE_VALID 1
 #define USERSHARE_PENDING_DELETE 2
 
-BOOL use_getwd_cache = True;
+bool use_getwd_cache = True;
 
 extern int extra_time_offset;
 
-static BOOL defaults_saved = False;
+static bool defaults_saved = False;
 
 typedef struct _param_opt_struct param_opt_struct;
 struct _param_opt_struct {
@@ -175,24 +174,24 @@ typedef struct {
        char *szWINSHook;
        char *szUtmpDir;
        char *szWtmpDir;
-       BOOL bUtmp;
+       bool bUtmp;
        char *szIdmapUID;
        char *szIdmapGID;
-       BOOL bPassdbExpandExplicit;
+       bool bPassdbExpandExplicit;
        int AlgorithmicRidBase;
        char *szTemplateHomedir;
        char *szTemplateShell;
        char *szWinbindSeparator;
-       BOOL bWinbindEnumUsers;
-       BOOL bWinbindEnumGroups;
-       BOOL bWinbindUseDefaultDomain;
-       BOOL bWinbindTrustedDomainsOnly;
-       BOOL bWinbindNestedGroups;
-       int  winbind_expand_groups;     
-       BOOL bWinbindRefreshTickets;
-       BOOL bWinbindOfflineLogon;
-       BOOL bWinbindNormalizeNames;
-       BOOL bWinbindRpcOnly;
+       bool bWinbindEnumUsers;
+       bool bWinbindEnumGroups;
+       bool bWinbindUseDefaultDomain;
+       bool bWinbindTrustedDomainsOnly;
+       bool bWinbindNestedGroups;
+       int  winbind_expand_groups;
+       bool bWinbindRefreshTickets;
+       bool bWinbindOfflineLogon;
+       bool bWinbindNormalizeNames;
+       bool bWinbindRpcOnly;
        char **szIdmapDomains;
        char **szIdmapBackend; /* deprecated */
        char *szIdmapAllocBackend;
@@ -221,14 +220,14 @@ typedef struct {
        int minprotocol;
        int security;
        char **AuthMethods;
-       BOOL paranoid_server_security;
+       bool paranoid_server_security;
        int maxdisksize;
        int lpqcachetime;
        int iMaxSmbdProcesses;
-       BOOL bDisableSpoolss;
+       bool bDisableSpoolss;
        int syslog;
        int os_level;
-       int enhanced_browsing;
+       bool enhanced_browsing;
        int max_ttl;
        int max_wins_ttl;
        int min_wins_ttl;
@@ -253,83 +252,86 @@ typedef struct {
        char *szCupsServer;
        char *szIPrintServer;
        char *ctdbdSocket;
-       BOOL clustering;
-       int ldap_passwd_sync; 
+       char **szClusterAddresses;
+       bool clustering;
+       int ldap_passwd_sync;
        int ldap_replication_sleep;
        int ldap_timeout; /* This is initialised in init_globals */
        int ldap_page_size;
-       BOOL ldap_delete_dn;
-       BOOL bMsAddPrinterWizard;
-       BOOL bDNSproxy;
-       BOOL bWINSsupport;
-       BOOL bWINSproxy;
-       BOOL bLocalMaster;
-       BOOL bPreferredMaster;
-       BOOL bDomainMaster;
-       BOOL bDomainLogons;
-       BOOL bEncryptPasswords;
-       BOOL bUpdateEncrypt;
+       bool ldap_delete_dn;
+       bool bMsAddPrinterWizard;
+       bool bDNSproxy;
+       bool bWINSsupport;
+       bool bWINSproxy;
+       bool bLocalMaster;
+       int  iPreferredMaster;
+       int iDomainMaster;
+       bool bDomainLogons;
+       bool bEncryptPasswords;
+       bool bUpdateEncrypt;
        int  clientSchannel;
        int  serverSchannel;
-       BOOL bNullPasswords;
-       BOOL bObeyPamRestrictions;
-       BOOL bLoadPrinters;
+       bool bNullPasswords;
+       bool bObeyPamRestrictions;
+       bool bLoadPrinters;
        int PrintcapCacheTime;
-       BOOL bLargeReadwrite;
-       BOOL bReadRaw;
-       BOOL bWriteRaw;
-       BOOL bReadbmpx;
-       BOOL bSyslogOnly;
-       BOOL bBrowseList;
-       BOOL bNISHomeMap;
-       BOOL bTimeServer;
-       BOOL bBindInterfacesOnly;
-       BOOL bPamPasswordChange;
-       BOOL bUnixPasswdSync;
-       BOOL bPasswdChatDebug;
+       bool bLargeReadwrite;
+       bool bReadRaw;
+       bool bWriteRaw;
+       bool bSyslogOnly;
+       bool bBrowseList;
+       bool bNISHomeMap;
+       bool bTimeServer;
+       bool bBindInterfacesOnly;
+       bool bPamPasswordChange;
+       bool bUnixPasswdSync;
+       bool bPasswdChatDebug;
        int iPasswdChatTimeout;
-       BOOL bTimestampLogs;
-       BOOL bNTSmbSupport;
-       BOOL bNTPipeSupport;
-       BOOL bNTStatusSupport;
-       BOOL bStatCache;
+       bool bTimestampLogs;
+       bool bNTSmbSupport;
+       bool bNTPipeSupport;
+       bool bNTStatusSupport;
+       bool bStatCache;
        int iMaxStatCacheSize;
-       BOOL bKernelOplocks;
-       BOOL bAllowTrustedDomains;
-       BOOL bLanmanAuth;
-       BOOL bNTLMAuth;
-       BOOL bUseSpnego;
-       BOOL bClientLanManAuth;
-       BOOL bClientNTLMv2Auth;
-       BOOL bClientPlaintextAuth;
-       BOOL bClientUseSpnego;
-       BOOL bDebugPrefixTimestamp;
-       BOOL bDebugHiresTimestamp;
-       BOOL bDebugPid;
-       BOOL bDebugUid;
-       BOOL bEnableCoreFiles;
-       BOOL bHostMSDfs;
-       BOOL bUseMmap;
-       BOOL bHostnameLookups;
-       BOOL bUnixExtensions;
-       BOOL bDisableNetbios;
-       BOOL bUseKerberosKeytab;
-       BOOL bDeferSharingViolations;
-       BOOL bEnablePrivileges;
-       BOOL bASUSupport;
-       BOOL bUsershareOwnerOnly;
-       BOOL bUsershareAllowGuests;
-       BOOL bRegistryShares;
+       bool bKernelOplocks;
+       bool bAllowTrustedDomains;
+       bool bLanmanAuth;
+       bool bNTLMAuth;
+       bool bUseSpnego;
+       bool bClientLanManAuth;
+       bool bClientNTLMv2Auth;
+       bool bClientPlaintextAuth;
+       bool bClientUseSpnego;
+       bool bDebugPrefixTimestamp;
+       bool bDebugHiresTimestamp;
+       bool bDebugPid;
+       bool bDebugUid;
+       bool bDebugClass;
+       bool bEnableCoreFiles;
+       bool bHostMSDfs;
+       bool bUseMmap;
+       bool bHostnameLookups;
+       bool bUnixExtensions;
+       bool bDisableNetbios;
+       bool bUseKerberosKeytab;
+       bool bDeferSharingViolations;
+       bool bEnablePrivileges;
+       bool bASUSupport;
+       bool bUsershareOwnerOnly;
+       bool bUsershareAllowGuests;
+       bool bRegistryShares;
        int restrict_anonymous;
        int name_cache_timeout;
        int client_signing;
        int server_signing;
+       int client_ldap_sasl_wrapping;
        int iUsershareMaxShares;
        int iIdmapCacheTime;
        int iIdmapNegativeCacheTime;
 
-       BOOL bResetOnZeroVC;
+       bool bResetOnZeroVC;
        int iKeepalive;
+       int iminreceivefile;
        param_opt_struct *param_opt;
 } global;
 
@@ -339,8 +341,8 @@ static global Globals;
  * This structure describes a single service. 
  */
 typedef struct {
-       BOOL valid;
-       BOOL autoloaded;
+       bool valid;
+       bool autoloaded;
        int usershare;
        time_t usershare_last_mod;
        char *szService;
@@ -370,7 +372,6 @@ typedef struct {
        char **szHostsdeny;
        char *szMagicScript;
        char *szMagicOutput;
-       char *szMangledMap;
        char *szVetoFiles;
        char *szHideFiles;
        char *szVetoOplockFiles;
@@ -384,6 +385,7 @@ typedef struct {
        char *fstype;
        char **szVfsObjects;
        char *szMSDfsProxy;
+       char *szAioWriteBehind;
        char *szDfree;
        int iMinPrintSpace;
        int iMaxPrintJobs;
@@ -404,73 +406,74 @@ typedef struct {
        int iCSCPolicy;
        int iBlock_size;
        int iDfreeCacheTime;
-       BOOL bPreexecClose;
-       BOOL bRootpreexecClose;
+       bool bPreexecClose;
+       bool bRootpreexecClose;
        int  iCaseSensitive;
-       BOOL bCasePreserve;
-       BOOL bShortCasePreserve;
-       BOOL bHideDotFiles;
-       BOOL bHideSpecialFiles;
-       BOOL bHideUnReadable;
-       BOOL bHideUnWriteableFiles;
-       BOOL bBrowseable;
-       BOOL bAvailable;
-       BOOL bRead_only;
-       BOOL bNo_set_dir;
-       BOOL bGuest_only;
-       BOOL bGuest_ok;
-       BOOL bPrint_ok;
-       BOOL bMap_system;
-       BOOL bMap_hidden;
-       BOOL bMap_archive;
-       BOOL bStoreDosAttributes;
-       BOOL bDmapiSupport;
-       BOOL bLocking;
+       bool bCasePreserve;
+       bool bShortCasePreserve;
+       bool bHideDotFiles;
+       bool bHideSpecialFiles;
+       bool bHideUnReadable;
+       bool bHideUnWriteableFiles;
+       bool bBrowseable;
+       bool bAvailable;
+       bool bRead_only;
+       bool bNo_set_dir;
+       bool bGuest_only;
+       bool bGuest_ok;
+       bool bPrint_ok;
+       bool bMap_system;
+       bool bMap_hidden;
+       bool bMap_archive;
+       bool bStoreDosAttributes;
+       bool bDmapiSupport;
+       bool bLocking;
        int iStrictLocking;
-       BOOL bPosixLocking;
-       BOOL bShareModes;
-       BOOL bOpLocks;
-       BOOL bLevel2OpLocks;
-       BOOL bOnlyUser;
-       BOOL bMangledNames;
-       BOOL bWidelinks;
-       BOOL bSymlinks;
-       BOOL bSyncAlways;
-       BOOL bStrictAllocate;
-       BOOL bStrictSync;
+       bool bPosixLocking;
+       bool bShareModes;
+       bool bOpLocks;
+       bool bLevel2OpLocks;
+       bool bOnlyUser;
+       bool bMangledNames;
+       bool bWidelinks;
+       bool bSymlinks;
+       bool bSyncAlways;
+       bool bStrictAllocate;
+       bool bStrictSync;
        char magic_char;
-       BOOL *copymap;
-       BOOL bDeleteReadonly;
-       BOOL bFakeOplocks;
-       BOOL bDeleteVetoFiles;
-       BOOL bDosFilemode;
-       BOOL bDosFiletimes;
-       BOOL bDosFiletimeResolution;
-       BOOL bFakeDirCreateTimes;
-       BOOL bBlockingLocks;
-       BOOL bInheritPerms;
-       BOOL bInheritACLS;
-       BOOL bInheritOwner;
-       BOOL bMSDfsRoot;
-       BOOL bUseClientDriver;
-       BOOL bDefaultDevmode;
-       BOOL bForcePrintername;
-       BOOL bNTAclSupport;
-       BOOL bForceUnknownAclUser;
-       BOOL bUseSendfile;
-       BOOL bProfileAcls;
-       BOOL bMap_acl_inherit;
-       BOOL bAfs_Share;
-       BOOL bEASupport;
-       BOOL bAclCheckPermissions;
-       BOOL bAclMapFullControl;
-       BOOL bAclGroupControl;
-       BOOL bChangeNotify;
-       BOOL bKernelChangeNotify;
+       bool *copymap;
+       bool bDeleteReadonly;
+       bool bFakeOplocks;
+       bool bDeleteVetoFiles;
+       bool bDosFilemode;
+       bool bDosFiletimes;
+       bool bDosFiletimeResolution;
+       bool bFakeDirCreateTimes;
+       bool bBlockingLocks;
+       bool bInheritPerms;
+       bool bInheritACLS;
+       bool bInheritOwner;
+       bool bMSDfsRoot;
+       bool bUseClientDriver;
+       bool bDefaultDevmode;
+       bool bForcePrintername;
+       bool bNTAclSupport;
+       bool bForceUnknownAclUser;
+       bool bUseSendfile;
+       bool bProfileAcls;
+       bool bMap_acl_inherit;
+       bool bAfs_Share;
+       bool bEASupport;
+       bool bAclCheckPermissions;
+       bool bAclMapFullControl;
+       bool bAclGroupControl;
+       bool bChangeNotify;
+       bool bKernelChangeNotify;
        int iallocation_roundup_size;
        int iAioReadSize;
        int iAioWriteSize;
        int iMap_readonly;
+       int iDirectoryNameCacheSize;
        param_opt_struct *param_opt;
 
        char dummy[3];          /* for alignment */
@@ -510,7 +513,6 @@ static service sDefault = {
        NULL,                   /* szHostsdeny */
        NULL,                   /* szMagicScript */
        NULL,                   /* szMagicOutput */
-       NULL,                   /* szMangledMap */
        NULL,                   /* szVetoFiles */
        NULL,                   /* szHideFiles */
        NULL,                   /* szVetoOplockFiles */
@@ -524,6 +526,7 @@ static service sDefault = {
        NULL,                   /* fstype */
        NULL,                   /* vfs objects */
        NULL,                   /* szMSDfsProxy */
+       NULL,                   /* szAioWriteBehind */
        NULL,                   /* szDfree */
        0,                      /* iMinPrintSpace */
        1000,                   /* iMaxPrintJobs */
@@ -611,7 +614,11 @@ static service sDefault = {
        0,                      /* iAioReadSize */
        0,                      /* iAioWriteSize */
        MAP_READONLY_YES,       /* iMap_readonly */
-       
+#ifdef BROKEN_DIRECTORY_HANDLING
+       0,                      /* iDirectoryNameCacheSize */
+#else
+       100,                    /* iDirectoryNameCacheSize */
+#endif
        NULL,                   /* Parametric options */
 
        ""                      /* dummy */
@@ -624,25 +631,25 @@ static int iServiceIndex = 0;
 static TDB_CONTEXT *ServiceHash;
 static int *invalid_services = NULL;
 static int num_invalid_services = 0;
-static BOOL bInGlobalSection = True;
-static BOOL bGlobalOnly = False;
+static bool bInGlobalSection = True;
+static bool bGlobalOnly = False;
 static int server_role;
 static int default_server_announce;
 
 #define NUMPARAMETERS (sizeof(parm_table) / sizeof(struct parm_struct))
 
 /* prototypes for the special type handlers */
-static BOOL handle_include( int snum, const char *pszParmValue, char **ptr);
-static BOOL handle_copy( int snum, const char *pszParmValue, char **ptr);
-static BOOL handle_netbios_name( int snum, const char *pszParmValue, char **ptr);
-static BOOL handle_idmap_uid( int snum, const char *pszParmValue, char **ptr);
-static BOOL handle_idmap_gid( int snum, const char *pszParmValue, char **ptr);
-static BOOL handle_debug_list( int snum, const char *pszParmValue, char **ptr );
-static BOOL handle_workgroup( int snum, const char *pszParmValue, char **ptr );
-static BOOL handle_netbios_aliases( int snum, const char *pszParmValue, char **ptr );
-static BOOL handle_netbios_scope( int snum, const char *pszParmValue, char **ptr );
-static BOOL handle_charset( int snum, const char *pszParmValue, char **ptr );
-static BOOL handle_printing( int snum, const char *pszParmValue, char **ptr);
+static bool handle_include( int snum, const char *pszParmValue, char **ptr);
+static bool handle_copy( int snum, const char *pszParmValue, char **ptr);
+static bool handle_netbios_name( int snum, const char *pszParmValue, char **ptr);
+static bool handle_idmap_uid( int snum, const char *pszParmValue, char **ptr);
+static bool handle_idmap_gid( int snum, const char *pszParmValue, char **ptr);
+static bool handle_debug_list( int snum, const char *pszParmValue, char **ptr );
+static bool handle_workgroup( int snum, const char *pszParmValue, char **ptr );
+static bool handle_netbios_aliases( int snum, const char *pszParmValue, char **ptr );
+static bool handle_netbios_scope( int snum, const char *pszParmValue, char **ptr );
+static bool handle_charset( int snum, const char *pszParmValue, char **ptr );
+static bool handle_printing( int snum, const char *pszParmValue, char **ptr);
 
 static void set_server_role(void);
 static void set_default_server_announce_type(void);
@@ -688,6 +695,13 @@ static const struct enum_list enum_printing[] = {
        {-1, NULL}
 };
 
+static const struct enum_list enum_ldap_sasl_wrapping[] = {
+       {0, "plain"},
+       {ADS_AUTH_SASL_SIGN, "sign"},
+       {ADS_AUTH_SASL_SEAL, "seal"},
+       {-1, NULL}
+};
+
 static const struct enum_list enum_ldap_ssl[] = {
        {LDAP_SSL_OFF, "no"},
        {LDAP_SSL_OFF, "No"},
@@ -971,6 +985,7 @@ static struct parm_struct parm_table[] = {
        {"debug hires timestamp", P_BOOL, P_GLOBAL, &Globals.bDebugHiresTimestamp, NULL, NULL, FLAG_ADVANCED}, 
        {"debug pid", P_BOOL, P_GLOBAL, &Globals.bDebugPid, NULL, NULL, FLAG_ADVANCED}, 
        {"debug uid", P_BOOL, P_GLOBAL, &Globals.bDebugUid, NULL, NULL, FLAG_ADVANCED}, 
+       {"debug class", P_BOOL, P_GLOBAL, &Globals.bDebugClass, NULL, NULL, FLAG_ADVANCED},
        {"enable core files", P_BOOL, P_GLOBAL, &Globals.bEnableCoreFiles, NULL, NULL, FLAG_ADVANCED},
 
        {N_("Protocol Options"), P_SEP, P_SEPARATOR}, 
@@ -978,12 +993,13 @@ static struct parm_struct parm_table[] = {
        {"allocation roundup size", P_INTEGER, P_LOCAL, &sDefault.iallocation_roundup_size, NULL, NULL, FLAG_ADVANCED}, 
        {"aio read size", P_INTEGER, P_LOCAL, &sDefault.iAioReadSize, NULL, NULL, FLAG_ADVANCED}, 
        {"aio write size", P_INTEGER, P_LOCAL, &sDefault.iAioWriteSize, NULL, NULL, FLAG_ADVANCED}, 
+       {"aio write behind", P_STRING, P_LOCAL, &sDefault.szAioWriteBehind, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL }, 
        {"smb ports", P_STRING, P_GLOBAL, &Globals.smb_ports, NULL, NULL, FLAG_ADVANCED}, 
        {"large readwrite", P_BOOL, P_GLOBAL, &Globals.bLargeReadwrite, NULL, NULL, FLAG_ADVANCED}, 
        {"max protocol", P_ENUM, P_GLOBAL, &Globals.maxprotocol, NULL, enum_protocol, FLAG_ADVANCED}, 
        {"protocol", P_ENUM, P_GLOBAL, &Globals.maxprotocol, NULL, enum_protocol, FLAG_ADVANCED}, 
        {"min protocol", P_ENUM, P_GLOBAL, &Globals.minprotocol, NULL, enum_protocol, FLAG_ADVANCED}, 
-       {"read bmpx", P_BOOL, P_GLOBAL, &Globals.bReadbmpx, NULL, NULL, FLAG_ADVANCED}, 
+       {"min receivefile size", P_INTEGER, P_GLOBAL, &Globals.iminreceivefile, NULL, NULL, FLAG_ADVANCED}, 
        {"read raw", P_BOOL, P_GLOBAL, &Globals.bReadRaw, NULL, NULL, FLAG_ADVANCED}, 
        {"write raw", P_BOOL, P_GLOBAL, &Globals.bWriteRaw, NULL, NULL, FLAG_ADVANCED}, 
        {"disable netbios", P_BOOL, P_GLOBAL, &Globals.bDisableNetbios, NULL, NULL, FLAG_ADVANCED}, 
@@ -1014,7 +1030,7 @@ static struct parm_struct parm_table[] = {
        {"client signing", P_ENUM, P_GLOBAL, &Globals.client_signing, NULL, enum_smb_signing_vals, FLAG_ADVANCED}, 
        {"server signing", P_ENUM, P_GLOBAL, &Globals.server_signing, NULL, enum_smb_signing_vals, FLAG_ADVANCED}, 
        {"client use spnego", P_BOOL, P_GLOBAL, &Globals.bClientUseSpnego, NULL, NULL, FLAG_ADVANCED}, 
-
+       {"client ldap sasl wrapping", P_ENUM, P_GLOBAL, &Globals.client_ldap_sasl_wrapping, NULL, enum_ldap_sasl_wrapping, FLAG_ADVANCED},
        {"enable asu support", P_BOOL, P_GLOBAL, &Globals.bASUSupport, NULL, NULL, FLAG_ADVANCED}, 
        {"svcctl list", P_LIST, P_GLOBAL, &Globals.szServicesList, NULL, NULL, FLAG_ADVANCED},
 
@@ -1023,8 +1039,9 @@ static struct parm_struct parm_table[] = {
        {"block size", P_INTEGER, P_LOCAL, &sDefault.iBlock_size, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
        {"deadtime", P_INTEGER, P_GLOBAL, &Globals.deadtime, NULL, NULL, FLAG_ADVANCED}, 
        {"getwd cache", P_BOOL, P_GLOBAL, &use_getwd_cache, NULL, NULL, FLAG_ADVANCED}, 
-       {"keepalive", P_INTEGER, P_GLOBAL, &Globals.iKeepalive, NULL, NULL, FLAG_ADVANCED}, 
+       {"keepalive", P_INTEGER, P_GLOBAL, &Globals.iKeepalive, NULL, NULL, FLAG_ADVANCED},
        {"change notify", P_BOOL, P_LOCAL, &sDefault.bChangeNotify, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE },
+       {"directory name cache size", P_INTEGER, P_LOCAL, &sDefault.iDirectoryNameCacheSize, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE },
        {"kernel change notify", P_BOOL, P_LOCAL, &sDefault.bKernelChangeNotify, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE },
 
        {"lpq cache time", P_INTEGER, P_GLOBAL, &Globals.lpqcachetime, NULL, NULL, FLAG_ADVANCED}, 
@@ -1034,7 +1051,6 @@ static struct parm_struct parm_table[] = {
        {"max disk size", P_INTEGER, P_GLOBAL, &Globals.maxdisksize, NULL, NULL, FLAG_ADVANCED}, 
        {"max open files", P_INTEGER, P_GLOBAL, &Globals.max_open_files, NULL, NULL, FLAG_ADVANCED}, 
        {"min print space", P_INTEGER, P_LOCAL, &sDefault.iMinPrintSpace, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT}, 
-       {"open files database hash size", P_INTEGER, P_GLOBAL, &Globals.open_files_db_hash_size, NULL, NULL, FLAG_ADVANCED}, 
 
        {"socket options", P_GSTRING, P_GLOBAL, user_socket_options, NULL, NULL, FLAG_ADVANCED}, 
        {"strict allocate", P_BOOL, P_LOCAL, &sDefault.bStrictAllocate, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
@@ -1047,6 +1063,7 @@ static struct parm_struct parm_table[] = {
 
        {"name cache timeout", P_INTEGER, P_GLOBAL, &Globals.name_cache_timeout, NULL, NULL, FLAG_ADVANCED}, 
        {"ctdbd socket", P_STRING, P_GLOBAL, &Globals.ctdbdSocket, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL}, 
+       {"cluster addresses", P_LIST, P_GLOBAL, &Globals.szClusterAddresses, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL}, 
        {"clustering", P_BOOL, P_GLOBAL, &Globals.clustering, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL}, 
 
        {N_("Printing Options"), P_SEP, P_SEPARATOR}, 
@@ -1110,7 +1127,6 @@ static struct parm_struct parm_table[] = {
        {"map system", P_BOOL, P_LOCAL, &sDefault.bMap_system, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
        {"map readonly", P_ENUM, P_LOCAL, &sDefault.iMap_readonly, NULL, enum_map_readonly, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
        {"mangled names", P_BOOL, P_LOCAL, &sDefault.bMangledNames, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
-       {"mangled map", P_STRING, P_LOCAL, &sDefault.szMangledMap, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL | FLAG_DEPRECATED }, 
        {"max stat cache size", P_INTEGER, P_GLOBAL, &Globals.iMaxStatCacheSize, NULL, NULL, FLAG_ADVANCED}, 
        {"stat cache", P_BOOL, P_GLOBAL, &Globals.bStatCache, NULL, NULL, FLAG_ADVANCED}, 
        {"store dos attributes", P_BOOL, P_LOCAL, &sDefault.bStoreDosAttributes, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
@@ -1147,10 +1163,10 @@ static struct parm_struct parm_table[] = {
        {"os level", P_INTEGER, P_GLOBAL, &Globals.os_level, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED}, 
        {"lm announce", P_ENUM, P_GLOBAL, &Globals.lm_announce, NULL, enum_bool_auto, FLAG_ADVANCED}, 
        {"lm interval", P_INTEGER, P_GLOBAL, &Globals.lm_interval, NULL, NULL, FLAG_ADVANCED}, 
-       {"preferred master", P_ENUM, P_GLOBAL, &Globals.bPreferredMaster, NULL, enum_bool_auto, FLAG_BASIC | FLAG_ADVANCED}, 
-       {"prefered master", P_ENUM, P_GLOBAL, &Globals.bPreferredMaster, NULL, enum_bool_auto, FLAG_HIDE}, 
+       {"preferred master", P_ENUM, P_GLOBAL, &Globals.iPreferredMaster, NULL, enum_bool_auto, FLAG_BASIC | FLAG_ADVANCED}, 
+       {"prefered master", P_ENUM, P_GLOBAL, &Globals.iPreferredMaster, NULL, enum_bool_auto, FLAG_HIDE}, 
        {"local master", P_BOOL, P_GLOBAL, &Globals.bLocalMaster, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED}, 
-       {"domain master", P_ENUM, P_GLOBAL, &Globals.bDomainMaster, NULL, enum_bool_auto, FLAG_BASIC | FLAG_ADVANCED}, 
+       {"domain master", P_ENUM, P_GLOBAL, &Globals.iDomainMaster, NULL, enum_bool_auto, FLAG_BASIC | FLAG_ADVANCED}, 
        {"browse list", P_BOOL, P_GLOBAL, &Globals.bBrowseList, NULL, NULL, FLAG_ADVANCED}, 
        {"browseable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT}, 
        {"browsable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL, FLAG_HIDE}, 
@@ -1402,9 +1418,9 @@ static void init_printer_values(service *pService)
  Initialise the global parameter structure.
 ***************************************************************************/
 
-static void init_globals(BOOL first_time_only)
+static void init_globals(bool first_time_only)
 {
-       static BOOL done_init = False;
+       static bool done_init = False;
        pstring s;
 
         /* If requested to initialize only once and we've already done it... */
@@ -1528,7 +1544,6 @@ static void init_globals(BOOL first_time_only)
        Globals.serverSchannel = Auto;
        Globals.bReadRaw = True;
        Globals.bWriteRaw = True;
-       Globals.bReadbmpx = False;
        Globals.bNullPasswords = False;
        Globals.bObeyPamRestrictions = False;
        Globals.syslog = 1;
@@ -1539,6 +1554,7 @@ static void init_globals(BOOL first_time_only)
        Globals.bDebugHiresTimestamp = False;
        Globals.bDebugPid = False;
        Globals.bDebugUid = False;
+       Globals.bDebugClass = False;
        Globals.bEnableCoreFiles = True;
        Globals.max_ttl = 60 * 60 * 24 * 3;     /* 3 days default. */
        Globals.max_wins_ttl = 60 * 60 * 24 * 6;        /* 6 days default. */
@@ -1566,16 +1582,16 @@ static void init_globals(BOOL first_time_only)
        Globals.bStatCache = True;      /* use stat cache by default */
        Globals.iMaxStatCacheSize = 1024; /* one Meg by default. */
        Globals.restrict_anonymous = 0;
-       Globals.bClientLanManAuth = True;       /* Do use the LanMan hash if it is available */
-       Globals.bClientPlaintextAuth = True;    /* Do use a plaintext password if is requested by the server */
-       Globals.bLanmanAuth = True;     /* Do use the LanMan hash if it is available */
-       Globals.bNTLMAuth = True;       /* Do use NTLMv1 if it is available (otherwise NTLMv2) */
+       Globals.bClientLanManAuth = False;      /* Do NOT use the LanMan hash if it is available */
+       Globals.bClientPlaintextAuth = False;   /* Do NOT use a plaintext password even if is requested by the server */
+       Globals.bLanmanAuth = False;    /* Do NOT use the LanMan hash, even if it is supplied */
+       Globals.bNTLMAuth = True;       /* Do use NTLMv1 if it is supplied by the client (otherwise NTLMv2) */
        Globals.bClientNTLMv2Auth = False; /* Client should not use NTLMv2, as we can't tell that the server supports it. */
        /* Note, that we will use NTLM2 session security (which is different), if it is available */
 
        Globals.map_to_guest = 0;       /* By Default, "Never" */
        Globals.oplock_break_wait_time = 0;     /* By Default, 0 msecs. */
-       Globals.enhanced_browsing = True; 
+       Globals.enhanced_browsing = true;
        Globals.iLockSpinTime = WINDOWS_MINIMUM_LOCK_TIMEOUT_MS; /* msec. */
 #ifdef MMAP_BLACKLIST
        Globals.bUseMmap = False;
@@ -1622,10 +1638,9 @@ static void init_globals(BOOL first_time_only)
 */
 
        Globals.bMsAddPrinterWizard = True;
-       Globals.bPreferredMaster = Auto;        /* depending on bDomainMaster */
        Globals.os_level = 20;
        Globals.bLocalMaster = True;
-       Globals.bDomainMaster = Auto;   /* depending on bDomainLogons */
+       Globals.iDomainMaster = Auto;   /* depending on bDomainLogons */
        Globals.bDomainLogons = False;
        Globals.bBrowseList = True;
        Globals.bWINSsupport = False;
@@ -1646,6 +1661,7 @@ static void init_globals(BOOL first_time_only)
        string_set(&Globals.szIPrintServer, "");
 
        string_set(&Globals.ctdbdSocket, "");
+       Globals.szClusterAddresses = NULL;
        Globals.clustering = False;
 
        Globals.winbind_cache_time = 300;       /* 5 minutes */
@@ -1654,7 +1670,7 @@ static void init_globals(BOOL first_time_only)
        Globals.bWinbindUseDefaultDomain = False;
        Globals.bWinbindTrustedDomainsOnly = False;
        Globals.bWinbindNestedGroups = True;
-       Globals.winbind_expand_groups = 1;      
+       Globals.winbind_expand_groups = 1;
        Globals.szWinbindNssInfo = str_list_make("template", NULL);
        Globals.bWinbindRefreshTickets = False;
        Globals.bWinbindOfflineLogon = False;
@@ -1694,33 +1710,8 @@ static void init_globals(BOOL first_time_only)
 
        /* By default no shares out of the registry */
        Globals.bRegistryShares = False;
-}
-
-static TALLOC_CTX *lp_talloc;
-
-/******************************************************************* a
- Free up temporary memory - called from the main loop.
-********************************************************************/
 
-void lp_TALLOC_FREE(void)
-{
-       if (!lp_talloc)
-               return;
-       TALLOC_FREE(lp_talloc);
-       lp_talloc = NULL;
-}
-
-TALLOC_CTX *tmp_talloc_ctx(void)
-{
-       if (lp_talloc == NULL) {
-               lp_talloc = talloc_init("tmp_talloc_ctx");
-       }
-
-       if (lp_talloc == NULL) {
-               smb_panic("Could not create temporary talloc context");
-       }
-
-       return lp_talloc;
+       Globals.iminreceivefile = 0;
 }
 
 /*******************************************************************
@@ -1742,9 +1733,6 @@ static char *lp_string(const char *s)
        DEBUG(10, ("lp_string(%s)\n", s));
 #endif
 
-       if (!lp_talloc)
-               lp_talloc = talloc_init("lp_talloc");
-
        tmpstr = alloc_sub_basic(get_current_username(),
                                 current_user_info.domain, s);
        if (trim_char(tmpstr, '\"', '\"')) {
@@ -1754,7 +1742,7 @@ static char *lp_string(const char *s)
                                                 current_user_info.domain, s);
                }
        }
-       ret = talloc_strdup(lp_talloc, tmpstr);
+       ret = talloc_strdup(talloc_tos(), tmpstr);
        SAFE_FREE(tmpstr);
                        
        return (ret);
@@ -1772,7 +1760,7 @@ static char *lp_string(const char *s)
 #define FN_GLOBAL_LIST(fn_name,ptr) \
  const char **fn_name(void) {return(*(const char ***)(ptr));}
 #define FN_GLOBAL_BOOL(fn_name,ptr) \
BOOL fn_name(void) {return(*(BOOL *)(ptr));}
bool fn_name(void) {return(*(bool *)(ptr));}
 #define FN_GLOBAL_CHAR(fn_name,ptr) \
  char fn_name(void) {return(*(char *)(ptr));}
 #define FN_GLOBAL_INTEGER(fn_name,ptr) \
@@ -1785,12 +1773,12 @@ static char *lp_string(const char *s)
 #define FN_LOCAL_LIST(fn_name,val) \
  const char **fn_name(int i) {return(const char **)(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
 #define FN_LOCAL_BOOL(fn_name,val) \
BOOL fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
bool fn_name(int i) {return(bool)(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
 #define FN_LOCAL_INTEGER(fn_name,val) \
  int fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
 
 #define FN_LOCAL_PARM_BOOL(fn_name,val) \
BOOL fn_name(const struct share_params *p) {return(LP_SNUM_OK(p->service)? ServicePtrs[(p->service)]->val : sDefault.val);}
bool fn_name(const struct share_params *p) {return(bool)(LP_SNUM_OK(p->service)? ServicePtrs[(p->service)]->val : sDefault.val);}
 #define FN_LOCAL_PARM_INTEGER(fn_name,val) \
  int fn_name(const struct share_params *p) {return(LP_SNUM_OK(p->service)? ServicePtrs[(p->service)]->val : sDefault.val);}
 #define FN_LOCAL_PARM_STRING(fn_name,val) \
@@ -1964,7 +1952,6 @@ FN_GLOBAL_BOOL(lp_wins_proxy, &Globals.bWINSproxy)
 FN_GLOBAL_BOOL(lp_local_master, &Globals.bLocalMaster)
 FN_GLOBAL_BOOL(lp_domain_logons, &Globals.bDomainLogons)
 FN_GLOBAL_BOOL(lp_load_printers, &Globals.bLoadPrinters)
-FN_GLOBAL_BOOL(lp_readbmpx, &Globals.bReadbmpx)
 FN_GLOBAL_BOOL(lp_readraw, &Globals.bReadRaw)
 FN_GLOBAL_BOOL(lp_large_readwrite, &Globals.bLargeReadwrite)
 FN_GLOBAL_BOOL(lp_writeraw, &Globals.bWriteRaw)
@@ -1980,6 +1967,7 @@ FN_GLOBAL_BOOL(lp_debug_prefix_timestamp, &Globals.bDebugPrefixTimestamp)
 FN_GLOBAL_BOOL(lp_debug_hires_timestamp, &Globals.bDebugHiresTimestamp)
 FN_GLOBAL_BOOL(lp_debug_pid, &Globals.bDebugPid)
 FN_GLOBAL_BOOL(lp_debug_uid, &Globals.bDebugUid)
+FN_GLOBAL_BOOL(lp_debug_class, &Globals.bDebugClass)
 FN_GLOBAL_BOOL(lp_enable_core_files, &Globals.bEnableCoreFiles)
 FN_GLOBAL_BOOL(lp_browse_list, &Globals.bBrowseList)
 FN_GLOBAL_BOOL(lp_nis_home_map, &Globals.bNISHomeMap)
@@ -2034,7 +2022,7 @@ FN_GLOBAL_BOOL(lp_paranoid_server_security, &Globals.paranoid_server_security)
 FN_GLOBAL_INTEGER(lp_maxdisksize, &Globals.maxdisksize)
 FN_GLOBAL_INTEGER(lp_lpqcachetime, &Globals.lpqcachetime)
 FN_GLOBAL_INTEGER(lp_max_smbd_processes, &Globals.iMaxSmbdProcesses)
-FN_GLOBAL_INTEGER(_lp_disable_spoolss, &Globals.bDisableSpoolss)
+FN_GLOBAL_BOOL(_lp_disable_spoolss, &Globals.bDisableSpoolss)
 FN_GLOBAL_INTEGER(lp_syslog, &Globals.syslog)
 static FN_GLOBAL_INTEGER(lp_announce_as, &Globals.announce_as)
 FN_GLOBAL_INTEGER(lp_lm_announce, &Globals.lm_announce)
@@ -2062,6 +2050,7 @@ FN_LOCAL_STRING(lp_cups_options, szCupsOptions)
 FN_GLOBAL_STRING(lp_cups_server, &Globals.szCupsServer)
 FN_GLOBAL_STRING(lp_iprint_server, &Globals.szIPrintServer)
 FN_GLOBAL_CONST_STRING(lp_ctdbd_socket, &Globals.ctdbdSocket)
+FN_GLOBAL_LIST(lp_cluster_addresses, &Globals.szClusterAddresses)
 FN_GLOBAL_BOOL(lp_clustering, &Globals.clustering);
 FN_LOCAL_STRING(lp_printcommand, szPrintcommand)
 FN_LOCAL_STRING(lp_lpqcommand, szLpqcommand)
@@ -2086,11 +2075,11 @@ FN_LOCAL_STRING(lp_fstype, fstype)
 FN_LOCAL_LIST(lp_vfs_objects, szVfsObjects)
 FN_LOCAL_STRING(lp_msdfs_proxy, szMSDfsProxy)
 static FN_LOCAL_STRING(lp_volume, volume)
-FN_LOCAL_PARM_STRING(lp_mangled_map, szMangledMap)
 FN_LOCAL_STRING(lp_veto_files, szVetoFiles)
 FN_LOCAL_STRING(lp_hide_files, szHideFiles)
 FN_LOCAL_STRING(lp_veto_oplocks, szVetoOplockFiles)
 FN_LOCAL_BOOL(lp_msdfs_root, bMSDfsRoot)
+FN_LOCAL_STRING(lp_aio_write_behind, szAioWriteBehind)
 FN_LOCAL_STRING(lp_dfree_command, szDfree)
 FN_LOCAL_BOOL(lp_autoloaded, autoloaded)
 FN_LOCAL_BOOL(lp_preexec_close, bPreexecClose)
@@ -2172,6 +2161,7 @@ FN_LOCAL_INTEGER(lp_allocation_roundup_size, iallocation_roundup_size)
 FN_LOCAL_INTEGER(lp_aio_read_size, iAioReadSize)
 FN_LOCAL_INTEGER(lp_aio_write_size, iAioWriteSize)
 FN_LOCAL_INTEGER(lp_map_readonly, iMap_readonly)
+FN_LOCAL_INTEGER(lp_directory_name_cache_size, iDirectoryNameCacheSize)
 FN_LOCAL_CHAR(lp_magicchar, magic_char)
 FN_GLOBAL_INTEGER(lp_winbind_cache_time, &Globals.winbind_cache_time)
 FN_GLOBAL_LIST(lp_winbind_nss_info, &Globals.szWinbindNssInfo)
@@ -2179,28 +2169,34 @@ FN_GLOBAL_INTEGER(lp_algorithmic_rid_base, &Globals.AlgorithmicRidBase)
 FN_GLOBAL_INTEGER(lp_name_cache_timeout, &Globals.name_cache_timeout)
 FN_GLOBAL_INTEGER(lp_client_signing, &Globals.client_signing)
 FN_GLOBAL_INTEGER(lp_server_signing, &Globals.server_signing)
+FN_GLOBAL_INTEGER(lp_min_receive_file_size, &Globals.iminreceivefile);
+FN_GLOBAL_INTEGER(lp_client_ldap_sasl_wrapping, &Globals.client_ldap_sasl_wrapping)
 
 /* local prototypes */
 
 static int map_parameter(const char *pszParmName);
-static BOOL set_boolean(BOOL *pb, const char *pszParmValue);
+static int map_parameter_canonical(const char *pszParmName, bool *inverse);
+static bool set_boolean(bool *pb, const char *pszParmValue);
+static const char *get_boolean(bool bool_value);
 static int getservicebyname(const char *pszServiceName,
                            service * pserviceDest);
 static void copy_service(service * pserviceDest,
-                        service * pserviceSource, BOOL *pcopymapDest);
-static BOOL do_parameter(const char *pszParmName, const char *pszParmValue);
-static BOOL do_section(const char *pszSectionName);
+                        service * pserviceSource, bool *pcopymapDest);
+static bool do_parameter(const char *pszParmName, const char *pszParmValue);
+static bool do_section(const char *pszSectionName);
 static void init_copymap(service * pservice);
-static BOOL hash_a_service(const char *name, int number);
+static bool hash_a_service(const char *name, int number);
 static void free_service_byindex(int iService);
 static char * canonicalize_servicename(const char *name);
+static void show_parameter(int parmIndex);
+static bool is_synonym_of(int parm1, int parm2, bool *inverse);
 
 /* This is a helper function for parametrical options support. */
 /* It returns a pointer to parametrical option value if it exists or NULL otherwise */
 /* Actual parametrical functions are quite simple */
 static param_opt_struct *get_parametrics(int snum, const char *type, const char *option)
 {
-       BOOL global_section = False;
+       bool global_section = False;
        char* param_key;
         param_opt_struct *data;
        
@@ -2280,9 +2276,9 @@ static unsigned long lp_ulong(const char *s)
 /*******************************************************************
 convenience routine to return boolean parameters.
 ********************************************************************/
-static BOOL lp_bool(const char *s)
+static bool lp_bool(const char *s)
 {
-       BOOL ret = False;
+       bool ret = False;
 
        if (!s || !*s) {
                MISSING_PARAMETER(lp_bool);
@@ -2334,7 +2330,7 @@ static int lp_enum(const char *s,const struct enum_list *_enum)
 
 /* Return parametric option from a given service. Type is a part of option before ':' */
 /* Parametric option has following syntax: 'Type: option = value' */
-/* the returned value is talloced in lp_talloc */
+/* the returned value is talloced on the talloc_tos() */
 char *lp_parm_talloc_string(int snum, const char *type, const char *option, const char *def)
 {
        param_opt_struct *data = get_parametrics(snum, type, option);
@@ -2408,7 +2404,7 @@ unsigned long lp_parm_ulong(int snum, const char *type, const char *option, unsi
 /* Return parametric option from a given service. Type is a part of option before ':' */
 /* Parametric option has following syntax: 'Type: option = value' */
 
-BOOL lp_parm_bool(int snum, const char *type, const char *option, BOOL def)
+bool lp_parm_bool(int snum, const char *type, const char *option, bool def)
 {
        param_opt_struct *data = get_parametrics(snum, type, option);
        
@@ -2605,7 +2601,7 @@ static int add_a_service(const service *pservice, const char *name)
 }
 
 /***************************************************************************
-  Canonicalize by converting to lowercase.
+  Convert a string to uppercase and remove whitespaces.
 ***************************************************************************/
 
 static char *canonicalize_servicename(const char *src)
@@ -2627,7 +2623,7 @@ static char *canonicalize_servicename(const char *src)
   Add a name/index pair for the services array to the hash table.
 ***************************************************************************/
 
-static BOOL hash_a_service(const char *name, int idx)
+static bool hash_a_service(const char *name, int idx)
 {
        char *canon_name;
 
@@ -2657,7 +2653,7 @@ static BOOL hash_a_service(const char *name, int idx)
  from service ifrom.
 ***************************************************************************/
 
-BOOL lp_add_home(const char *pszHomename, int iDefaultService, 
+bool lp_add_home(const char *pszHomename, int iDefaultService, 
                 const char *user, const char *pszHomedir)
 {
        int i;
@@ -2710,7 +2706,7 @@ int lp_add_service(const char *pszService, int iDefaultService)
  Add the IPC service.
 ***************************************************************************/
 
-static BOOL lp_add_ipc(const char *ipc_name, BOOL guest_ok)
+static bool lp_add_ipc(const char *ipc_name, bool guest_ok)
 {
        pstring comment;
        int i = add_a_service(&sDefault, ipc_name);
@@ -2742,7 +2738,7 @@ static BOOL lp_add_ipc(const char *ipc_name, BOOL guest_ok)
  Add a new printer service, with defaults coming from service iFrom.
 ***************************************************************************/
 
-BOOL lp_add_printer(const char *pszPrintername, int iDefaultService)
+bool lp_add_printer(const char *pszPrintername, int iDefaultService)
 {
        const char *comment = "From Printcap";
        int i = add_a_service(ServicePtrs[iDefaultService], pszPrintername);
@@ -2776,6 +2772,125 @@ BOOL lp_add_printer(const char *pszPrintername, int iDefaultService)
        return (True);
 }
 
+
+/***************************************************************************
+ Check whether the given parameter name is valid.
+ Parametric options (names containing a colon) are considered valid.
+***************************************************************************/
+
+bool lp_parameter_is_valid(const char *pszParmName)
+{
+       return ((map_parameter(pszParmName) != -1) ||
+               (strchr(pszParmName, ':') != NULL));
+}
+
+/***************************************************************************
+ Check whether the given name is the name of a global parameter.
+ Returns True for strings belonging to parameters of class
+ P_GLOBAL, False for all other strings, also for parametric options
+ and strings not belonging to any option.
+***************************************************************************/
+
+bool lp_parameter_is_global(const char *pszParmName)
+{
+       int num = map_parameter(pszParmName);
+
+       if (num >= 0) {
+               return (parm_table[num].p_class == P_GLOBAL);
+       }
+
+       return False;
+}
+
+/**************************************************************************
+ Check whether the given name is the canonical name of a parameter.
+ Returns False if it is not a valid parameter Name.
+ For parametric options, True is returned.
+**************************************************************************/
+
+bool lp_parameter_is_canonical(const char *parm_name)
+{
+       if (!lp_parameter_is_valid(parm_name)) {
+               return False;
+       }
+
+       return (map_parameter(parm_name) ==
+               map_parameter_canonical(parm_name, NULL));
+}
+
+/**************************************************************************
+ Determine the canonical name for a parameter.
+ Indicate when it is an inverse (boolean) synonym instead of a
+ "usual" synonym.
+**************************************************************************/
+
+bool lp_canonicalize_parameter(const char *parm_name, const char **canon_parm,
+                              bool *inverse)
+{
+       int num;
+
+       if (!lp_parameter_is_valid(parm_name)) {
+               *canon_parm = NULL;
+               return False;
+       }
+
+       num = map_parameter_canonical(parm_name, inverse);
+       if (num < 0) {
+               /* parametric option */
+               *canon_parm = parm_name;
+       } else {
+               *canon_parm = parm_table[num].label;
+       }
+
+       return True;
+
+}
+
+/**************************************************************************
+ Determine the canonical name for a parameter.
+ Turn the value given into the inverse boolean expression when
+ the synonym is an invers boolean synonym.
+
+ Return True if parm_name is a valid parameter name and
+ in case it is an invers boolean synonym, if the val string could
+ successfully be converted to the reverse bool.
+ Return false in all other cases.
+**************************************************************************/
+
+bool lp_canonicalize_parameter_with_value(const char *parm_name,
+                                         const char *val,
+                                         const char **canon_parm,
+                                         const char **canon_val)
+{
+       int num;
+       bool inverse;
+
+       if (!lp_parameter_is_valid(parm_name)) {
+               *canon_parm = NULL;
+               *canon_val = NULL;
+               return False;
+       }
+
+       num = map_parameter_canonical(parm_name, &inverse);
+       if (num < 0) {
+               /* parametric option */
+               *canon_parm = parm_name;
+               *canon_val = val;
+       } else {
+               *canon_parm = parm_table[num].label;
+               if (inverse) {
+                       if (!lp_invert_boolean(val, canon_val)) {
+                               *canon_val = NULL;
+                               return False;
+                       }
+               } else {
+                       *canon_val = val;
+               }
+       }
+
+       return True;
+}
+
 /***************************************************************************
  Map a parameter's string representation to something we can use. 
  Returns False if the parameter string is not recognised, else TRUE.
@@ -2802,14 +2917,75 @@ static int map_parameter(const char *pszParmName)
 }
 
 /***************************************************************************
- Show all parameter's name, type, [values,] and flags.
+ Map a parameter's string representation to the index of the canonical
+ form of the parameter (it might be a synonym).
+ Returns -1 if the parameter string is not recognised.
 ***************************************************************************/
 
-void show_parameter_list(void)
+static int map_parameter_canonical(const char *pszParmName, bool *inverse)
 {
-       int classIndex, parmIndex, enumIndex, flagIndex;
-       BOOL hadFlag;
-       const char *section_names[] = { "local", "global", NULL};
+       int parm_num, canon_num;
+       bool loc_inverse = False;
+
+       parm_num = map_parameter(pszParmName);
+       if ((parm_num < 0) || !(parm_table[parm_num].flags & FLAG_HIDE)) {
+               /* invalid, parametric or no canidate for synonyms ... */
+               goto done;
+       }
+
+       for (canon_num = 0; parm_table[canon_num].label; canon_num++) {
+               if (is_synonym_of(parm_num, canon_num, &loc_inverse)) {
+                       parm_num = canon_num;
+                       goto done;
+               }
+       }
+
+done:
+       if (inverse != NULL) {
+               *inverse = loc_inverse;
+       }
+       return parm_num;
+}
+
+/***************************************************************************
+ return true if parameter number parm1 is a synonym of parameter
+ number parm2 (parm2 being the principal name).
+ set inverse to True if parm1 is P_BOOLREV and parm2 is P_BOOL,
+ False otherwise.
+***************************************************************************/
+
+static bool is_synonym_of(int parm1, int parm2, bool *inverse)
+{
+       if ((parm_table[parm1].ptr == parm_table[parm2].ptr) &&
+           (parm_table[parm1].flags & FLAG_HIDE) &&
+           !(parm_table[parm2].flags & FLAG_HIDE))
+       {
+               if (inverse != NULL) {
+                       if ((parm_table[parm1].type == P_BOOLREV) &&
+                           (parm_table[parm2].type == P_BOOL))
+                       {
+                               *inverse = True;
+                       } else {
+                               *inverse = False;
+                       }
+               }
+               return True;
+       }
+       return False;
+}
+
+/***************************************************************************
+ Show one parameter's name, type, [values,] and flags.
+ (helper functions for show_parameter_list)
+***************************************************************************/
+
+static void show_parameter(int parmIndex)
+{
+       int enumIndex, flagIndex;
+       int parmIndex2;
+       bool hadFlag;
+       bool hadSyn;
+       bool inverse;
        const char *type[] = { "P_BOOL", "P_BOOLREV", "P_CHAR", "P_INTEGER",
                "P_OCTAL", "P_LIST", "P_STRING", "P_USTRING", "P_GSTRING",
                "P_UGSTRING", "P_ENUM", "P_SEP"};
@@ -2820,35 +2996,68 @@ void show_parameter_list(void)
                "FLAG_GLOBAL", "FLAG_WIZARD", "FLAG_ADVANCED", "FLAG_DEVELOPER",
                "FLAG_DEPRECATED", "FLAG_HIDE", "FLAG_DOS_STRING", NULL};
 
-       for ( classIndex=0; section_names[classIndex]; classIndex++) {
+       printf("%s=%s", parm_table[parmIndex].label,
+              type[parm_table[parmIndex].type]);
+       if (parm_table[parmIndex].type == P_ENUM) {
+               printf(",");
+               for (enumIndex=0;
+                    parm_table[parmIndex].enum_list[enumIndex].name;
+                    enumIndex++)
+               {
+                       printf("%s%s",
+                              enumIndex ? "|" : "",
+                              parm_table[parmIndex].enum_list[enumIndex].name);
+               }
+       }
+       printf(",");
+       hadFlag = False;
+       for (flagIndex=0; flag_names[flagIndex]; flagIndex++) {
+               if (parm_table[parmIndex].flags & flags[flagIndex]) {
+                       printf("%s%s",
+                               hadFlag ? "|" : "",
+                               flag_names[flagIndex]);
+                       hadFlag = True;
+               }
+       }
+
+       /* output synonyms */
+       hadSyn = False;
+       for (parmIndex2=0; parm_table[parmIndex2].label; parmIndex2++) {
+               if (is_synonym_of(parmIndex, parmIndex2, &inverse)) {
+                       printf(" (%ssynonym of %s)", inverse ? "inverse " : "",
+                              parm_table[parmIndex2].label);
+               } else if (is_synonym_of(parmIndex2, parmIndex, &inverse)) {
+                       if (!hadSyn) {
+                               printf(" (synonyms: ");
+                               hadSyn = True;
+                       } else {
+                               printf(", ");
+                       }
+                       printf("%s%s", parm_table[parmIndex2].label,
+                              inverse ? "[i]" : "");
+               }
+       }
+       if (hadSyn) {
+               printf(")");
+       }
+
+       printf("\n");
+}
+
+/***************************************************************************
+ Show all parameter's name, type, [values,] and flags.
+***************************************************************************/
+
+void show_parameter_list(void)
+{
+       int classIndex, parmIndex;
+       const char *section_names[] = { "local", "global", NULL};
+
+       for (classIndex=0; section_names[classIndex]; classIndex++) {
                printf("[%s]\n", section_names[classIndex]);
                for (parmIndex = 0; parm_table[parmIndex].label; parmIndex++) {
                        if (parm_table[parmIndex].p_class == classIndex) {
-                               printf("%s=%s", 
-                                       parm_table[parmIndex].label,
-                                       type[parm_table[parmIndex].type]);
-                               switch (parm_table[parmIndex].type) {
-                               case P_ENUM:
-                                       printf(",");
-                                       for (enumIndex=0; parm_table[parmIndex].enum_list[enumIndex].name; enumIndex++)
-                                               printf("%s%s",
-                                                       enumIndex ? "|" : "",
-                                                       parm_table[parmIndex].enum_list[enumIndex].name);
-                                       break;
-                               default:
-                                       break;
-                               }
-                               printf(",");
-                               hadFlag = False;
-                               for ( flagIndex=0; flag_names[flagIndex]; flagIndex++ ) {
-                                       if (parm_table[parmIndex].flags & flags[flagIndex]) {
-                                               printf("%s%s",
-                                                       hadFlag ? "|" : "",
-                                                       flag_names[flagIndex]);
-                                               hadFlag = True;
-                                       }
-                               }
-                               printf("\n");
+                               show_parameter(parmIndex);
                        }
                }
        }
@@ -2860,28 +3069,93 @@ void show_parameter_list(void)
  represent a boolean.
 ***************************************************************************/
 
-static BOOL set_boolean(BOOL *pb, const char *pszParmValue)
+static bool set_boolean(bool *pb, const char *pszParmValue)
 {
-       BOOL bRetval;
+       bool bRetval;
+       bool value;
 
        bRetval = True;
+       value = False;
        if (strwicmp(pszParmValue, "yes") == 0 ||
            strwicmp(pszParmValue, "true") == 0 ||
            strwicmp(pszParmValue, "1") == 0)
-               *pb = True;
+               value = True;
        else if (strwicmp(pszParmValue, "no") == 0 ||
                    strwicmp(pszParmValue, "False") == 0 ||
                    strwicmp(pszParmValue, "0") == 0)
-               *pb = False;
+               value = False;
        else {
-               DEBUG(0,
+               DEBUG(2,
                      ("ERROR: Badly formed boolean in configuration file: \"%s\".\n",
                       pszParmValue));
                bRetval = False;
        }
+
+       if ((pb != NULL) && (bRetval != False)) {
+               *pb = value;
+       }
+
        return (bRetval);
 }
 
+
+/***************************************************************************
+ Check if a given string correctly represents a boolean value.
+***************************************************************************/
+
+bool lp_string_is_valid_boolean(const char *parm_value)
+{
+       return set_boolean(NULL, parm_value);
+}
+
+/***************************************************************************
+ Get the standard string representation of a boolean value ("yes" or "no")
+***************************************************************************/
+
+static const char *get_boolean(bool bool_value)
+{
+       static const char *yes_str = "yes";
+       static const char *no_str = "no";
+
+       return (bool_value ? yes_str : no_str);
+}
+
+/***************************************************************************
+ Provide the string of the negated boolean value associated to the boolean
+ given as a string. Returns False if the passed string does not correctly
+ represent a boolean.
+***************************************************************************/
+
+bool lp_invert_boolean(const char *str, const char **inverse_str)
+{
+       bool val;
+
+       if (!set_boolean(&val, str)) {
+               return False;
+       }
+
+       *inverse_str = get_boolean(!val);
+       return True;
+}
+
+/***************************************************************************
+ Provide the canonical string representation of a boolean value given
+ as a string. Return True on success, False if the string given does
+ not correctly represent a boolean.
+***************************************************************************/
+
+bool lp_canonicalize_boolean(const char *str, const char**canon_str)
+{
+       bool val;
+
+       if (!set_boolean(&val, str)) {
+               return False;
+       }
+
+       *canon_str = get_boolean(val);
+       return True;
+}
+
 /***************************************************************************
 Find a service by name. Otherwise works like get_service.
 ***************************************************************************/
@@ -2914,12 +3188,12 @@ static int getservicebyname(const char *pszServiceName, service * pserviceDest)
  If pcopymapDest is NULL then copy all fields
 ***************************************************************************/
 
-static void copy_service(service * pserviceDest, service * pserviceSource, BOOL *pcopymapDest)
+static void copy_service(service * pserviceDest, service * pserviceSource, bool *pcopymapDest)
 {
        int i;
-       BOOL bcopyall = (pcopymapDest == NULL);
+       bool bcopyall = (pcopymapDest == NULL);
        param_opt_struct *data, *pdata, *paramo;
-       BOOL not_added;
+       bool not_added;
 
        for (i = 0; parm_table[i].label; i++)
                if (parm_table[i].ptr && parm_table[i].p_class == P_LOCAL &&
@@ -2935,7 +3209,7 @@ static void copy_service(service * pserviceDest, service * pserviceSource, BOOL
                        switch (parm_table[i].type) {
                                case P_BOOL:
                                case P_BOOLREV:
-                                       *(BOOL *)dest_ptr = *(BOOL *)src_ptr;
+                                       *(bool *)dest_ptr = *(bool *)src_ptr;
                                        break;
 
                                case P_INTEGER:
@@ -2972,7 +3246,7 @@ static void copy_service(service * pserviceDest, service * pserviceSource, BOOL
                if (pserviceSource->copymap)
                        memcpy((void *)pserviceDest->copymap,
                               (void *)pserviceSource->copymap,
-                              sizeof(BOOL) * NUMPARAMETERS);
+                              sizeof(bool) * NUMPARAMETERS);
        }
        
        data = pserviceSource->param_opt;
@@ -3007,9 +3281,9 @@ Check a service for consistency. Return False if the service is in any way
 incomplete or faulty, else True.
 ***************************************************************************/
 
-BOOL service_ok(int iService)
+bool service_ok(int iService)
 {
-       BOOL bRetval;
+       bool bRetval;
 
        bRetval = True;
        if (ServicePtrs[iService]->szService[0] == '\0') {
@@ -3068,14 +3342,15 @@ static struct tdb_wrap *lp_regdb_open(void)
        become_root();
        reg_tdb = tdb_wrap_open(NULL, lock_path("registry.tdb"), 0, 
                                REG_TDB_FLAGS, O_RDWR, 0600);
+       unbecome_root();
        if (!reg_tdb) {
-               DEBUG(0, ("lp_regdb_open: failed to open %s: %s\n",
+               DEBUG(1, ("lp_regdb_open: failed to open %s: %s\n",
                         lock_path("registry.tdb"), strerror(errno)));
+               goto done;
        }
        else {
                DEBUG(10, ("lp_regdb_open: reg tdb opened.\n"));
        }
-       unbecome_root();
 
        vers_id = tdb_fetch_int32(reg_tdb->tdb, vstring);
        if (vers_id != REGVER_V1) {
@@ -3085,6 +3360,7 @@ static struct tdb_wrap *lp_regdb_open(void)
                /* this is apparently not implemented in the tdb */
        }
 
+done:
        return reg_tdb;
 }
 
@@ -3099,9 +3375,9 @@ static struct tdb_wrap *lp_regdb_open(void)
  * and regdb_unpack_values, circumventing any fancy stuff, to
  * give us access to the registry globals.
  */
-static BOOL process_registry_globals(BOOL (*pfunc)(const char *, const char *))
+static bool process_registry_globals(bool (*pfunc)(const char *, const char *))
 {
-       BOOL ret = False;
+       bool ret = False;
        struct tdb_wrap *reg_tdb = NULL;
        WERROR err;
        char *keystr;
@@ -3136,7 +3412,7 @@ static BOOL process_registry_globals(BOOL (*pfunc)(const char *, const char *))
                                 KEY_SMBCONF, GLOBAL_NAME);
        normalize_dbkey(keystr);
 
-       DEBUG(10, ("process_registry_shares: fetching key '%s'\n",
+       DEBUG(10, ("process_registry_globals: fetching key '%s'\n",
                   keystr));
 
        data = tdb_fetch_bystring(reg_tdb->tdb, keystr);
@@ -3150,7 +3426,7 @@ static BOOL process_registry_globals(BOOL (*pfunc)(const char *, const char *))
 
        /* unpack number of values */
        len = tdb_unpack(buf, buflen, "d", &num_values);
-       DEBUG(10, ("process_registry_shares: got %d values from tdb\n",
+       DEBUG(10, ("process_registry_globals: got %d values from tdb\n",
                   num_values));
 
        /* unpack the values */
@@ -3163,7 +3439,12 @@ static BOOL process_registry_globals(BOOL (*pfunc)(const char *, const char *))
                                  &type,
                                  &size,
                                  &data_p);
-               DEBUG(10, ("process_registry_shares: got value '%s'\n",
+               if (registry_smbconf_valname_forbidden(valname)) {
+                       DEBUG(10, ("process_registry_globals: Ignoring "
+                                  "parameter '%s' in registry.\n", valname));
+                       continue;
+               }
+               DEBUG(10, ("process_registry_globals: got value '%s'\n",
                           valname));
                if (size && data_p) {
                        err = registry_pull_value(reg_tdb, 
@@ -3207,9 +3488,9 @@ done:
  * using the reg_api functions...
  * 
  */
-static BOOL process_registry_globals(BOOL (*pfunc)(const char *, const char *))
+static bool process_registry_globals(bool (*pfunc)(const char *, const char *))
 {
-       BOOL ret = False;
+       bool ret = False;
        TALLOC_CTX *ctx = NULL;
        char *regpath = NULL;
        WERROR werr = WERR_OK;
@@ -3329,7 +3610,7 @@ static void add_to_file_list(const char *fname, const char *subfname)
  Check if a config file has changed date.
 ********************************************************************/
 
-BOOL lp_file_list_changed(void)
+bool lp_file_list_changed(void)
 {
        struct file_lists *f = file_lists;
        struct tdb_wrap *reg_tdb = NULL;
@@ -3381,9 +3662,9 @@ BOOL lp_file_list_changed(void)
  Note: We must *NOT* use string_set() here as ptr points to global_myname.
 ***************************************************************************/
 
-static BOOL handle_netbios_name(int snum, const char *pszParmValue, char **ptr)
+static bool handle_netbios_name(int snum, const char *pszParmValue, char **ptr)
 {
-       BOOL ret;
+       bool ret;
        pstring netbios_name;
 
        pstrcpy(netbios_name, pszParmValue);
@@ -3400,7 +3681,7 @@ static BOOL handle_netbios_name(int snum, const char *pszParmValue, char **ptr)
        return ret;
 }
 
-static BOOL handle_charset(int snum, const char *pszParmValue, char **ptr)
+static bool handle_charset(int snum, const char *pszParmValue, char **ptr)
 {
        if (strcmp(*ptr, pszParmValue) != 0) {
                string_set(ptr, pszParmValue);
@@ -3411,9 +3692,9 @@ static BOOL handle_charset(int snum, const char *pszParmValue, char **ptr)
 
 
 
-static BOOL handle_workgroup(int snum, const char *pszParmValue, char **ptr)
+static bool handle_workgroup(int snum, const char *pszParmValue, char **ptr)
 {
-       BOOL ret;
+       bool ret;
        
        ret = set_global_myworkgroup(pszParmValue);
        string_set(&Globals.szWorkgroup,lp_workgroup());
@@ -3421,9 +3702,9 @@ static BOOL handle_workgroup(int snum, const char *pszParmValue, char **ptr)
        return ret;
 }
 
-static BOOL handle_netbios_scope(int snum, const char *pszParmValue, char **ptr)
+static bool handle_netbios_scope(int snum, const char *pszParmValue, char **ptr)
 {
-       BOOL ret;
+       bool ret;
        
        ret = set_global_scope(pszParmValue);
        string_set(&Globals.szNetbiosScope,global_scope());
@@ -3431,7 +3712,7 @@ static BOOL handle_netbios_scope(int snum, const char *pszParmValue, char **ptr)
        return ret;
 }
 
-static BOOL handle_netbios_aliases(int snum, const char *pszParmValue, char **ptr)
+static bool handle_netbios_aliases(int snum, const char *pszParmValue, char **ptr)
 {
        str_list_free(&Globals.szNetbiosAliases);
        Globals.szNetbiosAliases = str_list_make(pszParmValue, NULL);
@@ -3442,7 +3723,7 @@ static BOOL handle_netbios_aliases(int snum, const char *pszParmValue, char **pt
  Handle the include operation.
 ***************************************************************************/
 
-static BOOL handle_include(int snum, const char *pszParmValue, char **ptr)
+static bool handle_include(int snum, const char *pszParmValue, char **ptr)
 {
        pstring fname;
        pstrcpy(fname, pszParmValue);
@@ -3477,9 +3758,9 @@ static BOOL handle_include(int snum, const char *pszParmValue, char **ptr)
  Handle the interpretation of the copy parameter.
 ***************************************************************************/
 
-static BOOL handle_copy(int snum, const char *pszParmValue, char **ptr)
+static bool handle_copy(int snum, const char *pszParmValue, char **ptr)
 {
-       BOOL bRetval;
+       bool bRetval;
        int iTemp;
        service serviceTemp;
 
@@ -3528,7 +3809,7 @@ static BOOL handle_copy(int snum, const char *pszParmValue, char **ptr)
 static uid_t idmap_uid_low, idmap_uid_high;
 static gid_t idmap_gid_low, idmap_gid_high;
 
-BOOL lp_idmap_uid(uid_t *low, uid_t *high)
+bool lp_idmap_uid(uid_t *low, uid_t *high)
 {
         if (idmap_uid_low == 0 || idmap_uid_high == 0)
                 return False;
@@ -3542,7 +3823,7 @@ BOOL lp_idmap_uid(uid_t *low, uid_t *high)
         return True;
 }
 
-BOOL lp_idmap_gid(gid_t *low, gid_t *high)
+bool lp_idmap_gid(gid_t *low, gid_t *high)
 {
         if (idmap_gid_low == 0 || idmap_gid_high == 0)
                 return False;
@@ -3558,7 +3839,7 @@ BOOL lp_idmap_gid(gid_t *low, gid_t *high)
 
 /* Do some simple checks on "idmap [ug]id" parameter values */
 
-static BOOL handle_idmap_uid(int snum, const char *pszParmValue, char **ptr)
+static bool handle_idmap_uid(int snum, const char *pszParmValue, char **ptr)
 {
        uint32 low, high;
 
@@ -3575,7 +3856,7 @@ static BOOL handle_idmap_uid(int snum, const char *pszParmValue, char **ptr)
        return True;
 }
 
-static BOOL handle_idmap_gid(int snum, const char *pszParmValue, char **ptr)
+static bool handle_idmap_gid(int snum, const char *pszParmValue, char **ptr)
 {
        uint32 low, high;
 
@@ -3596,7 +3877,7 @@ static BOOL handle_idmap_gid(int snum, const char *pszParmValue, char **ptr)
  Handle the DEBUG level list.
 ***************************************************************************/
 
-static BOOL handle_debug_list( int snum, const char *pszParmValueIn, char **ptr )
+static bool handle_debug_list( int snum, const char *pszParmValueIn, char **ptr )
 {
        pstring pszParmValue;
 
@@ -3614,10 +3895,8 @@ static const char *append_ldap_suffix( const char *str )
        const char *suffix_string;
 
 
-       if (!lp_talloc)
-               lp_talloc = talloc_init("lp_talloc");
-
-       suffix_string = talloc_asprintf( lp_talloc, "%s,%s", str, Globals.szLdapSuffix );
+       suffix_string = talloc_asprintf(talloc_tos(), "%s,%s", str,
+                                       Globals.szLdapSuffix );
        if ( !suffix_string ) {
                DEBUG(0,("append_ldap_suffix: talloc_asprintf() failed!\n"));
                return "";
@@ -3678,7 +3957,7 @@ static void lp_set_enum_parm( struct parm_struct *parm, const char *pszParmValue
 /***************************************************************************
 ***************************************************************************/
 
-static BOOL handle_printing(int snum, const char *pszParmValue, char **ptr)
+static bool handle_printing(int snum, const char *pszParmValue, char **ptr)
 {
        static int parm_num = -1;
        service *s;
@@ -3707,7 +3986,7 @@ static void init_copymap(service * pservice)
 {
        int i;
        SAFE_FREE(pservice->copymap);
-       pservice->copymap = SMB_MALLOC_ARRAY(BOOL,NUMPARAMETERS);
+       pservice->copymap = SMB_MALLOC_ARRAY(bool,NUMPARAMETERS);
        if (!pservice->copymap)
                DEBUG(0,
                      ("Couldn't allocate copymap!! (size %d)\n",
@@ -3732,7 +4011,7 @@ void *lp_local_ptr(int snum, void *ptr)
  then assume we are in the globals.
 ***************************************************************************/
 
-BOOL lp_do_parameter(int snum, const char *pszParmName, const char *pszParmValue)
+bool lp_do_parameter(int snum, const char *pszParmName, const char *pszParmValue)
 {
        int parmnum, i, slen;
        void *parm_ptr = NULL;  /* where we are going to store the result */
@@ -3740,7 +4019,7 @@ BOOL lp_do_parameter(int snum, const char *pszParmName, const char *pszParmValue
        pstring param_key;
        char *sep;
        param_opt_struct *paramo, *data;
-       BOOL not_added;
+       bool not_added;
 
        parmnum = map_parameter(pszParmName);
 
@@ -3806,7 +4085,9 @@ BOOL lp_do_parameter(int snum, const char *pszParmName, const char *pszParmValue
                parm_ptr =
                        ((char *)ServicePtrs[snum]) + PTR_DIFF(def_ptr,
                                                            &sDefault);
+       }
 
+       if (snum >= 0) {
                if (!ServicePtrs[snum]->copymap)
                        init_copymap(ServicePtrs[snum]);
 
@@ -3827,11 +4108,11 @@ BOOL lp_do_parameter(int snum, const char *pszParmName, const char *pszParmValue
        switch (parm_table[parmnum].type)
        {
                case P_BOOL:
-                       *(BOOL *)parm_ptr = lp_bool(pszParmValue);
+                       *(bool *)parm_ptr = lp_bool(pszParmValue);
                        break;
 
                case P_BOOLREV:
-                       *(BOOL *)parm_ptr = !lp_bool(pszParmValue);
+                       *(bool *)parm_ptr = !lp_bool(pszParmValue);
                        break;
 
                case P_INTEGER:
@@ -3886,7 +4167,7 @@ BOOL lp_do_parameter(int snum, const char *pszParmName, const char *pszParmValue
  Process a parameter.
 ***************************************************************************/
 
-static BOOL do_parameter(const char *pszParmName, const char *pszParmValue)
+static bool do_parameter(const char *pszParmName, const char *pszParmValue)
 {
        if (!bInGlobalSection && bGlobalOnly)
                return (True);
@@ -3917,11 +4198,11 @@ static void print_parameter(struct parm_struct *p, void *ptr, FILE * f)
                        break;
 
                case P_BOOL:
-                       fprintf(f, "%s", BOOLSTR(*(BOOL *)ptr));
+                       fprintf(f, "%s", BOOLSTR(*(bool *)ptr));
                        break;
 
                case P_BOOLREV:
-                       fprintf(f, "%s", BOOLSTR(!*(BOOL *)ptr));
+                       fprintf(f, "%s", BOOLSTR(!*(bool *)ptr));
                        break;
 
                case P_INTEGER:
@@ -3972,12 +4253,12 @@ static void print_parameter(struct parm_struct *p, void *ptr, FILE * f)
  Check if two parameters are equal.
 ***************************************************************************/
 
-static BOOL equal_parameter(parm_type type, void *ptr1, void *ptr2)
+static bool equal_parameter(parm_type type, void *ptr1, void *ptr2)
 {
        switch (type) {
                case P_BOOL:
                case P_BOOLREV:
-                       return (*((BOOL *)ptr1) == *((BOOL *)ptr2));
+                       return (*((bool *)ptr1) == *((bool *)ptr2));
 
                case P_INTEGER:
                case P_ENUM:
@@ -4031,10 +4312,10 @@ void init_locals(void)
  Returns True on success, False on failure. 
 ***************************************************************************/
 
-static BOOL do_section(const char *pszSectionName)
+static bool do_section(const char *pszSectionName)
 {
-       BOOL bRetval;
-       BOOL isglobal = ((strwicmp(pszSectionName, GLOBAL_NAME) == 0) ||
+       bool bRetval;
+       bool isglobal = ((strwicmp(pszSectionName, GLOBAL_NAME) == 0) ||
                         (strwicmp(pszSectionName, GLOBAL_NAME2) == 0));
        bRetval = False;
 
@@ -4081,7 +4362,7 @@ static BOOL do_section(const char *pszSectionName)
  Determine if a partcular base parameter is currentl set to the default value.
 ***************************************************************************/
 
-static BOOL is_default(int i)
+static bool is_default(int i)
 {
        if (!defaults_saved)
                return False;
@@ -4100,7 +4381,7 @@ static BOOL is_default(int i)
                case P_BOOL:
                case P_BOOLREV:
                        return parm_table[i].def.bvalue ==
-                               *(BOOL *)parm_table[i].ptr;
+                               *(bool *)parm_table[i].ptr;
                case P_CHAR:
                        return parm_table[i].def.cvalue ==
                                *(char *)parm_table[i].ptr;
@@ -4150,7 +4431,7 @@ static void dump_globals(FILE *f)
  Return True if a local parameter is currently set to the global default.
 ***************************************************************************/
 
-BOOL lp_is_default(int snum, struct parm_struct *parm)
+bool lp_is_default(int snum, struct parm_struct *parm)
 {
        int pdiff = PTR_DIFF(parm->ptr, &sDefault);
 
@@ -4213,10 +4494,10 @@ static void dump_a_service(service * pService, FILE * f)
  Display the contents of a parameter of a single services record.
 ***************************************************************************/
 
-BOOL dump_a_parameter(int snum, char *parm_name, FILE * f, BOOL isGlobal)
+bool dump_a_parameter(int snum, char *parm_name, FILE * f, bool isGlobal)
 {
        int i;
-       BOOL result = False;
+       bool result = False;
        parm_class p_class;
        unsigned flag = 0;
        fstring local_parm_name;
@@ -4276,6 +4557,22 @@ BOOL dump_a_parameter(int snum, char *parm_name, FILE * f, BOOL isGlobal)
        return result;
 }
 
+/***************************************************************************
+ Return info about the requested parameter (given as a string).
+ Return NULL when the string is not a valid parameter name.
+***************************************************************************/
+
+struct parm_struct *lp_get_parameter(const char *param_name)
+{
+       int num = map_parameter(param_name);
+
+       if (num < 0) {
+               return NULL;
+       }
+
+       return &parm_table[num];
+}
+
 /***************************************************************************
  Return info about the next parameter in a service.
  snum==GLOBAL_SECTION_SNUM gives the globals.
@@ -4298,6 +4595,9 @@ struct parm_struct *lp_next_parameter(int snum, int *i, int allparameters)
                            && (parm_table[*i].ptr ==
                                parm_table[(*i) - 1].ptr))
                                continue;
+                       
+                       if (is_default(*i) && !allparameters)
+                               continue;
 
                        return &parm_table[(*i)++];
                }
@@ -4340,7 +4640,7 @@ struct parm_struct *lp_next_parameter(int snum, int *i, int allparameters)
 /***************************************************************************
  Display the contents of a single copy structure.
 ***************************************************************************/
-static void dump_copy_map(BOOL *pcopymap)
+static void dump_copy_map(bool *pcopymap)
 {
        int i;
        if (!pcopymap)
@@ -4362,7 +4662,7 @@ static void dump_copy_map(BOOL *pcopymap)
  Return TRUE if the passed service number is within range.
 ***************************************************************************/
 
-BOOL lp_snum_ok(int iService)
+bool lp_snum_ok(int iService)
 {
        return (LP_SNUM_OK(iService) && ServicePtrs[iService]->bAvailable);
 }
@@ -4420,7 +4720,7 @@ void lp_add_one_printer(char *name, char *comment)
  Have we loaded a services file yet?
 ***************************************************************************/
 
-BOOL lp_loaded(void)
+bool lp_loaded(void)
 {
        return (bLoaded);
 }
@@ -4429,7 +4729,7 @@ BOOL lp_loaded(void)
  Unload unused services.
 ***************************************************************************/
 
-void lp_killunused(BOOL (*snumused) (int))
+void lp_killunused(bool (*snumused) (int))
 {
        int i;
        for (i = 0; i < iNumServices; i++) {
@@ -4495,7 +4795,7 @@ static void lp_save_defaults(void)
                        case P_BOOL:
                        case P_BOOLREV:
                                parm_table[i].def.bvalue =
-                                       *(BOOL *)parm_table[i].ptr;
+                                       *(bool *)parm_table[i].ptr;
                                break;
                        case P_CHAR:
                                parm_table[i].def.cvalue =
@@ -4573,7 +4873,7 @@ static void set_server_role(void)
                case SEC_USER:
                        if (lp_domain_logons()) {
 
-                               if (Globals.bDomainMaster) /* auto or yes */ 
+                               if (Globals.iDomainMaster) /* auto or yes */ 
                                        server_role = ROLE_DOMAIN_PDC;
                                else
                                        server_role = ROLE_DOMAIN_BDC;
@@ -4620,7 +4920,7 @@ static void set_allowed_client_auth(void)
  get their sorry ass fired.
 ***************************************************************************/
 
-static BOOL check_usershare_stat(const char *fname, SMB_STRUCT_STAT *psbuf)
+static bool check_usershare_stat(const char *fname, SMB_STRUCT_STAT *psbuf)
 {
        if (!S_ISREG(psbuf->st_mode)) {
                DEBUG(0,("check_usershare_stat: file %s owned by uid %u is "
@@ -4662,7 +4962,7 @@ enum usershare_err parse_usershare_file(TALLOC_CTX *ctx,
                        pstring sharepath,
                        pstring comment,
                        SEC_DESC **ppsd,
-                       BOOL *pallow_guest)
+                       bool *pallow_guest)
 {
        const char **prefixallowlist = lp_usershare_prefix_allow_list();
        const char **prefixdenylist = lp_usershare_prefix_deny_list();
@@ -4831,7 +5131,7 @@ static int process_usershare_file(const char *dir_name, const char *file_name, i
        int iService = -1;
        TALLOC_CTX *ctx = NULL;
        SEC_DESC *psd = NULL;
-       BOOL guest_ok = False;
+       bool guest_ok = False;
 
        /* Ensure share name doesn't contain invalid characters. */
        if (!validate_net_name(file_name, INVALID_SHARENAME_CHARS, strlen(file_name))) {
@@ -4988,7 +5288,7 @@ static int process_usershare_file(const char *dir_name, const char *file_name, i
  Checks if a usershare entry has been modified since last load.
 ***************************************************************************/
 
-static BOOL usershare_exists(int iService, time_t *last_mod)
+static bool usershare_exists(int iService, time_t *last_mod)
 {
        SMB_STRUCT_STAT lsbuf;
        const char *usersharepath = Globals.szUsersharePath;
@@ -5227,7 +5527,7 @@ int load_usershare_shares(void)
                        /* Remove from the share ACL db. */
                        DEBUG(10,("load_usershare_shares: Removing deleted usershare %s\n",
                                lp_servicename(iService) ));
-                       delete_share_security(snum2params_static(iService));
+                       delete_share_security(lp_servicename(iService));
                        free_service_byindex(iService);
                }
        }
@@ -5245,8 +5545,6 @@ void gfree_loadparm(void)
        struct file_lists *next;
        int i;
 
-       lp_TALLOC_FREE();
-
        /* Free the file lists */
 
        f = file_lists;
@@ -5290,14 +5588,14 @@ void gfree_loadparm(void)
  False on failure.
 ***************************************************************************/
 
-BOOL lp_load(const char *pszFname,
-             BOOL global_only,
-             BOOL save_defaults,
-            BOOL add_ipc,
-             BOOL initialize_globals)
+bool lp_load(const char *pszFname,
+             bool global_only,
+             bool save_defaults,
+            bool add_ipc,
+             bool initialize_globals)
 {
        pstring n2;
-       BOOL bRetval;
+       bool bRetval;
        param_opt_struct *data, *pdata;
 
        pstrcpy(n2, pszFname);
@@ -5394,7 +5692,7 @@ int lp_numservices(void)
 Display the contents of the services array in human-readable form.
 ***************************************************************************/
 
-void lp_dump(FILE *f, BOOL show_defaults, int maxtoprint)
+void lp_dump(FILE *f, bool show_defaults, int maxtoprint)
 {
        int iService;
 
@@ -5415,7 +5713,7 @@ void lp_dump(FILE *f, BOOL show_defaults, int maxtoprint)
 Display the contents of one service in human-readable form.
 ***************************************************************************/
 
-void lp_dump_one(FILE * f, BOOL show_defaults, int snum)
+void lp_dump_one(FILE * f, bool show_defaults, int snum)
 {
        if (VALID(snum)) {
                if (ServicePtrs[snum]->szService[0] == '\0')
@@ -5461,7 +5759,7 @@ int lp_servicenumber(const char *pszServiceName)
 
                if (!usershare_exists(iService, &last_mod)) {
                        /* Remove the share security tdb entry for it. */
-                       delete_share_security(snum2params_static(iService));
+                       delete_share_security(lp_servicename(iService));
                        /* Remove it from the array. */
                        free_service_byindex(iService);
                        /* Doesn't exist anymore. */
@@ -5485,7 +5783,7 @@ int lp_servicenumber(const char *pszServiceName)
        return (iService);
 }
 
-BOOL share_defined(const char *service_name)
+bool share_defined(const char *service_name)
 {
        return (lp_servicenumber(service_name) != -1);
 }
@@ -5590,7 +5888,7 @@ const char *volume_label(int snum)
        }
                
        /* This returns a 33 byte guarenteed null terminated string. */
-       ret = talloc_strndup(main_loop_talloc_get(), label, 32);
+       ret = talloc_strndup(talloc_tos(), label, 32);
        if (!ret) {
                return "";
        }               
@@ -5665,24 +5963,24 @@ int lp_server_role(void)
  If we are PDC then prefer us as DMB
 ************************************************************/
 
-BOOL lp_domain_master(void)
+bool lp_domain_master(void)
 {
-       if (Globals.bDomainMaster == Auto)
+       if (Globals.iDomainMaster == Auto)
                return (lp_server_role() == ROLE_DOMAIN_PDC);
 
-       return Globals.bDomainMaster;
+       return (bool)Globals.iDomainMaster;
 }
 
 /***********************************************************
  If we are DMB then prefer us as LMB
 ************************************************************/
 
-BOOL lp_preferred_master(void)
+bool lp_preferred_master(void)
 {
-       if (Globals.bPreferredMaster == Auto)
+       if (Globals.iPreferredMaster == Auto)
                return (lp_local_master() && lp_domain_master());
 
-       return Globals.bPreferredMaster;
+       return (bool)Globals.iPreferredMaster;
 }
 
 /*******************************************************************
@@ -5725,7 +6023,7 @@ int lp_default_server_announce(void)
 
 int lp_major_announce_version(void)
 {
-       static BOOL got_major = False;
+       static bool got_major = False;
        static int major_version = DEFAULT_MAJOR_VERSION;
        char *vers;
        char *p;
@@ -5747,7 +6045,7 @@ int lp_major_announce_version(void)
 
 int lp_minor_announce_version(void)
 {
-       static BOOL got_minor = False;
+       static bool got_minor = False;
        static int minor_version = DEFAULT_MINOR_VERSION;
        char *vers;
        char *p;
@@ -5835,7 +6133,7 @@ const char *lp_printcapname(void)
 
 static uint32 spoolss_state;
 
-BOOL lp_disable_spoolss( void )
+bool lp_disable_spoolss( void )
 {
        if ( spoolss_state == SVCCTL_STATE_UNKNOWN )
                spoolss_state = _lp_disable_spoolss() ? SVCCTL_STOPPED : SVCCTL_RUNNING;
@@ -5859,7 +6157,7 @@ uint32 lp_get_spoolss_state( void )
  Ensure we don't use sendfile if server smb signing is active.
 ********************************************************************/
 
-BOOL lp_use_sendfile(int snum)
+bool lp_use_sendfile(int snum)
 {
        /* Using sendfile blows the brains out of any DOS or Win9x TCP stack... JRA. */
        if (Protocol < PROTOCOL_NT1) {
@@ -5872,7 +6170,7 @@ BOOL lp_use_sendfile(int snum)
  Turn off sendfile if we find the underlying OS doesn't support it.
 ********************************************************************/
 
-void set_use_sendfile(int snum, BOOL val)
+void set_use_sendfile(int snum, bool val)
 {
        if (LP_SNUM_OK(snum))
                ServicePtrs[snum]->bUseSendfile = val;
@@ -5884,7 +6182,7 @@ void set_use_sendfile(int snum, BOOL val)
  Turn off storing DOS attributes if this share doesn't support it.
 ********************************************************************/
 
-void set_store_dos_attributes(int snum, BOOL val)
+void set_store_dos_attributes(int snum, bool val)
 {
        if (!LP_SNUM_OK(snum))
                return;
@@ -5900,9 +6198,9 @@ void lp_set_mangling_method(const char *new_method)
  Global state for POSIX pathname processing.
 ********************************************************************/
 
-static BOOL posix_pathnames;
+static bool posix_pathnames;
 
-BOOL lp_posix_pathnames(void)
+bool lp_posix_pathnames(void)
 {
        return posix_pathnames;
 }
@@ -5921,7 +6219,7 @@ void lp_set_posix_pathnames(void)
  Global state for POSIX lock processing - CIFS unix extensions.
 ********************************************************************/
 
-BOOL posix_default_lock_was_set;
+bool posix_default_lock_was_set;
 static enum brl_flavour posix_cifsx_locktype; /* By default 0 == WINDOWS_LOCK */
 
 enum brl_flavour lp_posix_cifsu_locktype(files_struct *fsp)