diff options
| author | 2006-01-14 19:04:14 +0000 | |
|---|---|---|
| committer | 2006-01-14 19:04:14 +0000 | |
| commit | b6647e39f6a1f345129a55b4b4c6d83fb7debbeb (patch) | |
| tree | b114fa6359d98a858ccfc959f4ff9a4306d68732 /sys/isofs/udf/udf_subr.c | |
| parent | Rename nslm7x.c into lm78.c and nslm7xvar.h into lm78var.h, and clean up (diff) | |
| download | wireguard-openbsd-b6647e39f6a1f345129a55b4b4c6d83fb7debbeb.tar.xz wireguard-openbsd-b6647e39f6a1f345129a55b4b4c6d83fb7debbeb.zip | |
Better UDF name extraction code, which will not forget to report errors in
some cases; also silence a few udf messages unless option DIAGNOSTIC.
Tests and tweaks and ok pedro@
Diffstat (limited to 'sys/isofs/udf/udf_subr.c')
| -rw-r--r-- | sys/isofs/udf/udf_subr.c | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/sys/isofs/udf/udf_subr.c b/sys/isofs/udf/udf_subr.c new file mode 100644 index 00000000000..c0060e2d074 --- /dev/null +++ b/sys/isofs/udf/udf_subr.c @@ -0,0 +1,79 @@ +/* $OpenBSD: udf_subr.c,v 1.1 2006/01/14 19:04:17 miod Exp $ */ + +/* + * Copyright (c) 2006, Miodrag Vallat + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/kernel.h> +#include <sys/mutex.h> +#include <sys/stat.h> +#include <sys/mount.h> +#include <sys/vnode.h> +#include <sys/dirent.h> +#include <sys/unistd.h> + +#include <isofs/udf/ecma167-udf.h> +#include <isofs/udf/udf.h> +#include <isofs/udf/udf_extern.h> + +/* + * Convert a CS0 dstring to a 16-bit Unicode string. + * Returns the length of the Unicode string, in unicode characters (not + * bytes!), or -1 if an error arises. + * Note that the transname destination buffer is expected to be large + * enough to hold the result, and will not be terminated in any way. + */ +int +udf_rawnametounicode(u_int len, char *cs0string, unicode_t *transname) +{ + unicode_t *origname = transname; + + if (len-- == 0) + return (-1); + + switch (*cs0string++) { + case 8: /* bytes string */ + while (len-- != 0) + *transname++ = (unicode_t)*cs0string++; + break; + case 16: /* 16 bit unicode string */ + if (len & 1) + return (-1); + len >>= 1; + while (len-- != 0) { + unicode_t tmpchar; + + tmpchar = (unicode_t)*cs0string++; + tmpchar = (tmpchar << 8) | (unicode_t)*cs0string++; + *transname++ = tmpchar; + } + break; + default: + return (-1); + } + + return (transname - origname); +} |
