iocharset= mount option specifies the character set used on *console*
(not on disk). So even dstrings from VRS need to be converted from CS0
to the specified charset and not always UTF-8. This is barely user
visible as those strings are shown only in UDF debug messages.
CC: Andrew Gabbasov <[email protected]>
Signed-off-by: Jan Kara <[email protected]>
#endif
}
- ret = udf_dstrCS0toUTF8(outstr, 31, pvoldesc->volIdent, 32);
+ ret = udf_dstrCS0toChar(sb, outstr, 31, pvoldesc->volIdent, 32);
if (ret < 0)
goto out_bh;
strncpy(UDF_SB(sb)->s_volume_ident, outstr, ret);
udf_debug("volIdent[] = '%s'\n", UDF_SB(sb)->s_volume_ident);
- ret = udf_dstrCS0toUTF8(outstr, 127, pvoldesc->volSetIdent, 128);
+ ret = udf_dstrCS0toChar(sb, outstr, 127, pvoldesc->volSetIdent, 128);
if (ret < 0)
goto out_bh;
uint8_t *, int);
extern int udf_put_filename(struct super_block *, const uint8_t *, int,
uint8_t *, int);
-extern int udf_dstrCS0toUTF8(uint8_t *, int, const uint8_t *, int);
+extern int udf_dstrCS0toChar(struct super_block *, uint8_t *, int,
+ const uint8_t *, int);
/* ialloc.c */
extern void udf_free_inode(struct inode *);
return u_len;
}
-int udf_dstrCS0toUTF8(uint8_t *utf_o, int o_len,
+int udf_dstrCS0toChar(struct super_block *sb, uint8_t *utf_o, int o_len,
const uint8_t *ocu_i, int i_len)
{
+ int (*conv_f)(wchar_t, unsigned char *, int);
int s_len = 0;
if (i_len > 0) {
}
}
- return udf_name_from_CS0(utf_o, o_len, ocu_i, s_len,
- udf_uni2char_utf8, 0);
+ if (UDF_QUERY_FLAG(sb, UDF_FLAG_UTF8)) {
+ conv_f = udf_uni2char_utf8;
+ } else if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP)) {
+ conv_f = UDF_SB(sb)->s_nls_map->uni2char;
+ } else
+ BUG();
+
+ return udf_name_from_CS0(utf_o, o_len, ocu_i, s_len, conv_f, 0);
}
int udf_get_filename(struct super_block *sb, const uint8_t *sname, int slen,