2005-04-17 02:20:36 +04:00
/*
* linux / fs / isofs / joliet . c
*
* ( C ) 1996 Gordon Chaffee
*
* Joliet : Microsoft ' s Unicode extensions to iso9660
*/
2005-04-26 05:32:12 +04:00
# include <linux/types.h>
2005-04-17 02:20:36 +04:00
# include <linux/nls.h>
2005-04-26 05:32:12 +04:00
# include "isofs.h"
2005-04-17 02:20:36 +04:00
/*
2006-03-22 02:13:35 +03:00
* Convert Unicode 16 to UTF - 8 or ASCII .
2005-04-17 02:20:36 +04:00
*/
static int
2005-12-24 22:33:09 +03:00
uni16_to_x8 ( unsigned char * ascii , __be16 * uni , int len , struct nls_table * nls )
2005-04-17 02:20:36 +04:00
{
2005-12-24 22:33:09 +03:00
__be16 * ip , ch ;
2005-04-17 02:20:36 +04:00
unsigned char * op ;
ip = uni ;
op = ascii ;
while ( ( ch = get_unaligned ( ip ) ) & & len ) {
int llen ;
2005-12-24 22:33:09 +03:00
llen = nls - > uni2char ( be16_to_cpu ( ch ) , op , NLS_MAX_CHARSET_SIZE ) ;
if ( llen > 0 )
2005-04-17 02:20:36 +04:00
op + = llen ;
else
* op + + = ' ? ' ;
ip + + ;
len - - ;
}
* op = 0 ;
return ( op - ascii ) ;
}
int
get_joliet_filename ( struct iso_directory_record * de , unsigned char * outname , struct inode * inode )
{
unsigned char utf8 ;
struct nls_table * nls ;
unsigned char len = 0 ;
utf8 = ISOFS_SB ( inode - > i_sb ) - > s_utf8 ;
nls = ISOFS_SB ( inode - > i_sb ) - > s_nls_iocharset ;
if ( utf8 ) {
2009-04-30 18:08:18 +04:00
len = utf16s_to_utf8s ( ( const wchar_t * ) de - > name ,
de - > name_len [ 0 ] > > 1 , UTF16_BIG_ENDIAN ,
outname , PAGE_SIZE ) ;
2005-04-17 02:20:36 +04:00
} else {
2005-12-24 22:33:09 +03:00
len = uni16_to_x8 ( outname , ( __be16 * ) de - > name ,
2007-07-16 10:40:03 +04:00
de - > name_len [ 0 ] > > 1 , nls ) ;
2005-04-17 02:20:36 +04:00
}
2007-07-16 10:40:03 +04:00
if ( ( len > 2 ) & & ( outname [ len - 2 ] = = ' ; ' ) & & ( outname [ len - 1 ] = = ' 1 ' ) )
2005-04-17 02:20:36 +04:00
len - = 2 ;
/*
* Windows doesn ' t like periods at the end of a name ,
* so neither do we
*/
2007-07-16 10:40:03 +04:00
while ( len > = 2 & & ( outname [ len - 1 ] = = ' . ' ) )
2005-04-17 02:20:36 +04:00
len - - ;
return len ;
}