Charles Davis <cdavis(a)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.
--
Alexandre Julliard
julliard(a)winehq.org