r23055: Rewrite messages.c to use auto-generated marshalling in the tdb. I'm
[vlendec/samba-autobuild/.git] / source3 / smbd / statcache.c
index 03adf32e093facfb154afc401b5b0909f964f1ee..b63dd165a7627934bfd3a6031ca78af86395ad4e 100644 (file)
@@ -47,10 +47,15 @@ void stat_cache_add( const char *full_orig_name, const char *orig_translated_pat
        TDB_DATA data_val;
        char *original_path;
        size_t original_path_length;
+       size_t sc_size = lp_max_stat_cache_size();
 
        if (!lp_stat_cache())
                return;
 
+       if (sc_size && (tdb_map_size(tdb_stat_cache) > sc_size*1024)) {
+               reset_stat_cache();
+       }
+
        ZERO_STRUCT(data_val);
 
        /*
@@ -59,7 +64,7 @@ void stat_cache_add( const char *full_orig_name, const char *orig_translated_pat
 
        if((*full_orig_name == '\0') || (full_orig_name[0] == '.' && 
                                ((full_orig_name[1] == '\0') ||
-                                (full_orig_name[1] == '.' && full_orig_name[1] == '\0'))))
+                                (full_orig_name[1] == '.' && full_orig_name[2] == '\0'))))
                return;
 
        /*
@@ -76,7 +81,7 @@ void stat_cache_add( const char *full_orig_name, const char *orig_translated_pat
         * translated path.
         */
 
-       translated_path = strdup(orig_translated_path);
+       translated_path = SMB_STRDUP(orig_translated_path);
        if (!translated_path)
                return;
 
@@ -88,7 +93,7 @@ void stat_cache_add( const char *full_orig_name, const char *orig_translated_pat
        }
 
        if(case_sensitive) {
-               original_path = strdup(full_orig_name);
+               original_path = SMB_STRDUP(full_orig_name);
        } else {
                original_path = strdup_upper(full_orig_name);
        }
@@ -126,13 +131,13 @@ void stat_cache_add( const char *full_orig_name, const char *orig_translated_pat
         */
   
        data_val.dsize = translated_path_length + 1;
-       data_val.dptr = translated_path;
+       data_val.dptr = (uint8 *)translated_path;
 
        if (tdb_store_bystring(tdb_stat_cache, original_path, data_val, TDB_REPLACE) != 0) {
                DEBUG(0,("stat_cache_add: Error storing entry %s -> %s\n", original_path, translated_path));
        } else {
-               DEBUG(5,("stat_cache_add: Added entry (%x:size%x) %s -> %s\n",
-                       (unsigned int)data_val.dptr, data_val.dsize, original_path, translated_path));
+               DEBUG(5,("stat_cache_add: Added entry (%lx:size%x) %s -> %s\n",
+                       (unsigned long)data_val.dptr, (unsigned int)data_val.dsize, original_path, translated_path));
        }
 
        SAFE_FREE(original_path);
@@ -179,7 +184,7 @@ BOOL stat_cache_lookup(connection_struct *conn, pstring name, pstring dirpath,
                return False;
 
        if (conn->case_sensitive) {
-               chk_name = strdup(name);
+               chk_name = SMB_STRDUP(name);
                if (!chk_name) {
                        DEBUG(0, ("stat_cache_lookup: strdup failed!\n"));
                        return False;
@@ -237,7 +242,7 @@ BOOL stat_cache_lookup(connection_struct *conn, pstring name, pstring dirpath,
                        }
                } else {
                        BOOL retval;
-                       char *translated_path = data_val.dptr;
+                       char *translated_path = (char *)data_val.dptr;
                        size_t translated_path_length = data_val.dsize - 1;
 
                        DEBUG(10,("stat_cache_lookup: lookup succeeded for name [%s] -> [%s]\n", chk_name, translated_path ));
@@ -280,18 +285,51 @@ BOOL stat_cache_lookup(connection_struct *conn, pstring name, pstring dirpath,
        }
 }
 
+/***************************************************************************
+ Tell all smbd's to delete an entry.
+**************************************************************************/
+
+void send_stat_cache_delete_message(const char *name)
+{
+#ifdef DEVELOPER
+       message_send_all(smbd_messaging_context(),
+                       MSG_SMB_STAT_CACHE_DELETE,
+                       name,
+                       strlen(name)+1,
+                       NULL);
+#endif
+}
+
+/***************************************************************************
+ Delete an entry.
+**************************************************************************/
+
+void stat_cache_delete(const char *name)
+{
+       char *lname = strdup_upper(name);
+
+       if (!lname) {
+               return;
+       }
+       DEBUG(10,("stat_cache_delete: deleting name [%s] -> %s\n",
+                       lname, name ));
+
+       tdb_delete_bystring(tdb_stat_cache, lname);
+       SAFE_FREE(lname);
+}
+
 /***************************************************************
  Compute a hash value based on a string key value.
  The function returns the bucket index number for the hashed key.
  JRA. Use a djb-algorithm hash for speed.
 ***************************************************************/
                                                                                                      
-u32 fast_string_hash(TDB_DATA *key)
+unsigned int fast_string_hash(TDB_DATA *key)
 {
-        u32 n = 0;
+        unsigned int n = 0;
         const char *p;
-        for (p = key->dptr; *p != '\0'; p++) {
-                n = ((n << 5) + n) ^ (u32)(*p);
+        for (p = (const char *)key->dptr; *p != '\0'; p++) {
+                n = ((n << 5) + n) ^ (unsigned int)(*p);
         }
         return n;
 }
@@ -310,7 +348,7 @@ BOOL reset_stat_cache( void )
        }
 
        /* Create the in-memory tdb using our custom hash function. */
-       tdb_stat_cache = tdb_open_ex("statcache", 0, TDB_INTERNAL,
+       tdb_stat_cache = tdb_open_ex("statcache", 1031, TDB_INTERNAL,
                                     (O_RDWR|O_CREAT), 0644, NULL, fast_string_hash);
 
        if (!tdb_stat_cache)