Annotation of elwix/files/csh/iconv_stub.c, revision 1.3

1.2       misho       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:  *
1.3     ! misho      26:  * $FreeBSD$
1.2       misho      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"
1.3     ! misho      39: #define ICONV_ENGINE   "libiconv"
        !            40: #define ICONV_OPEN     "libiconv_open"
        !            41: #define ICONV_CLOSE    "libiconv_close"
1.2       misho      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>