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>