1 /* 2 * linux/fs/isofs/joliet.c 3 * 4 * (C) 1996 Gordon Chaffee 5 * 6 * Joliet: Microsoft's Unicode extensions to iso9660 7 */ 8 9 #include <linux/types.h> 10 #include <linux/nls.h> 11 #include "isofs.h" 12 13 /* 14 * Convert Unicode 16 to UTF-8 or ASCII. 15 */ 16 static int 17 uni16_to_x8(unsigned char *ascii, __be16 *uni, int len, struct nls_table *nls) 18 { 19 __be16 *ip, ch; 20 unsigned char *op; 21 22 ip = uni; 23 op = ascii; 24 25 while ((ch = get_unaligned(ip)) && len) { 26 int llen; 27 llen = nls->uni2char(be16_to_cpu(ch), op, NLS_MAX_CHARSET_SIZE); 28 if (llen > 0) 29 op += llen; 30 else 31 *op++ = '?'; 32 ip++; 33 34 len--; 35 } 36 *op = 0; 37 return (op - ascii); 38 } 39 40 int 41 get_joliet_filename(struct iso_directory_record * de, unsigned char *outname, struct inode * inode) 42 { 43 unsigned char utf8; 44 struct nls_table *nls; 45 unsigned char len = 0; 46 47 utf8 = ISOFS_SB(inode->i_sb)->s_utf8; 48 nls = ISOFS_SB(inode->i_sb)->s_nls_iocharset; 49 50 if (utf8) { 51 len = utf16s_to_utf8s((const wchar_t *) de->name, 52 de->name_len[0] >> 1, UTF16_BIG_ENDIAN, 53 outname, PAGE_SIZE); 54 } else { 55 len = uni16_to_x8(outname, (__be16 *) de->name, 56 de->name_len[0] >> 1, nls); 57 } 58 if ((len > 2) && (outname[len-2] == ';') && (outname[len-1] == '1')) 59 len -= 2; 60 61 /* 62 * Windows doesn't like periods at the end of a name, 63 * so neither do we 64 */ 65 while (len >= 2 && (outname[len-1] == '.')) 66 len--; 67 68 return len; 69 } 70