--- sourceforge.net/trunk/rdesktop/rdesktop.c 2004/08/09 13:50:41 747 +++ sourceforge.net/trunk/rdesktop/rdesktop.c 2005/03/13 13:36:04 857 @@ -1,7 +1,7 @@ /* -*- c-basic-offset: 8 -*- rdesktop: A Remote Desktop Protocol client. Entrypoint and utility functions - Copyright (C) Matthew Chapman 1999-2003 + Copyright (C) Matthew Chapman 1999-2005 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,6 +30,15 @@ #include #include "rdesktop.h" +#ifdef HAVE_ICONV +#ifdef HAVE_LOCALE_H +#include +#endif +#ifdef HAVE_LANGINFO_H +#include +#endif +#endif + #ifdef EGD_SOCKET #include /* socket connect */ #include /* sockaddr_un */ @@ -49,6 +58,8 @@ absolute value specifies the percent of the whole screen. */ int g_height = 600; +int g_xpos = 0; +int g_ypos = 0; extern int g_tcp_port_rdp; int g_server_bpp = 8; int g_win_button_size = 0; /* If zero, disable single app mode */ @@ -59,7 +70,8 @@ BOOL g_bitmap_cache_precache = True; BOOL g_encryption = True; BOOL packet_encryption = True; -BOOL g_desktop_save = True; +BOOL g_desktop_save = True; /* desktop save order */ +BOOL g_polygon_ellipse_orders = True; /* polygon / ellipse orders */ BOOL g_fullscreen = False; BOOL g_grab_keyboard = True; BOOL g_hide_decorations = False; @@ -76,6 +88,10 @@ BOOL g_rdpsnd = False; #endif +#ifdef HAVE_ICONV +char g_codepage[16] = ""; +#endif + extern RDPDR_DEVICE g_rdpdr_device[]; extern uint32 g_num_devices; extern char *g_rdpdr_clientname; @@ -92,7 +108,7 @@ usage(char *program) { fprintf(stderr, "rdesktop: A Remote Desktop Protocol client.\n"); - fprintf(stderr, "Version " VERSION ". Copyright (C) 1999-2003 Matt Chapman.\n"); + fprintf(stderr, "Version " VERSION ". Copyright (C) 1999-2005 Matt Chapman.\n"); fprintf(stderr, "See http://www.rdesktop.org/ for more information.\n\n"); fprintf(stderr, "Usage: %s [options] server[:port]\n", program); @@ -110,6 +126,9 @@ fprintf(stderr, " -g: desktop geometry (WxH)\n"); fprintf(stderr, " -f: full-screen mode\n"); fprintf(stderr, " -b: force bitmap updates\n"); +#ifdef HAVE_ICONV + fprintf(stderr, " -L: local codepage\n"); +#endif fprintf(stderr, " -B: use BackingStore of X-server (if available)\n"); fprintf(stderr, " -e: disable encryption (French TS)\n"); fprintf(stderr, " -E: disable encryption from client to server\n"); @@ -122,6 +141,7 @@ fprintf(stderr, " -N: enable numlock syncronization\n"); fprintf(stderr, " -X: embed into another window with a given id.\n"); fprintf(stderr, " -a: connection colour depth\n"); + fprintf(stderr, " -z: enable rdp compression\n"); fprintf(stderr, " -x: RDP5 experience (m[odem 28.8], b[roadband], l[an] or hex nr.)\n"); fprintf(stderr, " -P: use persistent bitmap caching\n"); fprintf(stderr, " -r: enable specified device redirection (this flag can be repeated)\n"); @@ -363,7 +383,7 @@ #endif while ((c = getopt(argc, argv, - VNCOPT "u:d:s:c:p:n:k:g:fbBeEmCDKS:T:NX:a:x:Pr:045h?")) != -1) + VNCOPT "u:L:d:s:c:p:n:k:g:fbBeEmzCDKS:T:NX:a:x:Pr:045h?")) != -1) { switch (c) { @@ -386,6 +406,14 @@ username_option = 1; break; + case 'L': +#ifdef HAVE_ICONV + STRNCPY(g_codepage, optarg, sizeof(g_codepage)); +#else + error("iconv support not available\n"); +#endif + break; + case 'd': STRNCPY(domain, optarg, sizeof(domain)); break; @@ -438,7 +466,7 @@ } if (*p == 'x') - g_height = strtol(p + 1, NULL, 10); + g_height = strtol(p + 1, &p, 10); if (g_height <= 0) { @@ -447,7 +475,16 @@ } if (*p == '%') + { g_width = -g_width; + p++; + } + + if (*p == '+' || *p == '-') + g_xpos = strtol(p, &p, 10); + + if (*p == '+' || *p == '-') + g_ypos = strtol(p, NULL, 10); break; @@ -524,8 +561,12 @@ } break; - case 'x': + case 'z': + DEBUG(("rdp compression enabled\n")); + flags |= RDP_COMPRESSION; + break; + case 'x': if (strncmp("modem", optarg, 1) == 0) { g_rdp5_performanceflags = @@ -659,6 +700,20 @@ STRNCPY(g_username, pw->pw_name, sizeof(g_username)); } +#ifdef HAVE_ICONV + if (g_codepage[0] == 0) + { + if (setlocale(LC_CTYPE, "")) + { + STRNCPY(g_codepage, nl_langinfo(CODESET), sizeof(g_codepage)); + } + else + { + STRNCPY(g_codepage, DEFAULT_CODEPAGE, sizeof(g_codepage)); + } + } +#endif + if (g_hostname[0] == 0) { if (gethostname(fullhostname, sizeof(fullhostname)) == -1) @@ -674,6 +729,12 @@ STRNCPY(g_hostname, fullhostname, sizeof(g_hostname)); } + if ((flags & RDP_COMPRESSION) && (g_server_bpp > 8)) + { + warning("rdp compression not supported for bpp > 8, compression disabled\n"); + flags ^= RDP_COMPRESSION; + } + if (prompt_password && read_password(password, sizeof(password))) flags |= RDP_LOGON_AUTO; @@ -847,7 +908,11 @@ void * xrealloc(void *oldmem, int size) { - void *mem = realloc(oldmem, size); + void *mem; + + if (size < 1) + size = 1; + mem = realloc(oldmem, size); if (mem == NULL) { error("xrealloc %d\n", size);