svn commit: r257888 - in head: contrib/smbfs/lib/smb usr.sbin/mount_smbfs

Gleb Smirnoff glebius at FreeBSD.org
Sat Nov 9 14:48:51 UTC 2013


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}
 


More information about the svn-src-all mailing list