1
0
Fork 0
mirror of git://git.code.sf.net/p/cdesktopenv/code synced 2025-02-13 11:42:21 +00:00

Linux bugfixes for globcasedetect (re: 71934570) (#240)

src/lib/libast/features/lib,
src/lib/libast/path/pathicase.c:
- FAT32 file systems on Linux don't support FS_CASEFOLD_FL, which
  caused globbing to break. Reproducer using a UEFI boot partition:
      $ echo /boot/eF*
      /boot/eF*
  This is fixed by checking for FAT attributes with ioctl, then
  checking for FS_CASEFOLD_FL if that fails.
- The check for FS_CASEFOLD_FL didn't work correctly; I still wasn't
  able to get --globcasedetect to work on a case-insensitive ext4
  folder. Fix that by adding missing parentheses.
This commit is contained in:
Johnothan King 2021-03-23 06:59:02 -07:00 committed by GitHub
parent bd38c8049d
commit ca3ec2000c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 27 additions and 6 deletions

View file

@ -4,7 +4,7 @@ cmd universe
hdr dirent,direntry,filio,fmtmsg,fnmatch,jioctl,libgen,limits
hdr locale,ndir,nl_types,process,spawn,syslog,utime,vfork
hdr linux/fs,sys/ioctl
hdr linux/fs,linux/msdos_fs,sys/ioctl
hdr wchar note{ <wchar.h> and isw*() really work }end execute{
#include <wchar.h>
int

View file

@ -17,11 +17,23 @@
#include <ast.h>
#include <error.h>
#if _hdr_linux_fs && _hdr_sys_ioctl
#if _hdr_linux_fs
#include <linux/fs.h>
#endif
#if _hdr_linux_msdos_fs
#include <linux/msdos_fs.h>
#endif
#if _hdr_sys_ioctl
#include <sys/ioctl.h>
#endif
#if _hdr_sys_ioctl && _hdr_linux_fs && defined(FS_IOC_GETFLAGS) && defined(FS_CASEFOLD_FL)
#define _linux_casefold 1
#endif
#if _hdr_sys_ioctl && _hdr_linux_msdos_fs && defined(FAT_IOCTL_GET_ATTRIBUTES)
#define _linux_fatfs 1
#endif
/*
* Return 1 if the given path is on a case insensitive file system, 0 if not, -1 on error.
*/
@ -40,14 +52,23 @@ pathicase(const char *path)
/* Cygwin */
long r = pathconf(path, _PC_CASE_INSENSITIVE);
return r < 0L ? -1 : r > 0L;
#elif _hdr_linux_fs && _hdr_sys_ioctl && defined(FS_IOC_GETFLAGS) && defined(FS_CASEFOLD_FL)
/* Linux 5.2+ */
#elif _linux_fatfs
/* Linux */
int attr = 0, fd, r;
if ((fd = open(path, O_RDONLY|O_NONBLOCK)) < 0)
return -1;
r = ioctl(fd, FAT_IOCTL_GET_ATTRIBUTES, &attr);
# if _linux_casefold
/* Linux 5.2+ */
if (r < 0 && errno == ENOTTY) /* if it's not VFAT/FAT32...*/
{
r = ioctl(fd, FS_IOC_GETFLAGS, &attr);
close(fd);
return r < 0 ? -1 : attr & FS_CASEFOLD_FL != 0;
return r < 0 ? -1 : (attr & FS_CASEFOLD_FL) != 0;
}
# endif /* _linux_casefold */
close(fd);
return r < 0 ? (errno != ENOTTY ? -1 : 0) : 1;
#elif _WINIX || __APPLE__
/* Windows or Mac without pathconf probe: assume case insensitive */
return 1;