Author: glebius
Date: Sat Nov  9 14:48:50 2013
New Revision: 257888
URL: http://svnweb.freebsd.org/changeset/base/257888

Log:
  Use system libiconv, instead of trying to dlopen() it.
  
  PR:           183153
  Submitted by: Dominic Fandrey <kamikaze bsdforen.de>

Modified:
  head/contrib/smbfs/lib/smb/nls.c
  head/usr.sbin/mount_smbfs/Makefile

Modified: head/contrib/smbfs/lib/smb/nls.c
==============================================================================
--- head/contrib/smbfs/lib/smb/nls.c    Sat Nov  9 14:46:24 2013        
(r257887)
+++ head/contrib/smbfs/lib/smb/nls.c    Sat Nov  9 14:48:50 2013        
(r257888)
@@ -36,12 +36,9 @@
 __FBSDID("$FreeBSD$");
 
 #include <sys/types.h>
-#include <sys/iconv.h>
+#include <iconv.h>
 #include <sys/sysctl.h>
 #include <ctype.h>
-#ifndef APPLE
-#include <dlfcn.h>
-#endif
 #include <errno.h>
 #include <stdio.h>
 #include <string.h>
@@ -50,21 +47,10 @@ __FBSDID("$FreeBSD$");
 #include <err.h>
 #include <netsmb/smb_lib.h>
 
-/*
- * prototype iconv* functions
- */
-typedef void *iconv_t;
-
-static iconv_t (*my_iconv_open)(const char *, const char *);
-static size_t(*my_iconv)(iconv_t, const char **, size_t *, char **, size_t *);
-static int(*my_iconv_close)(iconv_t);
-
 u_char nls_lower[256];
 u_char nls_upper[256];
 
 static iconv_t nls_toext, nls_toloc;
-static int iconv_loaded;
-static void *iconv_lib;
 
 int
 nls_setlocale(const char *name)
@@ -90,32 +76,18 @@ nls_setrecode(const char *local, const c
 #else
        iconv_t icd;
 
-       if (iconv_loaded == 2)
-               return ENOENT;
-       else if (iconv_loaded == 0) {
-               iconv_loaded++;
-               iconv_lib = dlopen("libiconv.so", RTLD_LAZY | RTLD_GLOBAL);
-               if (iconv_lib == NULL) {
-                       warn("Unable to load iconv library: %s\n", dlerror());
-                       iconv_loaded++;
-                       return ENOENT;
-               }
-               my_iconv_open = dlsym(iconv_lib, "iconv_open");
-               my_iconv = dlsym(iconv_lib, "iconv");
-               my_iconv_close = dlsym(iconv_lib, "iconv_close");
-       }
        if (nls_toext)
-               my_iconv_close(nls_toext);
+               iconv_close(nls_toext);
        if (nls_toloc)
-               my_iconv_close(nls_toloc);
+               iconv_close(nls_toloc);
        nls_toext = nls_toloc = (iconv_t)0;
-       icd = my_iconv_open(external, local);
+       icd = iconv_open(external, local);
        if (icd == (iconv_t)-1)
                return errno;
        nls_toext = icd;
-       icd = my_iconv_open(local, external);
+       icd = iconv_open(local, external);
        if (icd == (iconv_t)-1) {
-               my_iconv_close(nls_toext);
+               iconv_close(nls_toext);
                nls_toext = (iconv_t)0;
                return errno;
        }
@@ -130,14 +102,11 @@ nls_str_toloc(char *dst, const char *src
        char *p = dst;
        size_t inlen, outlen;
 
-       if (!iconv_loaded)
-               return strcpy(dst, src);
-
        if (nls_toloc == (iconv_t)0)
                return strcpy(dst, src);
        inlen = outlen = strlen(src);
-       my_iconv(nls_toloc, NULL, NULL, &p, &outlen);
-       while (my_iconv(nls_toloc, &src, &inlen, &p, &outlen) == -1) {
+       iconv(nls_toloc, NULL, NULL, &p, &outlen);
+       while (iconv(nls_toloc, &src, &inlen, &p, &outlen) == -1) {
                *p++ = *src++;
                inlen--;
                outlen--;
@@ -152,14 +121,11 @@ nls_str_toext(char *dst, const char *src
        char *p = dst;
        size_t inlen, outlen;
 
-       if (!iconv_loaded)
-               return strcpy(dst, src);
-
        if (nls_toext == (iconv_t)0)
                return strcpy(dst, src);
        inlen = outlen = strlen(src);
-       my_iconv(nls_toext, NULL, NULL, &p, &outlen);
-       while (my_iconv(nls_toext, &src, &inlen, &p, &outlen) == -1) {
+       iconv(nls_toext, NULL, NULL, &p, &outlen);
+       while (iconv(nls_toext, &src, &inlen, &p, &outlen) == -1) {
                *p++ = *src++;
                inlen--;
                outlen--;
@@ -175,17 +141,14 @@ nls_mem_toloc(void *dst, const void *src
        const char *s = src;
        size_t inlen, outlen;
 
-       if (!iconv_loaded)
-               return memcpy(dst, src, size);
-
        if (size == 0)
                return NULL;
 
        if (nls_toloc == (iconv_t)0)
                return memcpy(dst, src, size);
        inlen = outlen = size;
-       my_iconv(nls_toloc, NULL, NULL, &p, &outlen);
-       while (my_iconv(nls_toloc, &s, &inlen, &p, &outlen) == -1) {
+       iconv(nls_toloc, NULL, NULL, &p, &outlen);
+       while (iconv(nls_toloc, &s, &inlen, &p, &outlen) == -1) {
                *p++ = *s++;
                inlen--;
                outlen--;
@@ -203,12 +166,12 @@ nls_mem_toext(void *dst, const void *src
        if (size == 0)
                return NULL;
 
-       if (!iconv_loaded || nls_toext == (iconv_t)0)
+       if (nls_toext == (iconv_t)0)
                return memcpy(dst, src, size);
 
        inlen = outlen = size;
-       my_iconv(nls_toext, NULL, NULL, &p, &outlen);
-       while (my_iconv(nls_toext, &s, &inlen, &p, &outlen) == -1) {
+       iconv(nls_toext, NULL, NULL, &p, &outlen);
+       while (iconv(nls_toext, &s, &inlen, &p, &outlen) == -1) {
                *p++ = *s++;
                inlen--;
                outlen--;

Modified: head/usr.sbin/mount_smbfs/Makefile
==============================================================================
--- head/usr.sbin/mount_smbfs/Makefile  Sat Nov  9 14:46:24 2013        
(r257887)
+++ head/usr.sbin/mount_smbfs/Makefile  Sat Nov  9 14:48:50 2013        
(r257888)
@@ -11,11 +11,6 @@ CFLAGS+=     -DSMBFS -I${MOUNTDIR} -I${CONTR
 LDADD= -lsmb -lkiconv
 DPADD= ${LIBSMB} ${LIBKICONV}
 
-# Needs to be dynamically linked for optional dlopen() access to
-# userland libiconv (see the -E option).
-#
-NO_SHARED?=    NO
-
 .PATH: ${CONTRIBDIR}/mount_smbfs
 .PATH:  ${MOUNTDIR}
 
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to