[PATCH v6] ntdll: Add support for EXT4 case folding per directory

Huw Davies huw at codeweavers.com
Fri Jun 14 04:11:22 CDT 2019


On Thu, Jun 13, 2019 at 06:53:59PM +0300, Gabriel Ivăncescu wrote:
> +    if ((fd = open( dir, O_RDONLY | O_NONBLOCK | O_LARGEFILE )) == -1)
>          return TRUE;
> -    /* 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)
> +
> +    if (ioctl( fd, EXT2_IOC_GETFLAGS, &flags ) != -1 && (flags & EXT4_CASEFOLD_FL))
>      {
> -        RtlFreeHeap( GetProcessHeap(), 0, cifile );
> -        return FALSE;
> +        sens = FALSE;
>      }
> -    RtlFreeHeap( GetProcessHeap(), 0, cifile );
> -    return TRUE;
> +    else
> +    {
> +        /* 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.
> +         */
> +        if (fstatfs( fd, &stfs ) != -1 && stfs.f_type == 0x65735546 /* FUSE_SUPER_MAGIC */ &&
> +            fstatat( fd, ".ciopfs", &st, AT_NO_AUTOMOUNT ) == 0)
> +            sens = FALSE;
> +    }
> +    close( fd );
> +    return sens;
>  #else
>      return TRUE;
>  #endif

I've sent in a new version with a few changes.  Most notably I've
trimmed the CIOPFS comment right down.  I've also inverted the
return value check of fstatfs() to match that of fstatat().

Huw.



More information about the wine-devel mailing list