[GLUE] Rsync SAMBA_3_2_0 SVN r25598 in order to create the v3-2-test branch.
[samba.git] / source / param / loadparm.c
index 3fa9e859e1b9bbf28cd7e08781a9b44873b749f7..8b15073ed0083f0087a55797537b54934ebd716a 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/>.
 */
 
 /*
@@ -72,6 +71,17 @@ extern userdom_struct current_user_info;
 #define HOMES_NAME "homes"
 #endif
 
+/* the special value for the include parameter
+ * to be interpreted not as a file name but to
+ * trigger loading of the global smb.conf options
+ * from registry. */
+#ifndef INCLUDE_REGISTRY_NAME
+#define INCLUDE_REGISTRY_NAME "registry"
+#endif
+
+static int regdb_last_seqnum = 0;
+static BOOL include_registry_globals = False;
+
 /* some helpful bits */
 #define LP_SNUM_OK(i) (((i) >= 0) && ((i) < iNumServices) && (ServicePtrs != NULL) && ServicePtrs[(i)]->valid)
 #define VALID(i) (ServicePtrs != NULL && ServicePtrs[i]->valid)
@@ -242,6 +252,7 @@ typedef struct {
        char *szCupsServer;
        char *szIPrintServer;
        char *ctdbdSocket;
+       char **szClusterAddresses;
        BOOL clustering;
        int ldap_passwd_sync; 
        int ldap_replication_sleep;
@@ -267,7 +278,6 @@ typedef struct {
        BOOL bLargeReadwrite;
        BOOL bReadRaw;
        BOOL bWriteRaw;
-       BOOL bReadbmpx;
        BOOL bSyslogOnly;
        BOOL bBrowseList;
        BOOL bNISHomeMap;
@@ -296,6 +306,7 @@ typedef struct {
        BOOL bDebugHiresTimestamp;
        BOOL bDebugPid;
        BOOL bDebugUid;
+       BOOL bDebugClass;
        BOOL bEnableCoreFiles;
        BOOL bHostMSDfs;
        BOOL bUseMmap;
@@ -313,6 +324,7 @@ typedef struct {
        int name_cache_timeout;
        int client_signing;
        int server_signing;
+       int client_ldap_sasl_wrapping;
        int iUsershareMaxShares;
        int iIdmapCacheTime;
        int iIdmapNegativeCacheTime;
@@ -359,7 +371,6 @@ typedef struct {
        char **szHostsdeny;
        char *szMagicScript;
        char *szMagicOutput;
-       char *szMangledMap;
        char *szVetoFiles;
        char *szHideFiles;
        char *szVetoOplockFiles;
@@ -373,6 +384,7 @@ typedef struct {
        char *fstype;
        char **szVfsObjects;
        char *szMSDfsProxy;
+       char *szAioWriteBehind;
        char *szDfree;
        int iMinPrintSpace;
        int iMaxPrintJobs;
@@ -460,6 +472,7 @@ typedef struct {
        int iAioReadSize;
        int iAioWriteSize;
        int iMap_readonly;
+       int iDirectoryNameCacheSize;
        param_opt_struct *param_opt;
 
        char dummy[3];          /* for alignment */
@@ -499,7 +512,6 @@ static service sDefault = {
        NULL,                   /* szHostsdeny */
        NULL,                   /* szMagicScript */
        NULL,                   /* szMagicOutput */
-       NULL,                   /* szMangledMap */
        NULL,                   /* szVetoFiles */
        NULL,                   /* szHideFiles */
        NULL,                   /* szVetoOplockFiles */
@@ -513,6 +525,7 @@ static service sDefault = {
        NULL,                   /* fstype */
        NULL,                   /* vfs objects */
        NULL,                   /* szMSDfsProxy */
+       NULL,                   /* szAioWriteBehind */
        NULL,                   /* szDfree */
        0,                      /* iMinPrintSpace */
        1000,                   /* iMaxPrintJobs */
@@ -600,7 +613,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 */
@@ -677,6 +694,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"},
@@ -960,6 +984,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}, 
@@ -967,12 +992,12 @@ 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}, 
        {"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}, 
@@ -1003,7 +1028,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},
 
@@ -1012,8 +1037,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}, 
@@ -1023,7 +1049,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}, 
@@ -1036,6 +1061,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}, 
@@ -1099,7 +1125,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}, 
@@ -1517,7 +1542,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;
@@ -1528,6 +1552,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. */
@@ -1555,10 +1580,10 @@ 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 */
 
@@ -1635,6 +1660,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 */
@@ -1643,7 +1669,8 @@ 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;
 
@@ -1684,33 +1711,6 @@ static void init_globals(BOOL first_time_only)
        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\n");
-       }
-
-       return lp_talloc;
-}
-
 /*******************************************************************
  Convenience routine to grab string parameters into temporary memory
  and run standard_sub_basic on them. The buffers can be written to by
@@ -1730,9 +1730,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, '\"', '\"')) {
@@ -1742,7 +1739,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);
@@ -1952,7 +1949,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)
@@ -1968,6 +1964,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)
@@ -2050,6 +2047,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)
@@ -2074,11 +2072,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)
@@ -2160,6 +2158,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)
@@ -2167,11 +2166,14 @@ 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_client_ldap_sasl_wrapping, &Globals.client_ldap_sasl_wrapping)
 
 /* local prototypes */
 
 static int map_parameter(const char *pszParmName);
+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,
@@ -2182,6 +2184,8 @@ static void init_copymap(service * pservice);
 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 */
@@ -2322,7 +2326,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);
@@ -2593,7 +2597,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)
@@ -2764,6 +2768,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.
@@ -2790,14 +2913,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 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 classIndex, parmIndex, enumIndex, flagIndex;
+       int enumIndex, flagIndex;
+       int parmIndex2;
        BOOL hadFlag;
-       const char *section_names[] = { "local", "global", NULL};
+       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"};
@@ -2808,35 +2992,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);
                        }
                }
        }
@@ -2851,25 +3068,90 @@ void show_parameter_list(void)
 static BOOL set_boolean(BOOL *pb, const char *pszParmValue)
 {
        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.
 ***************************************************************************/
@@ -3036,6 +3318,244 @@ BOOL service_ok(int iService)
        return (bRetval);
 }
 
+/*
+ * lp_regdb_open - regdb helper function 
+ *
+ * this should be considered an interim solution that becomes
+ * superfluous once the registry code has been rewritten
+ * do allow use of the tdb portion of the registry alone.
+ *
+ * in the meanwhile this provides a lean access
+ * to the registry globals.
+ */
+
+static struct tdb_wrap *lp_regdb_open(void)
+{
+       struct tdb_wrap *reg_tdb = NULL;
+       const char *vstring = "INFO/version";
+       uint32 vers_id;
+
+       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(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"));
+       }
+
+       vers_id = tdb_fetch_int32(reg_tdb->tdb, vstring);
+       if (vers_id != REGVER_V1) {
+               DEBUG(10, ("lp_regdb_open: INFO: registry tdb %s has wrong "
+                         "INFO/version (got %d, expected %d)\n",
+                         lock_path("registry.tdb"), vers_id, REGVER_V1));
+               /* this is apparently not implemented in the tdb */
+       }
+
+done:
+       return reg_tdb;
+}
+
+/*
+ * process_registry_globals
+ *
+ * this is the interim version of process_registry globals
+ *
+ * until we can do it as we would like using the api and only
+ * using the tdb portion of the registry (see below),
+ * this just provides the needed functionality of regdb_fetch_values
+ * 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 *))
+{
+       BOOL ret = False;
+       struct tdb_wrap *reg_tdb = NULL;
+       WERROR err;
+       char *keystr;
+       TDB_DATA data;
+       /* vars for the tdb unpack loop */
+       int len = 0;
+       int i;
+       int buflen;
+       uint8 *buf;
+       uint32 type;
+       uint32 size;
+       uint32 num_values = 0;
+       uint8 *data_p;
+       pstring valname;
+       char * valstr;
+       struct registry_value *value = NULL;
+
+       include_registry_globals = True;
+
+       ZERO_STRUCT(data);
+
+       reg_tdb = lp_regdb_open();
+       if (!reg_tdb) {
+               DEBUG(1, ("Error opening the registry!\n"));
+               goto done;
+       }
+
+       /* reg_tdb is from now on used as talloc ctx.
+        * freeing it closes the tdb (if refcount is 0) */
+
+       keystr = talloc_asprintf(reg_tdb,"%s/%s/%s", REG_VALUE_PREFIX, 
+                                KEY_SMBCONF, GLOBAL_NAME);
+       normalize_dbkey(keystr);
+
+       DEBUG(10, ("process_registry_globals: fetching key '%s'\n",
+                  keystr));
+
+       data = tdb_fetch_bystring(reg_tdb->tdb, keystr);
+       if (!data.dptr) {
+               ret = True;
+               goto done;
+       }
+
+       buf = data.dptr;
+       buflen = data.dsize;
+
+       /* unpack number of values */
+       len = tdb_unpack(buf, buflen, "d", &num_values);
+       DEBUG(10, ("process_registry_globals: got %d values from tdb\n",
+                  num_values));
+
+       /* unpack the values */
+       for (i=0; i < num_values; i++) {
+               type = REG_NONE;
+               size = 0;
+               data_p = NULL;
+               len += tdb_unpack(buf+len, buflen-len, "fdB",
+                                 valname,
+                                 &type,
+                                 &size,
+                                 &data_p);
+               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, 
+                                                 &value,
+                                                 type,
+                                                 data_p,
+                                                 size,
+                                                 size);
+                       SAFE_FREE(data_p);
+                       if (!W_ERROR_IS_OK(err)) {
+                               goto done;
+                       }
+                       switch(type) {
+                       case REG_DWORD:
+                               valstr = talloc_asprintf(reg_tdb, "%d", 
+                                                        value->v.dword);
+                               pfunc(valname, valstr);
+                               break;
+                       case REG_SZ:
+                               pfunc(valname, value->v.sz.str);
+                               break;
+                       default:
+                               /* ignore other types */
+                               break;
+                       }
+               }
+       }
+
+       ret = pfunc("registry shares", "yes");
+       regdb_last_seqnum = tdb_get_seqnum(reg_tdb->tdb);
+
+done:
+       TALLOC_FREE(reg_tdb);
+       SAFE_FREE(data.dptr);
+       return ret;
+}
+
+#if 0
+/*
+ * this is process_registry_globals as it _should_ be (roughly)
+ * using the reg_api functions...
+ * 
+ */
+static BOOL process_registry_globals(BOOL (*pfunc)(const char *, const char *))
+{
+       BOOL ret = False;
+       TALLOC_CTX *ctx = NULL;
+       char *regpath = NULL;
+       WERROR werr = WERR_OK;
+       struct registry_key *key = NULL;
+       struct registry_value *value = NULL;
+       char *valname = NULL;
+       char *valstr = NULL;
+       uint32 idx = 0;
+       NT_USER_TOKEN *token;
+
+       ctx = talloc_init("process_registry_globals");
+       if (!ctx) {
+               smb_panic("Failed to create talloc context!");
+       }
+
+       include_registry_globals = True;
+
+       if (!registry_init_regdb()) {
+               DEBUG(1, ("Error initializing the registry.\n"));
+               goto done;
+       }
+
+       if (!(token = registry_create_admin_token(ctx))) {
+               DEBUG(1, ("Error creating admin token\n"));
+               goto done;
+       }
+
+       regpath = talloc_asprintf(ctx,"%s\\%s", KEY_SMBCONF, GLOBAL_NAME);
+       werr = reg_open_path(ctx, regpath, REG_KEY_READ, token, &key);
+       if (!W_ERROR_IS_OK(werr)) {
+               DEBUG(1, ("Registry smbconf global section does not exist.\n"));
+               DEBUGADD(1, ("Error opening registry path '%s\\%s: %s\n",
+                            KEY_SMBCONF, GLOBAL_NAME, dos_errstr(werr)));
+               goto done;
+       }
+
+       for (idx = 0;
+            W_ERROR_IS_OK(werr = reg_enumvalue(ctx, key, idx, &valname,
+                                               &value));
+            idx++)
+       {
+               DEBUG(5, ("got global registry parameter '%s'\n", valname));
+               switch(value->type) {
+               case REG_DWORD:
+                       valstr = talloc_asprintf(ctx, "%d", value->v.dword);
+                       pfunc(valname, valstr);
+                       TALLOC_FREE(valstr);
+                       break;
+               case REG_SZ:
+                       pfunc(valname, value->v.sz.str);
+                       break;
+               default:
+                       /* ignore other types */
+                       break;
+               }
+               TALLOC_FREE(value);
+               TALLOC_FREE(valstr);
+       }
+
+       ret = pfunc("registry shares", "yes");
+
+       regdb_last_seqnum = regdb_get_seqnum();
+
+done:
+       talloc_destroy(ctx);
+       return ret;
+}
+#endif /* if 0 */
+
 static struct file_lists {
        struct file_lists *next;
        char *name;
@@ -3089,9 +3609,21 @@ static void add_to_file_list(const char *fname, const char *subfname)
 BOOL lp_file_list_changed(void)
 {
        struct file_lists *f = file_lists;
+       struct tdb_wrap *reg_tdb = NULL;
 
        DEBUG(6, ("lp_file_list_changed()\n"));
 
+       if (include_registry_globals) {
+               reg_tdb = lp_regdb_open();
+               if (reg_tdb && (regdb_last_seqnum != tdb_get_seqnum(reg_tdb->tdb)))
+               {
+                       DEBUGADD(6, ("regdb seqnum changed: old = %d, new = %d\n",
+                                   regdb_last_seqnum, tdb_get_seqnum(reg_tdb->tdb)));
+                       TALLOC_FREE(reg_tdb);
+                       return True;
+               }
+       }
+
        while (f) {
                pstring n2;
                time_t mod_time;
@@ -3192,6 +3724,17 @@ static BOOL handle_include(int snum, const char *pszParmValue, char **ptr)
        pstring fname;
        pstrcpy(fname, pszParmValue);
 
+       if (strequal(fname, INCLUDE_REGISTRY_NAME)) {
+               if (bInGlobalSection) {
+                       return process_registry_globals(do_parameter);
+               }
+               else {
+                       DEBUG(1, ("\"include = registry\" only effective "
+                                 "in %s section\n", GLOBAL_NAME));
+                       return False;
+               }
+       }
+
        standard_sub_basic(get_current_username(), current_user_info.domain,
                           fname,sizeof(fname));
 
@@ -3348,10 +3891,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 "";
@@ -3540,7 +4081,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]);
 
@@ -4010,6 +4553,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.
@@ -4032,6 +4591,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)++];
                }
@@ -4961,7 +5523,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);
                }
        }
@@ -4979,8 +5541,6 @@ void gfree_loadparm(void)
        struct file_lists *next;
        int i;
 
-       lp_TALLOC_FREE();
-
        /* Free the file lists */
 
        f = file_lists;
@@ -5195,7 +5755,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. */
@@ -5324,7 +5884,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 "";
        }