summaryrefslogtreecommitdiffstats
path: root/contrib/smbfs
diff options
context:
space:
mode:
authorglebius <glebius@FreeBSD.org>2013-11-14 09:25:29 +0000
committerglebius <glebius@FreeBSD.org>2013-11-14 09:25:29 +0000
commitbb108535bab90d3218195361ff0ccf6791178573 (patch)
tree4eaf730fbe25cd1ee1015352a6d6155c595ba2a6 /contrib/smbfs
parent6e9011bd59a20b07230bd4fe50f79a2f20e23116 (diff)
downloadFreeBSD-src-bb108535bab90d3218195361ff0ccf6791178573.zip
FreeBSD-src-bb108535bab90d3218195361ff0ccf6791178573.tar.gz
Merge r257888, r258049 from head:
- Use system libiconv, instead of trying to dlopen() it. - Just disable recoding support in libsmb if built WITHOUT_ICONV. PR: 183153 Approved by: re (kib)
Diffstat (limited to 'contrib/smbfs')
-rw-r--r--contrib/smbfs/lib/smb/nls.c92
1 files changed, 38 insertions, 54 deletions
diff --git a/contrib/smbfs/lib/smb/nls.c b/contrib/smbfs/lib/smb/nls.c
index 3274428..5c2dbd9 100644
--- a/contrib/smbfs/lib/smb/nls.c
+++ b/contrib/smbfs/lib/smb/nls.c
@@ -36,12 +36,8 @@
__FBSDID("$FreeBSD$");
#include <sys/types.h>
-#include <sys/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 +46,16 @@ __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);
+#ifdef HAVE_ICONV
+#include <iconv.h>
+#endif
u_char nls_lower[256];
u_char nls_upper[256];
+#ifdef HAVE_ICONV
static iconv_t nls_toext, nls_toloc;
-static int iconv_loaded;
-static void *iconv_lib;
+#endif
int
nls_setlocale(const char *name)
@@ -85,117 +76,107 @@ nls_setlocale(const char *name)
int
nls_setrecode(const char *local, const char *external)
{
-#ifdef APPLE
- return ENOENT;
-#else
+#ifdef HAVE_ICONV
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;
}
nls_toloc = icd;
return 0;
+#else
+ return ENOENT;
#endif
}
char *
nls_str_toloc(char *dst, const char *src)
{
+#ifdef HAVE_ICONV
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--;
}
*p = 0;
return dst;
+#else
+ return strcpy(dst, src);
+#endif
}
char *
nls_str_toext(char *dst, const char *src)
{
+#ifdef HAVE_ICONV
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--;
}
*p = 0;
return dst;
+#else
+ return strcpy(dst, src);
+#endif
}
void *
nls_mem_toloc(void *dst, const void *src, int size)
{
+#ifdef HAVE_ICONV
char *p = dst;
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--;
}
return dst;
+#else
+ return memcpy(dst, src, size);
+#endif
}
void *
nls_mem_toext(void *dst, const void *src, int size)
{
+#ifdef HAVE_ICONV
char *p = dst;
const char *s = src;
size_t inlen, outlen;
@@ -203,17 +184,20 @@ 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--;
}
return dst;
+#else
+ return memcpy(dst, src, size);
+#endif
}
char *
OpenPOWER on IntegriCloud