aboutsummaryrefslogtreecommitdiff
path: root/toys
diff options
context:
space:
mode:
Diffstat (limited to 'toys')
-rw-r--r--toys/pending/iconv.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/toys/pending/iconv.c b/toys/pending/iconv.c
index a24abcd9..77b80382 100644
--- a/toys/pending/iconv.c
+++ b/toys/pending/iconv.c
@@ -4,7 +4,7 @@
*
* See http://pubs.opengroup.org/onlinepubs/9699919799/utilities/iconv.html
-USE_ICONV(NEWTOY(iconv, "t:f:", TOYFLAG_USR|TOYFLAG_BIN))
+USE_ICONV(NEWTOY(iconv, "cst:f:", TOYFLAG_USR|TOYFLAG_BIN))
config ICONV
bool "iconv"
@@ -38,16 +38,19 @@ static void do_iconv(int fd, char *name)
do {
size_t outleft = 2048;
- char *in = toybuf, *out = outstart;
+ char *in = toybuf+inleft, *out = outstart;
- len = read(fd, toybuf+inleft, 2048-inleft);
+ len = read(fd, in, 2048-inleft);
- if (len < 0) perror_msg("read '%s'");
+ if (len < 0) {
+ perror_msg("read '%s'");
+ return;
+ }
inleft += len;
do {
if (iconv(TT.ic, &in, &inleft, &out, &outleft) == -1
- && (errno == EILSEQ || (in == toybuf && errno == EINVAL)))
+ && (errno == EILSEQ || (in == toybuf+inleft-len && errno == EINVAL)))
{
if (outleft) {
// Skip first byte of illegal sequence to avoid endless loops