#include "exim.h"
-#ifdef EXPERIMENTAL_INTERNATIONAL
+#ifdef SUPPORT_I18N
#include <idna.h>
#include <punycode.h>
string_localpart_utf8_to_alabel(const uschar * utf8, uschar ** err)
{
size_t ucs4_len;
-punycode_uint * p = (punycode_uint *) stringprep_utf8_to_ucs4(CCS utf8, -1, &ucs4_len);
-size_t p_len = ucs4_len*4; /* this multiplier is pure guesswork */
-uschar * res = store_get(p_len+5);
+punycode_uint * p;
+size_t p_len;
+uschar * res;
int rc;
+if (!string_is_utf8(utf8)) return string_copy(utf8);
+
+p = (punycode_uint *) stringprep_utf8_to_ucs4(CCS utf8, -1, &ucs4_len);
+p_len = ucs4_len*4; /* this multiplier is pure guesswork */
+res = store_get(p_len+5);
+
res[0] = 'x'; res[1] = 'n'; res[2] = res[3] = '-';
-if ((rc = punycode_encode(ucs4_len, p, NULL, &p_len, res+4)) != PUNYCODE_SUCCESS)
+if ((rc = punycode_encode(ucs4_len, p, NULL, &p_len, CS res+4)) != PUNYCODE_SUCCESS)
{
DEBUG(D_expand) debug_printf("l_u2a: bad '%s'\n", punycode_strerror(rc));
free(p);
uschar *
string_localpart_alabel_to_utf8(const uschar * alabel, uschar ** err)
{
-size_t p_len = strlen(alabel);
+size_t p_len = Ustrlen(alabel);
punycode_uint * p;
uschar * s;
uschar * res;
return NULL;
}
-s = stringprep_ucs4_to_utf8(p, p_len, NULL, &p_len);
+s = US stringprep_ucs4_to_utf8(p, p_len, NULL, &p_len);
res = string_copyn(s, p_len);
free(s);
return res;
uschar * l;
uschar * d;
+if (!*utf8) return string_copy(utf8);
+
+DEBUG(D_expand) debug_printf("addr from utf8 <%s>", utf8);
+
for (s = utf8; *s; s++)
if (*s == '@')
{
l = string_copyn(utf8, s - utf8);
- return (l = string_localpart_utf8_to_alabel(l, err), err && *err)
- || (d = string_domain_utf8_to_alabel(++s, err), err && *err)
- ? NULL
- : string_sprintf("%s@%s", l, d);
+ if ( (l = string_localpart_utf8_to_alabel(l, err), err && *err)
+ || (d = string_domain_utf8_to_alabel(++s, err), err && *err)
+ )
+ return NULL;
+ l = string_sprintf("%s@%s", l, d);
+ DEBUG(D_expand) debug_printf(" -> <%s>\n", l);
+ return l;
}
-return string_localpart_utf8_to_alabel(utf8, err);
+
+l = string_localpart_utf8_to_alabel(utf8, err);
+DEBUG(D_expand) debug_printf(" -> <%s>\n", l);
+return l;
}