}
if (len) {
char *f = x.buf + x.pos;
- char *t = f; /* Keep any non-zero offset to avoid iconv reset. */
+ char *t = x.buf;
char *eob = f + len;
/* Eliminate any multi-'\0' runs. */
while (f != eob) {
if (filesfrom_convert) {
/* TODO would it help to translate each string between nulls separately? */
x.len = len;
- iconvbufs(ic_send, &x, &iobuf.out, ICB_INCLUDE_BAD|ICB_INCLUDE_INCOMPLETE|ICB_CIRCULAR_OUT);
+ iconvbufs(ic_send, &x, &iobuf.out, ICB_INCLUDE_BAD|ICB_INCLUDE_INCOMPLETE|ICB_CIRCULAR_OUT|ICB_INIT);
} else
#endif
if (len) {
len = iobuf.msg.len;
iconvbufs(ic_send, &inbuf, &iobuf.msg,
- ICB_INCLUDE_BAD | ICB_INCLUDE_INCOMPLETE | ICB_CIRCULAR_OUT);
+ ICB_INCLUDE_BAD | ICB_INCLUDE_INCOMPLETE | ICB_CIRCULAR_OUT | ICB_INIT);
if (inbuf.len > 0) {
rprintf(FERROR, "overflowed iobuf.msg buffer in send_msg");
exit_cleanup(RERR_UNSUPPORTED);
iconv_buf.pos = 0;
iconv_buf.len = s - iconv_buf.buf;
iconvbufs(ic_recv, &iconv_buf, &outbuf,
- ICB_INCLUDE_BAD | ICB_INCLUDE_INCOMPLETE);
+ ICB_INCLUDE_BAD | ICB_INCLUDE_INCOMPLETE | ICB_INIT);
outbuf.buf[outbuf.len] = '\0';
return outbuf.len;
}
INIT_XBUF(inbuf, ibuf, 0, (size_t)-1);
while (msg_bytes) {
+ inbuf.pos = 0;
inbuf.len = msg_bytes > sizeof ibuf ? sizeof ibuf : msg_bytes;
memcpy(inbuf.buf, perform_io(inbuf.len, PIO_INPUT_AND_CONSUME), 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)
+ ICB_INCLUDE_BAD | ICB_INCLUDE_INCOMPLETE | ICB_INIT) < 0)
goto overflow;
}
if (add_null) {