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