--- sourceforge.net/trunk/rdesktop/rdp.c 2005/03/14 17:47:46 863 +++ sourceforge.net/trunk/rdesktop/rdp.c 2005/03/19 15:30:14 866 @@ -59,6 +59,10 @@ static uint32 g_packetno; #endif +#ifdef HAVE_ICONV +static BOOL g_iconv_works = True; +#endif + /* Receive an RDP packet */ static STREAM rdp_recv(uint8 * type) @@ -157,53 +161,68 @@ #ifdef HAVE_ICONV size_t ibl = strlen(string), obl = len + 2; static iconv_t iconv_h = (iconv_t) - 1; - char *pin = string, *pout = s->p; + char *pin = string, *pout = (char *)s->p; memset(pout, 0, len + 4); - if (iconv_h == (iconv_t) - 1) + if (g_iconv_works) { - size_t i = 1, o = 4; - if ((iconv_h = iconv_open(WINDOWS_CODEPAGE, g_codepage)) == (iconv_t) - 1) + if (iconv_h == (iconv_t) - 1) { - printf("rdp_out_unistr: iconv_open[%s -> %s] fail %d\n", - g_codepage, WINDOWS_CODEPAGE, (int) iconv_h); - return; + size_t i = 1, o = 4; + if ((iconv_h = iconv_open(WINDOWS_CODEPAGE, g_codepage)) == (iconv_t) - 1) + { + warning("rdp_out_unistr: iconv_open[%s -> %s] fail %d\n", + g_codepage, WINDOWS_CODEPAGE, (int) iconv_h); + + g_iconv_works = False; + rdp_out_unistr(s, string, len); + return; + } + if (iconv(iconv_h, (ICONV_CONST char **) &pin, &i, &pout, &o) == + (size_t) - 1) + { + iconv_close(iconv_h); + iconv_h = (iconv_t) - 1; + warning("rdp_out_unistr: iconv(1) fail, errno %d\n", errno); + + g_iconv_works = False; + rdp_out_unistr(s, string, len); + return; + } + pin = string; + pout = (char *) s->p; } - if (iconv(iconv_h, (ICONV_CONST char **) &pin, &i, &pout, &o) == (size_t) - 1) + + if (iconv(iconv_h, (ICONV_CONST char **) &pin, &ibl, &pout, &obl) == (size_t) - 1) { iconv_close(iconv_h); iconv_h = (iconv_t) - 1; - printf("rdp_out_unistr: iconv(1) fail, errno %d\n", errno); + warning("rdp_out_unistr: iconv(2) fail, errno %d\n", errno); + + g_iconv_works = False; + rdp_out_unistr(s, string, len); return; } - pin = string; - pout = (char *) s->p; - } - if (iconv(iconv_h, (ICONV_CONST char **) &pin, &ibl, &pout, &obl) == (size_t) - 1) - { - iconv_close(iconv_h); - iconv_h = (iconv_t) - 1; - printf("rdp_out_unistr: iconv(2) fail, errno %d\n", errno); - return; - } + s->p += len + 2; - s->p += len + 2; + } + else +#endif + { + int i = 0, j = 0; -#else /* HAVE_ICONV undef */ - int i = 0, j = 0; + len += 2; - len += 2; + while (i < len) + { + s->p[i++] = string[j++]; + s->p[i++] = 0; + } - while (i < len) - { - s->p[i++] = string[j++]; - s->p[i++] = 0; + s->p += len; } - - s->p += len; -#endif } /* Input a string in Unicode @@ -215,38 +234,47 @@ { #ifdef HAVE_ICONV size_t ibl = uni_len, obl = uni_len; - char *pin = s->p, *pout = string; + char *pin = (char *)s->p, *pout = string; static iconv_t iconv_h = (iconv_t) - 1; - if (iconv_h == (iconv_t) - 1) + if (g_iconv_works) { - if ((iconv_h = iconv_open(g_codepage, WINDOWS_CODEPAGE)) == (iconv_t) - 1) + if (iconv_h == (iconv_t) - 1) { - printf("rdp_in_unistr: iconv_open[%s -> %s] fail %d\n", - WINDOWS_CODEPAGE, g_codepage, (int) iconv_h); - return 0; + if ((iconv_h = iconv_open(g_codepage, WINDOWS_CODEPAGE)) == (iconv_t) - 1) + { + warning("rdp_in_unistr: iconv_open[%s -> %s] fail %d\n", + WINDOWS_CODEPAGE, g_codepage, (int) iconv_h); + + g_iconv_works = False; + return rdp_in_unistr(s, string, uni_len); + } } - } - if (iconv(iconv_h, (ICONV_CONST char **) &pin, &ibl, &pout, &obl) == (size_t) - 1) - { - iconv_close(iconv_h); - iconv_h = (iconv_t) - 1; - printf("rdp_in_unistr: iconv fail, errno %d\n", errno); - return 0; - } - return pout - string; -#else /* HAVE_ICONV undef */ - int i = 0; + if (iconv(iconv_h, (ICONV_CONST char **) &pin, &ibl, &pout, &obl) == (size_t) - 1) + { + iconv_close(iconv_h); + iconv_h = (iconv_t) - 1; + warning("rdp_in_unistr: iconv fail, errno %d\n", errno); - while (i < uni_len / 2) - { - in_uint8a(s, &string[i++], 1); - in_uint8s(s, 1); + g_iconv_works = False; + return rdp_in_unistr(s, string, uni_len); + } + return pout - string; } - - return i - 1; + else #endif + { + int i = 0; + + while (i < uni_len / 2) + { + in_uint8a(s, &string[i++], 1); + in_uint8s(s, 1); + } + + return i - 1; + } } @@ -1178,7 +1206,7 @@ if (mppc_expand(s->p, clen, ctype, &roff, &rlen) == -1) error("error while decompressing packet\n"); - //len -= 18; + /* len -= 18; */ /* allocate memory and copy the uncompressed data into the temporary stream */ ns->data = (uint8 *) xrealloc(ns->data, rlen);