summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/iconv.h2
-rw-r--r--lib/libc/Makefile5
-rw-r--r--lib/libc/iconv/Makefile.inc6
-rw-r--r--lib/libc/iconv/__iconv.c (renamed from lib/libc_nonshared/__iconv.c)0
-rw-r--r--lib/libc/iconv/__iconv_free_list.c (renamed from lib/libc_nonshared/__iconv_free_list.c)0
-rw-r--r--lib/libc/iconv/__iconv_get_list.c (renamed from lib/libc_nonshared/__iconv_get_list.c)0
-rw-r--r--lib/libc/iconv/bsd_iconv.c318
-rw-r--r--lib/libc/iconv/citrus_iconv_local.h1
-rw-r--r--lib/libc/iconv/iconv.c287
-rw-r--r--lib/libc/iconv/iconv_canonicalize.c (renamed from lib/libc_nonshared/iconv_canonicalize.c)0
-rw-r--r--lib/libc/iconv/iconv_close.c (renamed from lib/libc_nonshared/iconv_close.c)0
-rw-r--r--lib/libc/iconv/iconv_open.c (renamed from lib/libc_nonshared/iconv_open.c)0
-rw-r--r--lib/libc/iconv/iconv_open_into.c (renamed from lib/libc_nonshared/iconv_open_into.c)0
-rw-r--r--lib/libc/iconv/iconv_set_relocation_prefix.c (renamed from lib/libc_nonshared/iconv_set_relocation_prefix.c)0
-rw-r--r--lib/libc/iconv/iconvctl.327
-rw-r--r--lib/libc/iconv/iconvctl.c (renamed from lib/libc_nonshared/iconvctl.c)0
-rw-r--r--lib/libc/iconv/iconvlist.c (renamed from lib/libc_nonshared/iconvlist.c)0
-rw-r--r--lib/libc_nonshared/Makefile11
-rw-r--r--lib/libc_nonshared/Makefile.iconv9
-rw-r--r--lib/libc_nonshared/iconv.c39
20 files changed, 379 insertions, 326 deletions
diff --git a/include/iconv.h b/include/iconv.h
index da1036a..c07d02e 100644
--- a/include/iconv.h
+++ b/include/iconv.h
@@ -86,6 +86,8 @@ void iconv_set_relocation_prefix(const char *, const char *);
#define ICONV_SET_DISCARD_ILSEQ 4
#define ICONV_SET_HOOKS 5
#define ICONV_SET_FALLBACKS 6
+#define ICONV_GET_ILSEQ_INVALID 128
+#define ICONV_SET_ILSEQ_INVALID 129
typedef void (*iconv_unicode_char_hook) (unsigned int mbr, void *data);
typedef void (*iconv_wide_char_hook) (wchar_t wc, void *data);
diff --git a/lib/libc/Makefile b/lib/libc/Makefile
index 2806cc7..04235a2 100644
--- a/lib/libc/Makefile
+++ b/lib/libc/Makefile
@@ -50,6 +50,9 @@ LDADD+= -lgcc
LDADD+= -lssp_nonshared
.endif
+# Extras that live in either libc.a or libc_nonshared.a
+LIBC_NONSHARED_SRCS=
+
# Define (empty) variables so that make doesn't give substitution
# errors if the included makefiles don't change these:
MDSRCS=
@@ -114,6 +117,8 @@ CFLAGS+= -DNS_CACHING
CFLAGS+=-D_FREEFALL_CONFIG
.endif
+STATICOBJS+=${LIBC_NONSHARED_SRCS:S/.c$/.o/}
+
VERSION_DEF=${.CURDIR}/Versions.def
SYMBOL_MAPS=${SYM_MAPS}
CFLAGS+= -DSYMBOL_VERSIONING
diff --git a/lib/libc/iconv/Makefile.inc b/lib/libc/iconv/Makefile.inc
index 0e83902..98012ed 100644
--- a/lib/libc/iconv/Makefile.inc
+++ b/lib/libc/iconv/Makefile.inc
@@ -14,5 +14,9 @@ SRCS+= citrus_bcs.c citrus_bcs_strtol.c citrus_bcs_strtoul.c \
citrus_esdb.c citrus_hash.c citrus_iconv.c citrus_lookup.c \
citrus_lookup_factory.c citrus_mapper.c citrus_memstream.c \
citrus_mmap.c citrus_module.c citrus_none.c citrus_pivot_factory.c \
- citrus_prop.c citrus_stdenc.c iconv.c iconv_compat.c
+ citrus_prop.c citrus_stdenc.c bsd_iconv.c iconv_compat.c
SYM_MAPS+= ${.CURDIR}/iconv/Symbol.map
+
+.if ${MK_ICONV} == yes
+.include "${.CURDIR}/../libc_nonshared/Makefile.iconv"
+.endif
diff --git a/lib/libc_nonshared/__iconv.c b/lib/libc/iconv/__iconv.c
index c9bee3f..c9bee3f 100644
--- a/lib/libc_nonshared/__iconv.c
+++ b/lib/libc/iconv/__iconv.c
diff --git a/lib/libc_nonshared/__iconv_free_list.c b/lib/libc/iconv/__iconv_free_list.c
index de9701e..de9701e 100644
--- a/lib/libc_nonshared/__iconv_free_list.c
+++ b/lib/libc/iconv/__iconv_free_list.c
diff --git a/lib/libc_nonshared/__iconv_get_list.c b/lib/libc/iconv/__iconv_get_list.c
index 437d413..437d413 100644
--- a/lib/libc_nonshared/__iconv_get_list.c
+++ b/lib/libc/iconv/__iconv_get_list.c
diff --git a/lib/libc/iconv/bsd_iconv.c b/lib/libc/iconv/bsd_iconv.c
new file mode 100644
index 0000000..40a1a4e
--- /dev/null
+++ b/lib/libc/iconv/bsd_iconv.c
@@ -0,0 +1,318 @@
+/* $FreeBSD$ */
+/* $NetBSD: iconv.c,v 1.11 2009/03/03 16:22:33 explorer Exp $ */
+
+/*-
+ * Copyright (c) 2003 Citrus Project,
+ * Copyright (c) 2009, 2010 Gabor Kovesdan <gabor@FreeBSD.org>,
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#include <sys/queue.h>
+#include <sys/types.h>
+
+#include <assert.h>
+#include <errno.h>
+#include <iconv.h>
+#include <limits.h>
+#include <paths.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "citrus_types.h"
+#include "citrus_module.h"
+#include "citrus_esdb.h"
+#include "citrus_hash.h"
+#include "citrus_iconv.h"
+
+#include "iconv-internal.h"
+
+#define ISBADF(_h_) (!(_h_) || (_h_) == (iconv_t)-1)
+
+static iconv_t
+__bsd___iconv_open(const char *out, const char *in, struct _citrus_iconv *handle)
+{
+ const char *out_slashes;
+ char *out_noslashes;
+ int ret;
+
+ /*
+ * Remove anything following a //, as these are options (like
+ * //ignore, //translate, etc) and we just don't handle them.
+ * This is for compatibility with software that uses these
+ * blindly.
+ */
+ out_slashes = strstr(out, "//");
+ if (out_slashes != NULL) {
+ out_noslashes = strndup(out, out_slashes - out);
+ if (out_noslashes == NULL) {
+ errno = ENOMEM;
+ return ((iconv_t)-1);
+ }
+ ret = _citrus_iconv_open(&handle, in, out_noslashes);
+ free(out_noslashes);
+ } else {
+ ret = _citrus_iconv_open(&handle, in, out);
+ }
+
+ if (ret) {
+ errno = ret == ENOENT ? EINVAL : ret;
+ return ((iconv_t)-1);
+ }
+
+ handle->cv_shared->ci_discard_ilseq = strcasestr(out, "//IGNORE");
+ handle->cv_shared->ci_hooks = NULL;
+
+ return ((iconv_t)(void *)handle);
+}
+
+iconv_t
+__bsd_iconv_open(const char *out, const char *in)
+{
+
+ return (__bsd___iconv_open(out, in, NULL));
+}
+
+int
+__bsd_iconv_open_into(const char *out, const char *in, iconv_allocation_t *ptr)
+{
+ struct _citrus_iconv *handle;
+
+ handle = (struct _citrus_iconv *)ptr;
+ return ((__bsd___iconv_open(out, in, handle) == (iconv_t)-1) ? -1 : 0);
+}
+
+int
+__bsd_iconv_close(iconv_t handle)
+{
+
+ if (ISBADF(handle)) {
+ errno = EBADF;
+ return (-1);
+ }
+
+ _citrus_iconv_close((struct _citrus_iconv *)(void *)handle);
+
+ return (0);
+}
+
+size_t
+__bsd_iconv(iconv_t handle, const char **in, size_t *szin, char **out, size_t *szout)
+{
+ size_t ret;
+ int err;
+
+ if (ISBADF(handle)) {
+ errno = EBADF;
+ return ((size_t)-1);
+ }
+
+ err = _citrus_iconv_convert((struct _citrus_iconv *)(void *)handle,
+ in, szin, out, szout, 0, &ret);
+ if (err) {
+ errno = err;
+ ret = (size_t)-1;
+ }
+
+ return (ret);
+}
+
+size_t
+__bsd___iconv(iconv_t handle, const char **in, size_t *szin, char **out,
+ size_t *szout, uint32_t flags, size_t *invalids)
+{
+ size_t ret;
+ int err;
+
+ if (ISBADF(handle)) {
+ errno = EBADF;
+ return ((size_t)-1);
+ }
+
+ err = _citrus_iconv_convert((struct _citrus_iconv *)(void *)handle,
+ in, szin, out, szout, flags, &ret);
+ if (invalids)
+ *invalids = ret;
+ if (err) {
+ errno = err;
+ ret = (size_t)-1;
+ }
+
+ return (ret);
+}
+
+int
+__bsd___iconv_get_list(char ***rlist, size_t *rsz, bool sorted)
+{
+ int ret;
+
+ ret = _citrus_esdb_get_list(rlist, rsz, sorted);
+ if (ret) {
+ errno = ret;
+ return (-1);
+ }
+
+ return (0);
+}
+
+void
+__bsd___iconv_free_list(char **list, size_t sz)
+{
+
+ _citrus_esdb_free_list(list, sz);
+}
+
+/*
+ * GNU-compatibile non-standard interfaces.
+ */
+static int
+qsort_helper(const void *first, const void *second)
+{
+ const char * const *s1;
+ const char * const *s2;
+
+ s1 = first;
+ s2 = second;
+ return (strcmp(*s1, *s2));
+}
+
+void
+__bsd_iconvlist(int (*do_one) (unsigned int, const char * const *,
+ void *), void *data)
+{
+ char **list, **names;
+ const char * const *np;
+ char *curitem, *curkey, *slashpos;
+ size_t sz;
+ unsigned int i, j;
+
+ i = 0;
+
+ if (__bsd___iconv_get_list(&list, &sz, true))
+ list = NULL;
+ qsort((void *)list, sz, sizeof(char *), qsort_helper);
+ while (i < sz) {
+ j = 0;
+ slashpos = strchr(list[i], '/');
+ curkey = (char *)malloc(slashpos - list[i] + 2);
+ names = (char **)malloc(sz * sizeof(char *));
+ if ((curkey == NULL) || (names == NULL)) {
+ __bsd___iconv_free_list(list, sz);
+ return;
+ }
+ strlcpy(curkey, list[i], slashpos - list[i] + 1);
+ names[j++] = strdup(curkey);
+ for (; (i < sz) && (memcmp(curkey, list[i], strlen(curkey)) == 0); i++) {
+ slashpos = strchr(list[i], '/');
+ curitem = (char *)malloc(strlen(slashpos) + 1);
+ if (curitem == NULL) {
+ __bsd___iconv_free_list(list, sz);
+ return;
+ }
+ strlcpy(curitem, &slashpos[1], strlen(slashpos) + 1);
+ if (strcmp(curkey, curitem) == 0) {
+ continue;
+ }
+ names[j++] = strdup(curitem);
+ }
+ np = (const char * const *)names;
+ do_one(j, np, data);
+ free(names);
+ }
+
+ __bsd___iconv_free_list(list, sz);
+}
+
+__inline const char *
+__bsd_iconv_canonicalize(const char *name)
+{
+
+ return (_citrus_iconv_canonicalize(name));
+}
+
+int
+__bsd_iconvctl(iconv_t cd, int request, void *argument)
+{
+ struct _citrus_iconv *cv;
+ struct iconv_hooks *hooks;
+ const char *convname;
+ char src[PATH_MAX], *dst;
+ int *i;
+
+ cv = (struct _citrus_iconv *)(void *)cd;
+ hooks = (struct iconv_hooks *)argument;
+ i = (int *)argument;
+
+ if (ISBADF(cd)) {
+ errno = EBADF;
+ return (-1);
+ }
+
+ switch (request) {
+ case ICONV_TRIVIALP:
+ convname = cv->cv_shared->ci_convname;
+ dst = strchr(convname, '/');
+
+ strlcpy(src, convname, dst - convname + 1);
+ dst++;
+ if ((convname == NULL) || (src == NULL) || (dst == NULL))
+ return (-1);
+ *i = strcmp(src, dst) == 0 ? 1 : 0;
+ return (0);
+ case ICONV_GET_TRANSLITERATE:
+ *i = 1;
+ return (0);
+ case ICONV_SET_TRANSLITERATE:
+ return ((*i == 1) ? 0 : -1);
+ case ICONV_GET_DISCARD_ILSEQ:
+ *i = cv->cv_shared->ci_discard_ilseq ? 1 : 0;
+ return (0);
+ case ICONV_SET_DISCARD_ILSEQ:
+ cv->cv_shared->ci_discard_ilseq = *i;
+ return (0);
+ case ICONV_SET_HOOKS:
+ cv->cv_shared->ci_hooks = hooks;
+ return (0);
+ case ICONV_SET_FALLBACKS:
+ errno = EOPNOTSUPP;
+ return (-1);
+ case ICONV_GET_ILSEQ_INVALID:
+ *i = cv->cv_shared->ci_ilseq_invalid ? 1 : 0;
+ return (0);
+ case ICONV_SET_ILSEQ_INVALID:
+ cv->cv_shared->ci_ilseq_invalid = *i;
+ return (0);
+ default:
+ errno = EINVAL;
+ return (-1);
+ }
+}
+
+void
+__bsd_iconv_set_relocation_prefix(const char *orig_prefix __unused,
+ const char *curr_prefix __unused)
+{
+
+}
diff --git a/lib/libc/iconv/citrus_iconv_local.h b/lib/libc/iconv/citrus_iconv_local.h
index e673c9a..12d2fa3 100644
--- a/lib/libc/iconv/citrus_iconv_local.h
+++ b/lib/libc/iconv/citrus_iconv_local.h
@@ -99,6 +99,7 @@ struct _citrus_iconv_shared {
char *ci_convname;
bool ci_discard_ilseq;
struct iconv_hooks *ci_hooks;
+ bool ci_ilseq_invalid;
};
struct _citrus_iconv {
diff --git a/lib/libc/iconv/iconv.c b/lib/libc/iconv/iconv.c
index 555efd8..d13c1df 100644
--- a/lib/libc/iconv/iconv.c
+++ b/lib/libc/iconv/iconv.c
@@ -1,9 +1,5 @@
-/* $FreeBSD$ */
-/* $NetBSD: iconv.c,v 1.11 2009/03/03 16:22:33 explorer Exp $ */
-
/*-
- * Copyright (c) 2003 Citrus Project,
- * Copyright (c) 2009, 2010 Gabor Kovesdan <gabor@FreeBSD.org>,
+ * Copyright (c) 2013 Peter Wemm
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -26,287 +22,18 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
+ *
+ * $FreeBSD$
*/
-#include <sys/cdefs.h>
-#include <sys/queue.h>
#include <sys/types.h>
-
-#include <assert.h>
-#include <errno.h>
#include <iconv.h>
-#include <limits.h>
-#include <paths.h>
-#include <stdbool.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "citrus_types.h"
-#include "citrus_module.h"
-#include "citrus_esdb.h"
-#include "citrus_hash.h"
-#include "citrus_iconv.h"
-
#include "iconv-internal.h"
-#define ISBADF(_h_) (!(_h_) || (_h_) == (iconv_t)-1)
-
-static iconv_t
-__bsd___iconv_open(const char *out, const char *in, struct _citrus_iconv *handle)
-{
- const char *out_slashes;
- char *out_noslashes;
- int ret;
-
- /*
- * Remove anything following a //, as these are options (like
- * //ignore, //translate, etc) and we just don't handle them.
- * This is for compatibility with software that uses these
- * blindly.
- */
- out_slashes = strstr(out, "//");
- if (out_slashes != NULL) {
- out_noslashes = strndup(out, out_slashes - out);
- if (out_noslashes == NULL) {
- errno = ENOMEM;
- return ((iconv_t)-1);
- }
- ret = _citrus_iconv_open(&handle, in, out_noslashes);
- free(out_noslashes);
- } else {
- ret = _citrus_iconv_open(&handle, in, out);
- }
-
- if (ret) {
- errno = ret == ENOENT ? EINVAL : ret;
- return ((iconv_t)-1);
- }
-
- handle->cv_shared->ci_discard_ilseq = strcasestr(out, "//IGNORE");
- handle->cv_shared->ci_hooks = NULL;
-
- return ((iconv_t)(void *)handle);
-}
-
-iconv_t
-__bsd_iconv_open(const char *out, const char *in)
-{
-
- return (__bsd___iconv_open(out, in, NULL));
-}
-
-int
-__bsd_iconv_open_into(const char *out, const char *in, iconv_allocation_t *ptr)
-{
- struct _citrus_iconv *handle;
-
- handle = (struct _citrus_iconv *)ptr;
- return ((__bsd___iconv_open(out, in, handle) == (iconv_t)-1) ? -1 : 0);
-}
-
-int
-__bsd_iconv_close(iconv_t handle)
-{
-
- if (ISBADF(handle)) {
- errno = EBADF;
- return (-1);
- }
-
- _citrus_iconv_close((struct _citrus_iconv *)(void *)handle);
-
- return (0);
-}
-
size_t
-__bsd_iconv(iconv_t handle, const char **in, size_t *szin, char **out, size_t *szout)
-{
- size_t ret;
- int err;
-
- if (ISBADF(handle)) {
- errno = EBADF;
- return ((size_t)-1);
- }
-
- err = _citrus_iconv_convert((struct _citrus_iconv *)(void *)handle,
- in, szin, out, szout, 0, &ret);
- if (err) {
- errno = err;
- ret = (size_t)-1;
- }
-
- return (ret);
-}
-
-size_t
-__bsd___iconv(iconv_t handle, const char **in, size_t *szin, char **out,
- size_t *szout, uint32_t flags, size_t *invalids)
-{
- size_t ret;
- int err;
-
- if (ISBADF(handle)) {
- errno = EBADF;
- return ((size_t)-1);
- }
-
- err = _citrus_iconv_convert((struct _citrus_iconv *)(void *)handle,
- in, szin, out, szout, flags, &ret);
- if (invalids)
- *invalids = ret;
- if (err) {
- errno = err;
- ret = (size_t)-1;
- }
-
- return (ret);
-}
-
-int
-__bsd___iconv_get_list(char ***rlist, size_t *rsz, bool sorted)
-{
- int ret;
-
- ret = _citrus_esdb_get_list(rlist, rsz, sorted);
- if (ret) {
- errno = ret;
- return (-1);
- }
-
- return (0);
-}
-
-void
-__bsd___iconv_free_list(char **list, size_t sz)
-{
-
- _citrus_esdb_free_list(list, sz);
-}
-
-/*
- * GNU-compatibile non-standard interfaces.
- */
-static int
-qsort_helper(const void *first, const void *second)
-{
- const char * const *s1;
- const char * const *s2;
-
- s1 = first;
- s2 = second;
- return (strcmp(*s1, *s2));
-}
-
-void
-__bsd_iconvlist(int (*do_one) (unsigned int, const char * const *,
- void *), void *data)
+iconv(iconv_t a, const char ** __restrict b,
+ size_t * __restrict c, char ** __restrict d,
+ size_t * __restrict e)
{
- char **list, **names;
- const char * const *np;
- char *curitem, *curkey, *slashpos;
- size_t sz;
- unsigned int i, j;
-
- i = 0;
-
- if (__bsd___iconv_get_list(&list, &sz, true))
- list = NULL;
- qsort((void *)list, sz, sizeof(char *), qsort_helper);
- while (i < sz) {
- j = 0;
- slashpos = strchr(list[i], '/');
- curkey = (char *)malloc(slashpos - list[i] + 2);
- names = (char **)malloc(sz * sizeof(char *));
- if ((curkey == NULL) || (names == NULL)) {
- __bsd___iconv_free_list(list, sz);
- return;
- }
- strlcpy(curkey, list[i], slashpos - list[i] + 1);
- names[j++] = strdup(curkey);
- for (; (i < sz) && (memcmp(curkey, list[i], strlen(curkey)) == 0); i++) {
- slashpos = strchr(list[i], '/');
- curitem = (char *)malloc(strlen(slashpos) + 1);
- if (curitem == NULL) {
- __bsd___iconv_free_list(list, sz);
- return;
- }
- strlcpy(curitem, &slashpos[1], strlen(slashpos) + 1);
- if (strcmp(curkey, curitem) == 0) {
- continue;
- }
- names[j++] = strdup(curitem);
- }
- np = (const char * const *)names;
- do_one(j, np, data);
- free(names);
- }
-
- __bsd___iconv_free_list(list, sz);
-}
-
-__inline const char *
-__bsd_iconv_canonicalize(const char *name)
-{
-
- return (_citrus_iconv_canonicalize(name));
-}
-
-int
-__bsd_iconvctl(iconv_t cd, int request, void *argument)
-{
- struct _citrus_iconv *cv;
- struct iconv_hooks *hooks;
- const char *convname;
- char src[PATH_MAX], *dst;
- int *i;
-
- cv = (struct _citrus_iconv *)(void *)cd;
- hooks = (struct iconv_hooks *)argument;
- i = (int *)argument;
-
- if (ISBADF(cd)) {
- errno = EBADF;
- return (-1);
- }
-
- switch (request) {
- case ICONV_TRIVIALP:
- convname = cv->cv_shared->ci_convname;
- dst = strchr(convname, '/');
-
- strlcpy(src, convname, dst - convname + 1);
- dst++;
- if ((convname == NULL) || (src == NULL) || (dst == NULL))
- return (-1);
- *i = strcmp(src, dst) == 0 ? 1 : 0;
- return (0);
- case ICONV_GET_TRANSLITERATE:
- *i = 1;
- return (0);
- case ICONV_SET_TRANSLITERATE:
- return ((*i == 1) ? 0 : -1);
- case ICONV_GET_DISCARD_ILSEQ:
- *i = cv->cv_shared->ci_discard_ilseq ? 1 : 0;
- return (0);
- case ICONV_SET_DISCARD_ILSEQ:
- cv->cv_shared->ci_discard_ilseq = *i;
- return (0);
- case ICONV_SET_HOOKS:
- cv->cv_shared->ci_hooks = hooks;
- return (0);
- case ICONV_SET_FALLBACKS:
- errno = EOPNOTSUPP;
- return (-1);
- default:
- errno = EINVAL;
- return (-1);
- }
-}
-
-void
-__bsd_iconv_set_relocation_prefix(const char *orig_prefix __unused,
- const char *curr_prefix __unused)
-{
-
+ return __bsd_iconv(a, b, c, d, e);
}
diff --git a/lib/libc_nonshared/iconv_canonicalize.c b/lib/libc/iconv/iconv_canonicalize.c
index 702a416..702a416 100644
--- a/lib/libc_nonshared/iconv_canonicalize.c
+++ b/lib/libc/iconv/iconv_canonicalize.c
diff --git a/lib/libc_nonshared/iconv_close.c b/lib/libc/iconv/iconv_close.c
index 1adbb8c..1adbb8c 100644
--- a/lib/libc_nonshared/iconv_close.c
+++ b/lib/libc/iconv/iconv_close.c
diff --git a/lib/libc_nonshared/iconv_open.c b/lib/libc/iconv/iconv_open.c
index f14925c..f14925c 100644
--- a/lib/libc_nonshared/iconv_open.c
+++ b/lib/libc/iconv/iconv_open.c
diff --git a/lib/libc_nonshared/iconv_open_into.c b/lib/libc/iconv/iconv_open_into.c
index 8a1278b..8a1278b 100644
--- a/lib/libc_nonshared/iconv_open_into.c
+++ b/lib/libc/iconv/iconv_open_into.c
diff --git a/lib/libc_nonshared/iconv_set_relocation_prefix.c b/lib/libc/iconv/iconv_set_relocation_prefix.c
index 7615c94..7615c94 100644
--- a/lib/libc_nonshared/iconv_set_relocation_prefix.c
+++ b/lib/libc/iconv/iconv_set_relocation_prefix.c
diff --git a/lib/libc/iconv/iconvctl.3 b/lib/libc/iconv/iconvctl.3
index f012157..5bd06ea 100644
--- a/lib/libc/iconv/iconvctl.3
+++ b/lib/libc/iconv/iconvctl.3
@@ -34,7 +34,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd November 7, 2009
+.Dd November 25, 2009
.Dt ICONVCTL 3
.Os
.Sh NAME
@@ -110,6 +110,31 @@ variable, which is passed to
via
.Fa argument
by its address.
+.It ICONV_GET_ILSEQ_INVALID
+Determines if a character in the input buffer that is valid,
+but for which an identical character does not exist in the target
+codeset returns
+.Er EILSEQ
+or not.
+The answer is stored in
+.Fa argument ,
+which is of
+.Ft int * .
+It will be set to 1 if this feature is enabled or set to 0 otherwise.
+.It ICONV_SET_ILSEQ_INVALID
+Sets whether a character in the input buffer that is valid,
+but for which an identical character does not exist in the target
+codeset returns
+.Er EILSEQ
+or not.
+If
+.Fa argument ,
+which is of
+.Ft int *
+is set to 1 it will be enabled,
+and if
+.Fa argument
+is set to 0 it will be disabled.
.El
.\" XXX: fallbacks are unimplemented and trying to set them will always
.\" return EOPNOTSUPP but definitions are provided for source-level
diff --git a/lib/libc_nonshared/iconvctl.c b/lib/libc/iconv/iconvctl.c
index 50c108c..50c108c 100644
--- a/lib/libc_nonshared/iconvctl.c
+++ b/lib/libc/iconv/iconvctl.c
diff --git a/lib/libc_nonshared/iconvlist.c b/lib/libc/iconv/iconvlist.c
index 418b4a7..418b4a7 100644
--- a/lib/libc_nonshared/iconvlist.c
+++ b/lib/libc/iconv/iconvlist.c
diff --git a/lib/libc_nonshared/Makefile b/lib/libc_nonshared/Makefile
index b5ea5f0..4c2a945 100644
--- a/lib/libc_nonshared/Makefile
+++ b/lib/libc_nonshared/Makefile
@@ -12,16 +12,17 @@ CFLAGS+=${PICFLAG} -DPIC -fvisibility=hidden
LIB= c_nonshared
+LIBC_NONSHARED_SRCS=
+
# So that an empty .a file doesn't cause errors.
SRCS= __stub.c
.if ${MK_ICONV} == "yes"
-SRCS+= __iconv.c __iconv_free_list.c __iconv_get_list.c \
- iconv.c iconv_canonicalize.c iconv_close.c \
- iconv_open.c iconv_open_into.c \
- iconv_set_relocation_prefix.c iconvctl.c iconvlist.c
+.PATH: ${.CURDIR}/../libc/iconv
+.include "Makefile.iconv"
CFLAGS+=-I${.CURDIR}/../libc/iconv
.endif
-.include <bsd.lib.mk>
+SRCS+= ${LIBC_NONSHARED_SRCS}
+.include <bsd.lib.mk>
diff --git a/lib/libc_nonshared/Makefile.iconv b/lib/libc_nonshared/Makefile.iconv
new file mode 100644
index 0000000..8fb1ad9
--- /dev/null
+++ b/lib/libc_nonshared/Makefile.iconv
@@ -0,0 +1,9 @@
+# $FreeBSD$
+
+.if ${MK_ICONV} == "yes"
+LIBC_NONSHARED_SRCS+= \
+ __iconv.c __iconv_free_list.c __iconv_get_list.c \
+ iconv.c iconv_canonicalize.c iconv_close.c \
+ iconv_open.c iconv_open_into.c \
+ iconv_set_relocation_prefix.c iconvctl.c iconvlist.c
+.endif
diff --git a/lib/libc_nonshared/iconv.c b/lib/libc_nonshared/iconv.c
deleted file mode 100644
index d13c1df..0000000
--- a/lib/libc_nonshared/iconv.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/*-
- * Copyright (c) 2013 Peter Wemm
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#include <sys/types.h>
-#include <iconv.h>
-#include "iconv-internal.h"
-
-size_t
-iconv(iconv_t a, const char ** __restrict b,
- size_t * __restrict c, char ** __restrict d,
- size_t * __restrict e)
-{
- return __bsd_iconv(a, b, c, d, e);
-}
OpenPOWER on IntegriCloud