On Sat, Nov 09, 2013 at 02:48:50PM +0000, Gleb Smirnoff wrote: > 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} > This breaks WITHOUT_ICONV.
pgpgsMYWONVIS.pgp
Description: PGP signature
