summaryrefslogtreecommitdiffstats
path: root/contrib/smbfs
diff options
context:
space:
mode:
authorglebius <glebius@FreeBSD.org>2013-11-09 14:48:50 +0000
committerglebius <glebius@FreeBSD.org>2013-11-09 14:48:50 +0000
commit2967834945de3115e1520fa63e5136fa7579df3e (patch)
tree9cf332a0aa8327e9838b6dccc4cd8c079ec63144 /contrib/smbfs
parentc6b475170ce826cc05affea7ff0cb9bab915502f (diff)
downloadFreeBSD-src-2967834945de3115e1520fa63e5136fa7579df3e.zip
FreeBSD-src-2967834945de3115e1520fa63e5136fa7579df3e.tar.gz
Use system libiconv, instead of trying to dlopen() it.
PR: 183153 Submitted by: Dominic Fandrey <kamikaze bsdforen.de>
Diffstat (limited to 'contrib/smbfs')
-rw-r--r--contrib/smbfs/lib/smb/nls.c67
1 files changed, 15 insertions, 52 deletions
diff --git a/contrib/smbfs/lib/smb/nls.c b/contrib/smbfs/lib/smb/nls.c
index 3274428..1637fa7 100644
--- a/contrib/smbfs/lib/smb/nls.c
+++ b/contrib/smbfs/lib/smb/nls.c
@@ -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 char *external)
#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, int size)
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, int size)
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--;
OpenPOWER on IntegriCloud