Hello! On Thursday 22 October 2020 16:55:04 Chris Lamb wrote: > $ LC_CTYPE=tr_TR.UTF-8 mtools > Syntax error at line 5 for drive A: column 9 in file /etc/mtools.conf: > unrecognized keyword > > $ echo $? > 1 > ... > As I describe in my followup to that bug, I can confirm that this is > indeed locale issue, as commenting out the setlocale(3) call at the > top of the "main" entry point fixes this issue. > > The following "patch" against mtools.c also ""works"" for me: > > +#ifdef HAVE_SETLOCALE > + char *old_locale = setlocale(LC_ALL, NULL); > + setlocale(LC_ALL, "C"); > + read_config(); > + setlocale(LC_ALL, old_locale); > +#else > read_config(); > +#endif > > > .. but this is obviously not right, as it would mean that genuine > syntax errors printed in read_config() would not be translated into, > well, Turkish. Can't seem to get a "C" locale version of toupper(3) to > work right this second, and am assuming you folks will have a cleaner > solution anyway, hence forwarding this to you.
IIRC toupper() for lowercase i with dot in Turkish locale returns uppercase I with dot. In English or C locale it is uppercase I without dot. I guess that for case-insensitive parsing of config options (which are written in English) should be used toupper() variant in C locale. There is a standard POSIX function toupper_l() which takes as a second argument locale. So I think that for reading config file it should be used function toupper_l() with C locale instead of locale-dependent toupper() function. -- Pali Rohár pali.ro...@gmail.com