aboutsummaryrefslogtreecommitdiffstats
path: root/log.c
diff options
context:
space:
mode:
authorWayne Davison <wayned@samba.org>2007-09-18 01:11:42 +0000
committerWayne Davison <wayned@samba.org>2007-09-18 01:11:42 +0000
commit2509753fd39168002d3f30a3e6fa882108f9e8af (patch)
tree08456262dfdfab7296be08336ebe7e7ffcab41f7 /log.c
parent5688c74d25002c82091b0b558b3bbea2c2b45614 (diff)
downloadandroid_external_rsync-2509753fd39168002d3f30a3e6fa882108f9e8af.tar.gz
android_external_rsync-2509753fd39168002d3f30a3e6fa882108f9e8af.tar.bz2
android_external_rsync-2509753fd39168002d3f30a3e6fa882108f9e8af.zip
Make use of new iconvbufs() function.
Diffstat (limited to 'log.c')
-rw-r--r--log.c31
1 files changed, 15 insertions, 16 deletions
diff --git a/log.c b/log.c
index f3a3cff1..acb27397 100644
--- a/log.c
+++ b/log.c
@@ -312,26 +312,25 @@ void rwrite(enum logcode code, const char *buf, int len, int is_utf8)
#ifdef ICONV_CONST
if (ic != (iconv_t)-1) {
+ xbuf outbuf, inbuf;
char convbuf[1024];
- ICONV_CONST char *in_buf = (ICONV_CONST char *)buf;
- char *out_buf = convbuf;
- size_t in_cnt = len, out_cnt = sizeof convbuf - 1;
-
- iconv(ic, NULL, 0, NULL, 0);
- while (iconv(ic, &in_buf,&in_cnt,
- &out_buf,&out_cnt) == (size_t)-1) {
- if (out_buf != convbuf) {
- filtered_fwrite(f, convbuf, out_buf - convbuf, 0);
- out_buf = convbuf;
- out_cnt = sizeof convbuf - 1;
+ int ierrno;
+
+ INIT_CONST_XBUF(outbuf, convbuf);
+ INIT_XBUF(inbuf, (char*)buf, len, -1);
+
+ while (inbuf.len) {
+ iconvbufs(ic, &inbuf, &outbuf, 0);
+ ierrno = errno;
+ if (outbuf.len) {
+ filtered_fwrite(f, convbuf, outbuf.len, 0);
+ outbuf.len = 0;
}
- if (errno == E2BIG)
+ if (!ierrno || ierrno == E2BIG)
continue;
- fprintf(f, "\\#%03o", *(uchar*)in_buf++);
- in_cnt--;
+ fprintf(f, "\\#%03o", CVAL(inbuf.buf, inbuf.pos++));
+ inbuf.len--;
}
- if (out_buf != convbuf)
- filtered_fwrite(f, convbuf, out_buf - convbuf, 0);
} else
#endif
filtered_fwrite(f, buf, len, !allow_8bit_chars);