diff --git a/src/add-ons/kernel/file_systems/dos/dir.c b/src/add-ons/kernel/file_systems/dos/dir.c index bc9859006b..7f57823bff 100644 --- a/src/add-ons/kernel/file_systems/dos/dir.c +++ b/src/add-ons/kernel/file_systems/dos/dir.c @@ -180,7 +180,8 @@ static status_t _next_dirent_(struct diri *iter, struct _dirent_info_ *oinfo, // process short name if (start_index == 0xffff) { start_index = iter->current_index; - msdos_to_utf8(buffer, (uchar *)filename, len); + // korli : seen on FreeBSD /src/sys/fs/msdosfs/direntry.h + msdos_to_utf8(buffer, (uchar *)filename, len, buffer[0xc] & 0x18); } if (oinfo) { diff --git a/src/add-ons/kernel/file_systems/dos/encodings.cpp b/src/add-ons/kernel/file_systems/dos/encodings.cpp index b0c61f57b5..95d97b8ce6 100644 --- a/src/add-ons/kernel/file_systems/dos/encodings.cpp +++ b/src/add-ons/kernel/file_systems/dos/encodings.cpp @@ -5,6 +5,7 @@ #include +#include #include #include #include @@ -1503,7 +1504,7 @@ status_t generate_short_name(const uchar *name, const uchar *uni, /* called to convert a short ms-dos filename to utf8. XXX: encoding is assumed to be standard US code page, never shift-JIS */ -status_t msdos_to_utf8(uchar *msdos, uchar *utf8, uint32 utf8len) +status_t msdos_to_utf8(uchar *msdos, uchar *utf8, uint32 utf8len, bool toLower) { uchar normalized[8+1+3+1]; int32 i, pos; @@ -1513,14 +1514,15 @@ status_t msdos_to_utf8(uchar *msdos, uchar *utf8, uint32 utf8len) pos = 0; for (i=0;i<8;i++) { if (msdos[i] == ' ') break; - normalized[pos++] = ((i == 0) && (msdos[i] == 5)) ? 0xe5 : msdos[i]; + normalized[pos++] = ((i == 0) && (msdos[i] == 5)) ? 0xe5 : + (toLower ? tolower(msdos[i]) : msdos[i]); } if (msdos[8] != ' ') { normalized[pos++] = '.'; for (i=8;i<11;i++) { if (msdos[i] == ' ') break; - normalized[pos++] = msdos[i]; + normalized[pos++] = (toLower ? tolower(msdos[i]) : msdos[i]); } } diff --git a/src/add-ons/kernel/file_systems/dos/encodings.h b/src/add-ons/kernel/file_systems/dos/encodings.h index 8e87352065..782c4922ac 100644 --- a/src/add-ons/kernel/file_systems/dos/encodings.h +++ b/src/add-ons/kernel/file_systems/dos/encodings.h @@ -22,7 +22,7 @@ status_t munge_short_name1(uchar nshort[11], int iteration, int encoding); status_t generate_short_name(const uchar *name, const uchar *uni, uint32 unilen, uchar nshort[11], int *encoding); -status_t msdos_to_utf8(uchar *msdos, uchar *utf8, uint32 utf8len); +status_t msdos_to_utf8(uchar *msdos, uchar *utf8, uint32 utf8len, bool toLower); #ifdef __cplusplus }