- icnt = msg_bytes > sizeof iconv_buf
- ? sizeof iconv_buf : msg_bytes;
- read_loop(fd, iconv_buf, icnt);
- if (!(msg_bytes -= icnt) && !iconv_buf[icnt-1])
- icnt--, add_null = 1;
- ibuf = (ICONV_CONST char *)iconv_buf;
- if (iconv(ic_send, &ibuf,&icnt,
- &obuf,&ocnt) == (size_t)-1)
- goto overflow; // XXX
+ inbuf.len = msg_bytes > sizeof ibuf
+ ? sizeof ibuf : msg_bytes;
+ read_loop(fd, inbuf.buf, inbuf.len);
+ if (!(msg_bytes -= inbuf.len)
+ && !ibuf[inbuf.len-1])
+ inbuf.len--, add_null = 1;
+ if (iconvbufs(ic_send, &inbuf, &outbuf,
+ ICB_INCLUDE_BAD | ICB_INCLUDE_INCOMPLETE) < 0)
+ goto overflow;
+ pos = -1;
+ }
+ if (add_null) {
+ if (outbuf.len == outbuf.size)
+ goto overflow;
+ outbuf.buf[outbuf.len++] = '\0';