File:  [ELWIX - Embedded LightWeight unIX -] / elwix / files / csh / iconv_stub.c
Revision 1.3: download - view: text, annotated - select for diffs - revision graph
Fri Jul 16 18:35:50 2021 UTC (3 years, 3 months ago) by misho
Branches: MAIN
CVS tags: elwix2_8, HEAD, ELWIX2_7
ver 2.7

    1: /*-
    2:  * Copyright (c) 2006 Hajimu UMEMOTO <ume@FreeBSD.org>
    3:  * All rights reserved.
    4:  *
    5:  * Redistribution and use in source and binary forms, with or without
    6:  * modification, are permitted provided that the following conditions
    7:  * are met:
    8:  * 1. Redistributions of source code must retain the above copyright
    9:  *    notice, this list of conditions and the following disclaimer.
   10:  * 2. Redistributions in binary form must reproduce the above copyright
   11:  *    notice, this list of conditions and the following disclaimer in the
   12:  *    documentation and/or other materials provided with the distribution.
   13:  *
   14:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   15:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   16:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   17:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   18:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   19:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   20:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   21:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   22:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   23:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   24:  * SUCH DAMAGE.
   25:  *
   26:  * $FreeBSD$
   27:  */
   28: 
   29: #include <dlfcn.h>
   30: #include <stddef.h>
   31: 
   32: #include "iconv.h"
   33: 
   34: #undef iconv_open
   35: #undef iconv
   36: #undef iconv_close
   37: 
   38: #define ICONVLIB	"libiconv.so"
   39: #define ICONV_ENGINE	"libiconv"
   40: #define ICONV_OPEN	"libiconv_open"
   41: #define ICONV_CLOSE	"libiconv_close"
   42: 
   43: typedef iconv_t iconv_open_t(const char *, const char *);
   44: 
   45: dl_iconv_t *dl_iconv;
   46: dl_iconv_close_t *dl_iconv_close;
   47: 
   48: static int initialized;
   49: static void *iconvlib;
   50: static iconv_open_t *iconv_open;
   51: 
   52: iconv_t
   53: dl_iconv_open(const char *tocode, const char *fromcode)
   54: {
   55: 	if (initialized) {
   56: 		if (iconvlib == NULL)
   57: 			return (iconv_t)-1;
   58: 	} else {
   59: 		initialized = 1;
   60: 		iconvlib = dlopen(ICONVLIB, RTLD_LAZY | RTLD_GLOBAL);
   61: 		if (iconvlib == NULL)
   62: 			return (iconv_t)-1;
   63: 		iconv_open = (iconv_open_t *)dlfunc(iconvlib, ICONV_OPEN);
   64: 		if (iconv_open == NULL)
   65: 			goto dlfunc_err;
   66: 		dl_iconv = (dl_iconv_t *)dlfunc(iconvlib, ICONV_ENGINE);
   67: 		if (dl_iconv == NULL)
   68: 			goto dlfunc_err;
   69: 		dl_iconv_close = (dl_iconv_close_t *)dlfunc(iconvlib,
   70: 		    ICONV_CLOSE);
   71: 		if (dl_iconv_close == NULL)
   72: 			goto dlfunc_err;
   73: 	}
   74: 	return iconv_open(tocode, fromcode);
   75: 
   76: dlfunc_err:
   77: 	dlclose(iconvlib);
   78: 	iconvlib = NULL;
   79: 	return (iconv_t)-1;
   80: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>