- for (di=readdir(d); di; di=readdir(d)) {
- char *dname = d_name(di);
- if (strcmp(dname,".")==0 ||
- strcmp(dname,"..")==0)
- continue;
- snprintf(buf, sizeof(buf), "%s/%s", fname, dname);
- if (verbose > 0)
- rprintf(FINFO,"deleting %s\n", buf);
- if (delete_file(buf) != 0) {
- closedir(d);
- return -1;
- }
- }
+/* This function converts the characters in the "in" xbuf into characters
+ * in the "out" xbuf. The "len" of the "in" xbuf is used starting from its
+ * "pos". The "size" of the "out" xbuf restricts how many characters can be
+ * stored, starting at its "pos+len" position. Note that the last byte of
+ * the buffer is never used, which reserves space for a terminating '\0'.
+ * We return a 0 on success or a -1 on error. An error also sets errno to
+ * E2BIG, EILSEQ, or EINVAL (see below); otherwise errno will be set to 0.
+ * The "in" xbuf is altered to update "pos" and "len". The "out" xbuf has
+ * data appended, and its "len" incremented. If ICB_EXPAND_OUT is set in
+ * "flags", the "out" xbuf will also be allocated if empty, and expanded if
+ * too small (so E2BIG will not be returned). If ICB_INCLUDE_BAD is set in
+ * "flags", any badly-encoded chars are included verbatim in the "out" xbuf,
+ * so EILSEQ will not be returned. Likewise for ICB_INCLUDE_INCOMPLETE with
+ * respect to an incomplete multi-byte char at the end, which ensures that
+ * EINVAL is not returned. Anytime "in.pos" is 0 we will reset the iconv()
+ * state prior to processing the characters. */
+int iconvbufs(iconv_t ic, xbuf *in, xbuf *out, int flags)
+{
+ ICONV_CONST char *ibuf;
+ size_t icnt, ocnt;
+ char *obuf;
+
+ if (!out->size && flags & ICB_EXPAND_OUT)
+ alloc_xbuf(out, 1024);