usr/src/lib/libc/port/gen/iconv.c
author Jon Tibble <meths@btinternet.com>
Thu, 09 Dec 2010 22:32:39 +0100
changeset 13255 4afa820d78b9
parent 11117 21aa1119f172
child 14112 9365fdf3a618
permissions -rw-r--r--
298 SPARC build fails in smt_pause.o 478 Build needs fixing for pkgdepend flag day Reviewed by: [email protected] Reviewed by: [email protected] Reviewed by: [email protected] Approved by: [email protected]
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
     5
 * Common Development and Distribution License (the "License").
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
     6
 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 */
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
    21
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
11117
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
    23
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
    27
#include "lint.h"
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
#include <sys/stat.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
#include <sys/mman.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
#include <stdlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
#include <stdio.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
#include <dlfcn.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#include <fcntl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
#include <unistd.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
#include <string.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#include <errno.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#include <sys/param.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#include <alloca.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include "iconv.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
#include "iconvP.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
#include "../i18n/_loc_path.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
static iconv_p	iconv_open_all(const char *, const char *, char *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
static iconv_p	iconv_open_private(const char *, const char *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
static iconv_p	iconv_search_alias(const char *, const char *, char *);
11117
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
    47
static size_t	passthru_icv_iconv(iconv_t, const char **, size_t *, char **,
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
    48
	size_t *);
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
    49
static void	passthru_icv_close(iconv_t);
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
    50
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
    51
#define	PASSTHRU_MAGIC_NUMBER	(0x53756e)
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
    52
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
/*
11117
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
    55
 * These functions are mainly implemented by using a shared object and
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
    56
 * the dlopen() functions. The actual conversion algorithm for a particular
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
    57
 * conversion is implemented via a shared object as a loadable conversion
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
    58
 * module which is linked dynamically at run time.
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
    59
 *
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
    60
 * The loadable conversion module resides as either:
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
    61
 *
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
    62
 *	/usr/lib/iconv/geniconvtbl.so
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
    63
 *
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
    64
 * if the conversion is supported through a geniconvtbl code conversion
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
    65
 * binary table or as a module that directly specifies the conversion at:
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
    66
 *
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
 *	/usr/lib/iconv/fromcode%tocode.so
11117
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
    68
 *
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
 * where fromcode is the source encoding and tocode is the target encoding.
11117
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
    70
 * The modules have 3 entries: _icv_open(), _icv_iconv(), and _icv_close().
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
    71
 *
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
    72
 * If there is no code conversion supported and if the fromcode and the tocode
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
    73
 * are specifying the same codeset, then, the byte-by-byte, pass-through code
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
    74
 * conversion that is embedded in the libc is used instead.
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
    75
 *
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
    76
 * The following are the related PSARC cases:
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
    77
 *
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
    78
 *	PSARC/1993/153 iconv/iconv_open/iconv_close
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
    79
 *	PSARC/1999/292 Addition of geniconvtbl(1)
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
    80
 *	PSARC/2001/072 GNU gettext support
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
    81
 *	PSARC/2009/561 Pass-through iconv code conversion
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
    82
 *
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
    83
 * The PSARC/2001/072 includes the /usr/lib/iconv/alias interface.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
iconv_t
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
    87
iconv_open(const char *tocode, const char *fromcode)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
	iconv_t	cd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
	char	*ipath;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
	if ((cd = malloc(sizeof (struct _iconv_info))) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
		return ((iconv_t)-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
	 * Memory for ipath is allocated/released in this function.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
	ipath = malloc(MAXPATHLEN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
	if (ipath == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
		free(cd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
		return ((iconv_t)-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
	cd->_conv = iconv_open_all(tocode, fromcode, ipath);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
	if (cd->_conv != (iconv_p)-1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
		/* found a valid module for this conversion */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
		free(ipath);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
		return (cd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
	 * Now, try using the encoding name aliasing table
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
	cd->_conv = iconv_search_alias(tocode, fromcode, ipath);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
	free(ipath);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
	if (cd->_conv == (iconv_p)-1) {
11117
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   117
		/*
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   118
		 * As the last resort, check if the tocode and the fromcode
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   119
		 * are referring to the same codeset name or not. If so,
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   120
		 * assign the embedded pass-through code conversion.
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   121
		 */
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   122
		if (strcasecmp(tocode, fromcode) != 0) {
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   123
			/*
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   124
			 * No valid conversion available. Do failure retrun
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   125
			 * with the errno set by iconv_search_alias().
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   126
			 */
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   127
			free(cd);
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   128
			return ((iconv_t)-1);
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   129
		}
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   130
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   131
		/*
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   132
		 * For a pass-through byte-by-byte code conversion, allocate
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   133
		 * an internal conversion descriptor and initialize the data
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   134
		 * fields appropriately and we are done.
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   135
		 */
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   136
		cd->_conv = malloc(sizeof (struct _iconv_fields));
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   137
		if (cd->_conv == NULL) {
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   138
			free(cd);
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   139
			return ((iconv_t)-1);
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   140
		}
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   141
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   142
		cd->_conv->_icv_handle = NULL;
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   143
		cd->_conv->_icv_iconv = passthru_icv_iconv;
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   144
		cd->_conv->_icv_close = passthru_icv_close;
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   145
		cd->_conv->_icv_state = (void *)PASSTHRU_MAGIC_NUMBER;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
	}
11117
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   147
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
	/* found a valid module for this conversion */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
	return (cd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
static size_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
search_alias(char **paddr, size_t size, const char *variant)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
	char	*addr = *paddr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
	char 	*p, *sp, *q;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
	size_t	var_len, can_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
	var_len = strlen(variant);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
	p = addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
	q = addr + size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
	while (q > p) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
		if (*p == '#') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
			 * Line beginning with '#' is a comment
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
			p++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
			while ((q > p) && (*p++ != '\n'))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
				;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
		/* skip leading spaces */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
		while ((q > p) &&
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
   174
		    ((*p == ' ') || (*p == '\t')))
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
			p++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
		if (q <= p)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
		sp = p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
		while ((q > p) && (*p != ' ') &&
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
   180
		    (*p != '\t') && (*p != '\n'))
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
			p++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
		if (q <= p) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
			/* invalid entry */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
		if (*p == '\n') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
			/* invalid entry */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
			p++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
		if (((p - sp) != var_len) ||
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
   193
		    ((strncmp(sp, variant, var_len) != 0) &&
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
   194
		    (strncasecmp(sp, variant, var_len) != 0))) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
			 * didn't match
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
			/* skip remaining chars in this line */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
			p++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
			while ((q > p) && (*p++ != '\n'))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
				;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
		/* matching entry found */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
		/* skip spaces */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
		while ((q > p) &&
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
   210
		    ((*p == ' ') || (*p == '\t')))
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
			p++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
		if (q <= p)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
		sp = p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
		while ((q > p) && (*p != ' ') &&
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
   216
		    (*p != '\t') && (*p != '\n'))
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
			p++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
		can_len = p - sp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
		if (can_len == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
			while ((q > p) && (*p++ != '\n'))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
				;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
		*paddr = sp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
		return (can_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
		/* NOTREACHED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
static iconv_p
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
iconv_open_all(const char *to, const char *from, char *ipath)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
	iconv_p	cv;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
	int	len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
	 * First, try using the geniconvtbl conversion, which is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
	 * performed by /usr/lib/iconv/geniconvtbl.so with
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
	 * the conversion table file:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
	 * /usr/lib/iconv/geniconvtbl/binarytables/fromcode%tocode.bt
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
	 * If the geniconvtbl conversion cannot be done,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
	 * try the conversion by the individual shared object.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
	len = snprintf(ipath, MAXPATHLEN, _GENICONVTBL_PATH, from, to);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
	if ((len <= MAXPATHLEN) && (access(ipath, R_OK) == 0)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
		 * from%to.bt exists in the table dir
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
		cv = iconv_open_private(_GENICONVTBL_INT_PATH, ipath);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
		if (cv != (iconv_p)-1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
			/* found a valid module for this conversion */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
			return (cv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
	/* Next, try /usr/lib/iconv/from%to.so */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
	len = snprintf(ipath, MAXPATHLEN, _ICONV_PATH, from, to);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
	if ((len <= MAXPATHLEN) && (access(ipath, R_OK) == 0)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
		 * /usr/lib/iconv/from%to.so exists
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
		 * errno will be set by iconv_open_private on error
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
		return (iconv_open_private(ipath, NULL));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
	/* no valid module for this conversion found */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
	errno = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
	return ((iconv_p)-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
static iconv_p
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
iconv_search_alias(const char *tocode, const char *fromcode, char *ipath)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
	char	*p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
	char	*to_canonical, *from_canonical;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
	size_t	tolen, fromlen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
	iconv_p	cv;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
	int	fd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
	struct stat64	statbuf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
	caddr_t	addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
	size_t	buflen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
	fd = open(_ENCODING_ALIAS_PATH, O_RDONLY);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
	if (fd == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
		 * if no alias file found,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
		 * errno will be set to EINVAL.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
		errno = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
		return ((iconv_p)-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
	if (fstat64(fd, &statbuf) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
		(void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
		/* use errno set by fstat64 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
		return ((iconv_p)-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
	buflen = (size_t)statbuf.st_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
	addr = mmap(NULL, buflen, PROT_READ, MAP_SHARED, fd, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
	(void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
	if (addr == MAP_FAILED) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
		/* use errno set by mmap */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
		return ((iconv_p)-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
	p = (char *)addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
	tolen = search_alias(&p, buflen, tocode);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
	if (tolen) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
		to_canonical = alloca(tolen + 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
		(void) memcpy(to_canonical, p, tolen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
		to_canonical[tolen] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
		to_canonical = (char *)tocode;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
	p = (char *)addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
	fromlen = search_alias(&p, buflen, fromcode);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
	if (fromlen) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
		from_canonical = alloca(fromlen + 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
		(void) memcpy(from_canonical, p, fromlen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
		from_canonical[fromlen] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
		from_canonical = (char *)fromcode;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
	(void) munmap(addr, buflen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
	if (tolen == 0 && fromlen == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
		errno = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
		return ((iconv_p)-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
	cv = iconv_open_all(to_canonical, from_canonical, ipath);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
	/* errno set by iconv_open_all on error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
	return (cv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
static iconv_p
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
iconv_open_private(const char *lib, const char *tbl)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
	iconv_t (*fptr)(const char *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
	iconv_p cdpath;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
	if ((cdpath = malloc(sizeof (struct _iconv_fields))) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
		return ((iconv_p)-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
	if ((cdpath->_icv_handle = dlopen(lib, RTLD_LAZY)) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
		free(cdpath);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
		/* dlopen does not define error no */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
		errno = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
		return ((iconv_p)-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
	/* gets address of _icv_open */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
	if ((fptr = (iconv_t(*)(const char *))dlsym(cdpath->_icv_handle,
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
   354
	    "_icv_open")) == NULL) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
		(void) dlclose(cdpath->_icv_handle);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
		free(cdpath);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
		/* dlsym does not define errno */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
		errno = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
		return ((iconv_p)-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
	 * gets address of _icv_iconv in the loadable conversion module
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
	 * and stores it in cdpath->_icv_iconv
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
	if ((cdpath->_icv_iconv = (size_t(*)(iconv_t, const char **,
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
   368
	    size_t *, char **, size_t *))dlsym(cdpath->_icv_handle,
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
   369
	    "_icv_iconv")) == NULL) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
		(void) dlclose(cdpath->_icv_handle);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
		free(cdpath);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
		/* dlsym does not define errno */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
		errno = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
		return ((iconv_p)-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
	 * gets address of _icv_close in the loadable conversion module
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
	 * and stores it in cd->_icv_close
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
	if ((cdpath->_icv_close = (void(*)(iconv_t))dlsym(cdpath->_icv_handle,
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
   382
	    "_icv_close")) == NULL) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
		(void) dlclose(cdpath->_icv_handle);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
		free(cdpath);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
		/* dlsym does not define errno */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
		errno = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
		return ((iconv_p)-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
	 * initialize the state of the actual _icv_iconv conversion routine
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
	 * For the normal iconv module, NULL will be passed as an argument
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
   393
	 * although the iconv_open() of the module won't use that.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
	cdpath->_icv_state = (void *)(*fptr)(tbl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
	if (cdpath->_icv_state == (struct _icv_state *)-1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
		(void) dlclose(cdpath->_icv_handle);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
		free(cdpath);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
		/* this module does not satisfy this conversion */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
		errno = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
		return ((iconv_p)-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
	return (cdpath);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
int
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
   409
iconv_close(iconv_t cd)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
	if (cd == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
		errno = EBADF;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
	(*(cd->_conv)->_icv_close)(cd->_conv->_icv_state);
11117
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   416
	if (cd->_conv->_icv_handle != NULL)
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   417
		(void) dlclose(cd->_conv->_icv_handle);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
	free(cd->_conv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
	free(cd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
11117
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   423
/*
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   424
 * To have minimal performance impact to the existing run-time behavior,
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   425
 * we supply a dummy passthru_icv_close() that will just return.
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   426
 */
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   427
static void
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   428
/*LINTED E_FUNC_ARG_UNUSED*/
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   429
passthru_icv_close(iconv_t cd)
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   430
{
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   431
}
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   432
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
size_t
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
   434
iconv(iconv_t cd, const char **inbuf, size_t *inbytesleft,
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
	char **outbuf, size_t *outbytesleft)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
	/* check if cd is valid */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
	if (cd == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
		errno = EBADF;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
		return ((size_t)-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
	/* direct conversion */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
	return ((*(cd->_conv)->_icv_iconv)(cd->_conv->_icv_state,
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
   445
	    inbuf, inbytesleft, outbuf, outbytesleft));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
}
11117
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   447
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   448
static size_t
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   449
passthru_icv_iconv(iconv_t cd, const char **inbuf, size_t *inbufleft,
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   450
	char **outbuf, size_t *outbufleft)
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   451
{
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   452
	size_t ibl;
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   453
	size_t obl;
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   454
	size_t len;
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   455
	size_t ret_val;
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   456
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   457
	/* Check if the conversion descriptor is a valid one. */
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   458
	if (cd != (iconv_t)PASSTHRU_MAGIC_NUMBER) {
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   459
		errno = EBADF;
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   460
		return ((size_t)-1);
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   461
	}
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   462
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   463
	/* For any state reset request, return success. */
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   464
	if (inbuf == NULL || *inbuf == NULL)
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   465
		return (0);
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   466
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   467
	/*
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   468
	 * Initialize internally used variables for a better performance
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   469
	 * and prepare for a couple of the return values before the actual
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   470
	 * copying of the bytes.
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   471
	 */
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   472
	ibl = *inbufleft;
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   473
	obl = *outbufleft;
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   474
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   475
	if (ibl > obl) {
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   476
		len = obl;
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   477
		errno = E2BIG;
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   478
		ret_val = (size_t)-1;
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   479
	} else {
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   480
		len = ibl;
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   481
		ret_val = 0;
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   482
	}
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   483
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   484
	/*
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   485
	 * Do the copy using memmove(). There are no EILSEQ or EINVAL
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   486
	 * checkings since this is a simple copying.
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   487
	 */
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   488
	(void) memmove((void *)*outbuf, (const void *)*inbuf, len);
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   489
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   490
	/* Update the return values related to the buffers then do return. */
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   491
	*inbuf = *inbuf + len;
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   492
	*outbuf = *outbuf + len;
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   493
	*inbufleft = ibl - len;
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   494
	*outbufleft = obl - len;
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   495
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   496
	return (ret_val);
21aa1119f172 PSARC/2009/561 Pass-through iconv code conversion
Ienup Sung <Ienup.Sung@Sun.COM>
parents: 6812
diff changeset
   497
}