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