- iconv(ic_send, NULL, 0, NULL, 0);
- defer_forwarding_messages++;
- while (len) {
- ICONV_CONST char *ibuf = (ICONV_CONST char *)buf;
- char *obuf = buffer;
- size_t ocnt = sizeof buffer;
- while (len && iconv(ic_send, &ibuf,&len,
- &obuf,&ocnt) == (size_t)-1) {
- if (errno == E2BIG || !ocnt)
- break;
- *obuf++ = *ibuf++;
- ocnt--, len--;
- }
- n = obuf - buffer;
- writefd_unbuffered(fd, buffer, n);
- }
- if (!--defer_forwarding_messages)
- msg_flush();
+ xbuf outbuf, inbuf;
+
+ INIT_CONST_XBUF(outbuf, buffer);
+ INIT_XBUF(inbuf, (char*)buf, len, -1);
+
+ do {
+ iconvbufs(ic_send, &inbuf, &outbuf,
+ ICB_INCLUDE_BAD | ICB_INCLUDE_INCOMPLETE);
+ writefd_unbuffered(fd, outbuf.buf, outbuf.len);
+ } while (inbuf.len);