static void cache_store (const char *host, struct address_list *al) { if (!host_name_addresses_map) host_name_addresses_map = make_nocase_string_hash_table (0); ++al->refcount; hash_table_put (host_name_addresses_map, xstrdup_lower (host), al); IF_DEBUG { int i; debug_logprintf ("Caching %s =>", host); for (i = 0; i < al->count; i++) debug_logprintf (" %s", print_address (al->addresses + i)); debug_logprintf ("\n"); } }
static void cache_host_lookup (const char *host, struct address_list *al) { if (!host_name_addresses_map) host_name_addresses_map = make_nocase_string_hash_table (0); ++al->refcount; hash_table_put (host_name_addresses_map, xstrdup_lower (host), al); #ifdef ENABLE_DEBUG if (opt.debug) { int i; debug_logprintf ("Caching %s =>", host); for (i = 0; i < al->count; i++) debug_logprintf (" %s", pretty_print_address (al->addresses + i)); debug_logprintf ("\n"); } #endif }
/* Do the conversion according to the passed conversion descriptor cd. *out will contain the transcoded string on success. *out content is unspecified otherwise. */ static bool do_conversion (const char *tocode, const char *fromcode, char const *in_org, size_t inlen, char **out) { iconv_t cd; /* sXXXav : hummm hard to guess... */ size_t len, done, outlen; int invalid = 0, tooshort = 0; char *s, *in, *in_save; cd = iconv_open (tocode, fromcode); if (cd == (iconv_t)(-1)) { logprintf (LOG_VERBOSE, _("Conversion from %s to %s isn't supported\n"), quote (fromcode), quote (tocode)); *out = NULL; return false; } /* iconv() has to work on an unescaped string */ in_save = in = xstrndup (in_org, inlen); url_unescape_except_reserved (in); inlen = strlen(in); len = outlen = inlen * 2; *out = s = xmalloc (outlen + 1); done = 0; for (;;) { if (iconv (cd, &in, &inlen, out, &outlen) != (size_t)(-1) && iconv (cd, NULL, NULL, out, &outlen) != (size_t)(-1)) { *out = s; *(s + len - outlen - done) = '\0'; xfree(in_save); iconv_close(cd); IF_DEBUG { /* not not print out embedded passwords, in_org might be an URL */ if (!strchr(in_org, '@') && !strchr(*out, '@')) debug_logprintf ("converted '%s' (%s) -> '%s' (%s)\n", in_org, fromcode, *out, tocode); else debug_logprintf ("%s: logging suppressed, strings may contain password\n", __func__); } return true; } /* Incomplete or invalid multibyte sequence */ if (errno == EINVAL || errno == EILSEQ) { if (!invalid) logprintf (LOG_VERBOSE, _("Incomplete or invalid multibyte sequence encountered\n")); invalid++; **out = *in; in++; inlen--; (*out)++; outlen--; } else if (errno == E2BIG) /* Output buffer full */ { tooshort++; done = len; len = outlen = done + inlen * 2; s = xrealloc (s, outlen + 1); *out = s + done; } else /* Weird, we got an unspecified error */ { logprintf (LOG_VERBOSE, _("Unhandled errno %d\n"), errno); break; } }