Charles Davis cdavis@mymail.mines.edu writes:
+#if defined(HAVE_GETATTRLIST) && defined(ATTR_VOL_CAPABILITIES) && \
- defined(VOL_CAPABILITIES_FORMAT) && defined(VOL_CAP_FMT_CASE_SENSITIVE)
- char *mntpoint = NULL;
- struct attrlist attr;
- struct vol_caps caps;
- struct get_fsid get_fsid;
- struct fs_cache *entry;
- /* First get the FS ID of the volume */
- attr.bitmapcount = ATTR_BIT_MAP_COUNT;
- attr.reserved = 0;
- attr.commonattr = ATTR_CMN_DEVID|ATTR_CMN_FSID;
- attr.volattr = attr.dirattr = attr.fileattr = attr.forkattr = 0;
- get_fsid.size = 0;
- if (getattrlist( dir, &attr, &get_fsid, sizeof(get_fsid), 0 ) != 0 ||
get_fsid.size != sizeof(get_fsid))
return TRUE;
- /* Try to look it up in the cache */
- entry = look_up_fs_cache( get_fsid.dev );
- if (entry && !memcmp( &entry->fsid, &get_fsid.fsid, sizeof(fsid_t) ))
/* Cache lookup succeeded */
return entry->case_sensitive;
- /* Cache is stale at this point, we have to update it */
- mntpoint = get_device_mount_point( get_fsid.dev );
- /* Now look up the case-sensitivity */
- attr.commonattr = 0;
- attr.volattr = ATTR_VOL_INFO|ATTR_VOL_CAPABILITIES;
- if (getattrlist( mntpoint, &attr, &caps, sizeof(caps), 0 ) == 0)
- {
If that can fail then you need to structure this differently, otherwise you'll end up looking up the mount point on every call. Also please put that chunk in a separate function, it's totally different from the statfs code path.
+#elif defined(__linux__)
- /* Only assume CIOPFS is case insensitive. */
- /* Normally, we'd have to parse the mtab to find out exactly what
* kind of FUSE FS this is. But, someone on wine-devel suggested
* a shortcut. We'll stat a special file in the directory. If it's
* there, we'll assume it's a CIOPFS, else not.
* This will break if somebody puts a file named ".ciopfs" in a non-
* CIOPFS directory.
*/
- cifile = RtlAllocateHeap( GetProcessHeap(), 0, strlen( dir )+sizeof("/.ciopfs") );
- if (!cifile) return TRUE;
- strcpy( cifile, dir );
- strcat( cifile, "/.ciopfs" );
- if (stat( cifile, &st ) == 0)
- {
RtlFreeHeap( GetProcessHeap(), 0, cifile );
return FALSE;
- }
You lost the statfs here.
@@ -1872,7 +2097,7 @@ static NTSTATUS find_file_in_dir( char *unix_name, int pos, const WCHAR *name, i { ret = ntdll_umbstowcs( 0, de[1].d_name, strlen(de[1].d_name), buffer, MAX_DIR_ENTRY_LEN );
if (ret == length && !memicmpW( buffer, name, length))
if (ret == length && !memicmpW( buffer, name, length ))
Please avoid gratuitous whitespace changes.