1 // SPDX-License-Identifier: GPL-2.0
3 * linux/fs/isofs/joliet.c
5 * (C) 1996 Gordon Chaffee
7 * Joliet: Microsoft's Unicode extensions to iso9660
10 #include <linux/types.h>
11 #include <linux/nls.h>
15 * Convert Unicode 16 to UTF-8 or ASCII.
18 uni16_to_x8(unsigned char *ascii
, __be16
*uni
, int len
, struct nls_table
*nls
)
26 while ((ch
= get_unaligned(ip
)) && len
) {
28 llen
= nls
->uni2char(be16_to_cpu(ch
), op
, NLS_MAX_CHARSET_SIZE
);
42 get_joliet_filename(struct iso_directory_record
* de
, unsigned char *outname
, struct inode
* inode
)
45 struct nls_table
*nls
;
46 unsigned char len
= 0;
48 utf8
= ISOFS_SB(inode
->i_sb
)->s_utf8
;
49 nls
= ISOFS_SB(inode
->i_sb
)->s_nls_iocharset
;
52 len
= utf16s_to_utf8s((const wchar_t *) de
->name
,
53 de
->name_len
[0] >> 1, UTF16_BIG_ENDIAN
,
56 len
= uni16_to_x8(outname
, (__be16
*) de
->name
,
57 de
->name_len
[0] >> 1, nls
);
59 if ((len
> 2) && (outname
[len
-2] == ';') && (outname
[len
-1] == '1'))
63 * Windows doesn't like periods at the end of a name,
66 while (len
>= 2 && (outname
[len
-1] == '.'))