svn commit: samba r2893 - in branches/SAMBA_4_0/source/ntvfs/posix: .

tridge at samba.org tridge at samba.org
Sun Oct 10 05:30:00 GMT 2004


Author: tridge
Date: 2004-10-10 05:29:59 +0000 (Sun, 10 Oct 2004)
New Revision: 2893

WebSVN: http://websvn.samba.org/websvn/changeset.php?rep=samba&path=/branches/SAMBA_4_0/source/ntvfs/posix&rev=2893&nolog=1

Log:
added very primitive name mangling support to pvfs



Modified:
   branches/SAMBA_4_0/source/ntvfs/posix/pvfs_resolve.c
   branches/SAMBA_4_0/source/ntvfs/posix/pvfs_shortname.c


Changeset:
Modified: branches/SAMBA_4_0/source/ntvfs/posix/pvfs_resolve.c
===================================================================
--- branches/SAMBA_4_0/source/ntvfs/posix/pvfs_resolve.c	2004-10-10 03:08:49 UTC (rev 2892)
+++ branches/SAMBA_4_0/source/ntvfs/posix/pvfs_resolve.c	2004-10-10 05:29:59 UTC (rev 2893)
@@ -33,9 +33,19 @@
 /*
   compare two filename components. This is where the name mangling hook will go
 */
-static int component_compare(const char *c1, const char *c2)
+static int component_compare(struct pvfs_state *pvfs, const char *comp, const char *name)
 {
-	return StrCaseCmp(c1, c2);
+	char *shortname;
+	int ret;
+
+	if (StrCaseCmp(comp, name) == 0) return 0;
+
+	shortname = pvfs_short_name_component(pvfs, name);
+
+	ret = StrCaseCmp(comp, shortname);
+
+	talloc_free(shortname);
+	return ret;
 }
 
 /*
@@ -110,7 +120,7 @@
 		}
 
 		while ((de = readdir(dir))) {
-			if (component_compare(components[i], de->d_name) == 0) {
+			if (component_compare(pvfs, components[i], de->d_name) == 0) {
 				break;
 			}
 		}

Modified: branches/SAMBA_4_0/source/ntvfs/posix/pvfs_shortname.c
===================================================================
--- branches/SAMBA_4_0/source/ntvfs/posix/pvfs_shortname.c	2004-10-10 03:08:49 UTC (rev 2892)
+++ branches/SAMBA_4_0/source/ntvfs/posix/pvfs_shortname.c	2004-10-10 05:29:59 UTC (rev 2893)
@@ -23,14 +23,58 @@
 #include "include/includes.h"
 #include "vfs_posix.h"
 
+#define FNV1_PRIME 0x01000193
+/*the following number is a fnv1 of the string: idra at samba.org 2002 */
+#define FNV1_INIT  0xa6b93095
 
+/* 
+   hash a string of the specified length. The string does not need to be
+   null terminated 
+
+   this hash needs to be fast with a low collision rate (what hash doesn't?)
+*/
+static uint32_t mangle_hash(const char *key)
+{
+	uint32_t value;
+	codepoint_t c;
+	size_t c_size;
+
+	for (value = FNV1_INIT; 
+	     (c=next_codepoint(key, &c_size)); 
+	     key += c_size) {
+		c = toupper_w(c);
+                value *= (uint32_t)FNV1_PRIME;
+                value ^= (uint32_t)c;
+        }
+
+	/* note that we force it to a 31 bit hash, to keep within the limits
+	   of the 36^6 mangle space */
+	return value & ~0x80000000;  
+}
+
 /*
   return the short name for a component of a full name
   TODO: this is obviously not very useful in its current form !
 */
 char *pvfs_short_name_component(struct pvfs_state *pvfs, const char *name)
 {
-	return talloc_strndup(pvfs, name, 12);
+	const char *basechars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+	uint32_t hash;
+	char c1, c2;
+	const char *ext;
+
+	if (strlen(name) < 12) {
+		return talloc_strdup(pvfs, name);
+	}
+
+	hash = mangle_hash(name);
+	ext = strrchr(name, '.');
+
+	c1 = basechars[(hash/36)%36];
+	c2 = basechars[hash%36];
+
+	return talloc_asprintf(pvfs, "%.5s~%c%c%.4s", name, c1, c2, ext?ext:"");
+	
 }
 
 



More information about the samba-cvs mailing list