summaryrefslogtreecommitdiffhomepage
path: root/patches/musl_compat.local.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/musl_compat.local.patch')
-rw-r--r--patches/musl_compat.local.patch116
1 files changed, 116 insertions, 0 deletions
diff --git a/patches/musl_compat.local.patch b/patches/musl_compat.local.patch
new file mode 100644
index 00000000..1e4d6af3
--- /dev/null
+++ b/patches/musl_compat.local.patch
@@ -0,0 +1,116 @@
+diff --git a/bin/iconv.c b/bin/iconv.c
+deleted file mode 100644
+index f5d5ce2..0000000
+--- a/bin/iconv.c
++++ /dev/null
+@@ -1,110 +0,0 @@
+-/*
+- * iconv.c
+- * Implementation of SUSv4 XCU iconv utility
+- * Copyright © 2011 Rich Felker
+- * Licensed under the terms of the GNU General Public License, v2 or later
+- */
+-
+-#include <stdlib.h>
+-#include <stdio.h>
+-#include <iconv.h>
+-#include <locale.h>
+-#include <langinfo.h>
+-#include <unistd.h>
+-#include <errno.h>
+-#include <string.h>
+-
+-int main(int argc, char **argv)
+-{
+- const char *from=0, *to=0;
+- int b;
+- iconv_t cd;
+- char buf[BUFSIZ];
+- char outbuf[BUFSIZ*4];
+- char *in, *out;
+- size_t inb;
+- size_t l;
+- size_t unitsize=0;
+- int err=0;
+- FILE *f;
+-
+- while ((b = getopt(argc, argv, "f:t:csl")) != EOF) switch(b) {
+- case 'l':
+- puts("UTF-8, UTF-16BE, UTF-16LE, UTF-32BE, UTF32-LE, UCS-2BE, UCS-2LE, WCHAR_T,\n"
+- "US_ASCII, ISO8859-1, ISO8859-2, ISO8859-3, ISO8859-4, ISO8859-5,\n"
+- "ISO8859-6, ISO8859-7, ...");
+- exit(0);
+- case 'c': case 's': break;
+- case 'f': from=optarg; break;
+- case 't': to=optarg; break;
+- default: exit(1);
+- }
+-
+- if (!from || !to) {
+- setlocale(LC_CTYPE, "");
+- if (!to) to = nl_langinfo(CODESET);
+- if (!from) from = nl_langinfo(CODESET);
+- }
+- cd = iconv_open(to, from);
+- if (cd == (iconv_t)-1) {
+- if (iconv_open(to, "WCHAR_T") == (iconv_t)-1)
+- fprintf(stderr, "iconv: destination charset %s: ", to);
+- else
+- fprintf(stderr, "iconv: source charset %s: ", from);
+- perror("");
+- exit(1);
+- }
+- if (optind == argc) argv[argc++] = "-";
+-
+- for (; optind < argc; optind++) {
+- if (argv[optind][0]=='-' && !argv[optind][1]) {
+- f = stdin;
+- argv[optind] = "(stdin)";
+- } else if (!(f = fopen(argv[optind], "rb"))) {
+- fprintf(stderr, "iconv: %s: ", argv[optind]);
+- perror("");
+- err = 1;
+- continue;
+- }
+- inb = 0;
+- for (;;) {
+- in = buf;
+- out = outbuf;
+- l = fread(buf+inb, 1, sizeof(buf)-inb, f);
+- inb += l;
+- if (!inb) break;
+- if (iconv(cd, &in, &inb, &out, (size_t [1]){sizeof outbuf})==-1
+- && errno == EILSEQ) {
+- if (!unitsize) {
+- wchar_t wc='0';
+- char dummy[4], *dummyp=dummy;
+- iconv_t cd2 = iconv_open(from, "WCHAR_T");
+- if (cd == (iconv_t)-1) {
+- unitsize = 1;
+- } else {
+- iconv(cd2,
+- (char *[1]){(char *)&wc},
+- (size_t[1]){1},
+- &dummyp, (size_t[1]){4});
+- unitsize = dummyp-dummy;
+- if (!unitsize) unitsize=1;
+- }
+- }
+- inb-=unitsize;
+- in+=unitsize;
+- }
+- if (inb && !l && errno==EINVAL) break;
+- if (out>outbuf && !fwrite(outbuf, out-outbuf, 1, stdout)) {
+- perror("iconv: write error");
+- exit(1);
+- }
+- if (inb) memmove(buf, in, inb);
+- }
+- if (ferror(f)) {
+- fprintf(stderr, "iconv: %s: ", argv[optind]);
+- perror("");
+- err = 1;
+- }
+- }
+- return err;
+-}