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);
/*
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;
/*
* translated path.
*/
- translated_path = strdup(orig_translated_path);
+ translated_path = SMB_STRDUP(orig_translated_path);
if (!translated_path)
return;
}
if(case_sensitive) {
- original_path = strdup(full_orig_name);
+ original_path = SMB_STRDUP(full_orig_name);
} else {
original_path = strdup_upper(full_orig_name);
}
*/
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);
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;
}
} 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 ));
}
}
+/***************************************************************************
+ 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;
}
}
/* 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)