Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 4 Nov 2003 04:52:11 +0900
From:      "R. Imura" <imura@ryu16.org>
To:        fs@freebsd.org, i18n@freebsd.org
Subject:   Re: [patch] combine mount_udf(8) with kiconv(3)
Message-ID:  <20031103195211.GA63701%imura@ryu16.org>
In-Reply-To: <20031102164218.GB606%imura@ryu16.org>
References:  <20031102164218.GB606%imura@ryu16.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, Nov 03, 2003 at 01:42:18AM +0900, R. Imura wrote:
> Hi all,
> 
> I now added -C option to mount_udf(8) as well as mount_cd9660(8)
> and mount_ntfs(8) with UDF_ICONV kernel module in order to
> handle multibyte characters.
> Since I'm new to nmount(), please correct me if I'm wrong with
> how to write udf specific options/flags.
> The patch is here:
> 
>   http://www.ryu16.org/FreeBSD/kiconv/udf_5_current_20031101.diff

I updated the patch because it lacked exception case when
meeting a unicode character which is not in his convertion table.
New one is here:

  http://www.ryu16.org/FreeBSD/kiconv/udf_5_current_20031103.diff

The difference between 20031101 version and 20031103 version is following.

diff -u -r1.1.2.5 udf_vnops.c
--- udf_vnops.c	3 Nov 2003 19:38:28 -0000	1.1.2.5
+++ udf_vnops.c	3 Nov 2003 19:29:35 -0000
@@ -450,9 +450,8 @@
 /*
  * Call the OSTA routines to translate the name from a CS0 dstring to a
  * 16-bit Unicode String.  Hooks need to be placed in here to translate from
- * Unicode to the encoding that the kernel/user expects.  For now, compact
- * the encoding to 8 bits if possible.  Return the length of the translated
- * string.
+ * Unicode to the encoding that the kernel/user expects.  Return the length
+ * of the translated string.
  */
 static int
 udf_transname(char *cs0string, char *destname, int len, struct udf_mnt *udfmp)
@@ -481,8 +480,17 @@
 		}
 		unibuf = unip;
 		unileft = (size_t)unilen * 2;
-		udf_iconv->conv(udfmp->im_d2l, (const char **)&unibuf, &unileft,
-			(char **)&destname, &destleft);
+		while (unileft > 0 && destleft > 0) {
+			udf_iconv->conv(udfmp->im_d2l, (const char **)&unibuf,
+				&unileft, (char **)&destname, &destleft);
+			/* Unconverted character found */
+			if (unileft > 0 && destleft > 0) {
+				*destname++ = '?';
+				destleft--;
+				unibuf += 2;
+				unileft -= 2;
+			}
+		}
 		uma_zfree(udf_zone_trans, unip);
 		*destname = '\0';
 		destlen = MAXNAMLEN - (int)destleft;

- R. Imura



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20031103195211.GA63701%imura>