r15003: patch based on code from Arkady Glabek <aglabek@centeris.com> to ensure that...
[tprouty/samba.git] / source / param / loadparm.c
index 7b831d1e98db7c148a759d6748a5157bd1092cbe..e0c6c0686f1389342e4540342976be61a931dfa6 100644 (file)
@@ -201,6 +201,7 @@ typedef struct {
        int max_xmit;
        int max_mux;
        int max_open_files;
+       int open_files_db_hash_size;
        int pwordlevel;
        int unamelevel;
        int deadtime;
@@ -410,6 +411,7 @@ typedef struct {
        BOOL bMap_hidden;
        BOOL bMap_archive;
        BOOL bStoreDosAttributes;
+       BOOL bDmapiSupport;
        BOOL bLocking;
        int iStrictLocking;
        BOOL bPosixLocking;
@@ -547,6 +549,7 @@ static service sDefault = {
        False,                  /* bMap_hidden */
        True,                   /* bMap_archive */
        False,                  /* bStoreDosAttributes */
+       False,                  /* bDmapiSupport */
        True,                   /* bLocking */
        True,                   /* iStrictLocking */
        True,                   /* bPosixLocking */
@@ -913,7 +916,7 @@ static struct parm_struct parm_table[] = {
        {"writable", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, FLAG_HIDE}, 
 
        {"acl check permissions", P_BOOL, P_LOCAL, &sDefault.bAclCheckPermissions, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE},
-       {"acl group control", P_BOOL, P_LOCAL, &sDefault.bAclGroupControl, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE},
+       {"acl group control", P_BOOL, P_LOCAL, &sDefault.bAclGroupControl, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE | FLAG_DEPRECATED },
        {"acl map full control", P_BOOL, P_LOCAL, &sDefault.bAclMapFullControl, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE},
        {"create mask", P_OCTAL, P_LOCAL, &sDefault.iCreate_mask, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, 
        {"create mode", P_OCTAL, P_LOCAL, &sDefault.iCreate_mask, NULL, NULL, FLAG_HIDE}, 
@@ -1021,6 +1024,7 @@ 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}, 
@@ -1097,6 +1101,8 @@ static struct parm_struct parm_table[] = {
        {"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}, 
+       {"dmapi support", P_BOOL, P_LOCAL, &sDefault.bDmapiSupport, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL},
+
 
        {N_("Domain Options"), P_SEP, P_SEPARATOR}, 
 
@@ -1494,6 +1500,7 @@ static void init_globals(BOOL first_time_only)
        Globals.bLargeReadwrite = True;
        Globals.max_log_size = 5000;
        Globals.max_open_files = MAX_OPEN_FILES;
+       Globals.open_files_db_hash_size = SMB_OPEN_DATABASE_TDB_HASH_SIZE;
        Globals.maxprotocol = PROTOCOL_NT1;
        Globals.minprotocol = PROTOCOL_CORE;
        Globals.security = SEC_USER;
@@ -1934,6 +1941,7 @@ FN_GLOBAL_INTEGER(lp_max_wins_ttl, &Globals.max_wins_ttl)
 FN_GLOBAL_INTEGER(lp_min_wins_ttl, &Globals.min_wins_ttl)
 FN_GLOBAL_INTEGER(lp_max_log_size, &Globals.max_log_size)
 FN_GLOBAL_INTEGER(lp_max_open_files, &Globals.max_open_files)
+FN_GLOBAL_INTEGER(lp_open_files_db_hash_size, &Globals.open_files_db_hash_size)
 FN_GLOBAL_INTEGER(lp_maxxmit, &Globals.max_xmit)
 FN_GLOBAL_INTEGER(lp_maxmux, &Globals.max_mux)
 FN_GLOBAL_INTEGER(lp_passwordlevel, &Globals.pwordlevel)
@@ -2024,6 +2032,7 @@ FN_LOCAL_BOOL(lp_print_ok, bPrint_ok)
 FN_LOCAL_BOOL(lp_map_hidden, bMap_hidden)
 FN_LOCAL_BOOL(lp_map_archive, bMap_archive)
 FN_LOCAL_BOOL(lp_store_dos_attributes, bStoreDosAttributes)
+FN_LOCAL_BOOL(lp_dmapi_support, bDmapiSupport)
 FN_LOCAL_BOOL(lp_locking, bLocking)
 FN_LOCAL_INTEGER(lp_strict_locking, iStrictLocking)
 FN_LOCAL_BOOL(lp_posix_locking, bPosixLocking)
@@ -3212,7 +3221,7 @@ static BOOL handle_idmap_uid(int snum, const char *pszParmValue, char **ptr)
 {
        uint32 low, high;
 
-       if (sscanf(pszParmValue, "%u-%u", &low, &high) != 2 || high < low)
+       if (sscanf(pszParmValue, "%u - %u", &low, &high) != 2 || high < low)
                return False;
 
        /* Parse OK */
@@ -3229,7 +3238,7 @@ static BOOL handle_idmap_gid(int snum, const char *pszParmValue, char **ptr)
 {
        uint32 low, high;
 
-       if (sscanf(pszParmValue, "%u-%u", &low, &high) != 2 || high < low)
+       if (sscanf(pszParmValue, "%u - %u", &low, &high) != 2 || high < low)
                return False;
 
        /* Parse OK */
@@ -3868,16 +3877,39 @@ static void dump_a_service(service * pService, FILE * f)
 BOOL dump_a_parameter(int snum, char *parm_name, FILE * f, BOOL isGlobal)
 {
        service * pService = ServicePtrs[snum];
-       int i, result = False;
+       int i;
+       BOOL result = False;
        parm_class p_class;
        unsigned flag = 0;
+       fstring local_parm_name;
+       char *parm_opt;
+       const char *parm_opt_value;
+
+       /* check for parametrical option */
+       fstrcpy( local_parm_name, parm_name);
+       parm_opt = strchr( local_parm_name, ':');
+
+       if (parm_opt) {
+               *parm_opt = '\0';
+               parm_opt++;
+               if (strlen(parm_opt)) {
+                       parm_opt_value = lp_parm_const_string( snum,
+                               local_parm_name, parm_opt, NULL);
+                       if (parm_opt_value) {
+                               printf( "%s\n", parm_opt_value);
+                               result = True;
+                       }
+               }
+               return result;
+       }
 
+       /* check for a key and print the value */
        if (isGlobal) {
                p_class = P_GLOBAL;
                flag = FLAG_GLOBAL;
        } else
                p_class = P_LOCAL;
-       
+
        for (i = 0; parm_table[i].label; i++) {
                if (strwicmp(parm_table[i].label, parm_name) == 0 &&
                    (parm_table[i].p_class == p_class || parm_table[i].flags & flag) &&
@@ -4833,6 +4865,56 @@ int load_usershare_shares(void)
        return lp_numservices();
 }
 
+/********************************************************
+ Destroy global resources allocated in this file
+********************************************************/
+
+void gfree_loadparm(void)
+{
+       struct file_lists *f;
+       struct file_lists *next;
+       int i;
+
+       lp_TALLOC_FREE();
+
+       /* Free the file lists */
+
+       f = file_lists;
+       while( f ) {
+               next = f->next;
+               SAFE_FREE( f->name );
+               SAFE_FREE( f->subfname );
+               SAFE_FREE( f );
+               f = next;
+       }
+
+       /* Free resources allocated to services */
+
+       for ( i = 0; i < iNumServices; i++ ) {
+               if ( VALID(i) ) {
+                       free_service_byindex(i);
+               }
+       }
+
+       SAFE_FREE( ServicePtrs );
+       iNumServices = 0;
+
+       /* Now release all resources allocated to global
+          parameters and the default service */
+
+       for (i = 0; parm_table[i].label; i++) 
+       {
+               if ( parm_table[i].type == P_STRING 
+                       || parm_table[i].type == P_USTRING ) 
+               {
+                       string_free( (char**)parm_table[i].ptr );
+               }
+               else if (parm_table[i].type == P_LIST) {
+                       str_list_free( (char***)parm_table[i].ptr );
+               }
+       }
+}
+
 /***************************************************************************
  Load the services array from the services file. Return True on success, 
  False on failure.