--- sourceforge.net/trunk/rdesktop/rdesktop.c 2004/11/18 11:18:49 800 +++ sourceforge.net/trunk/rdesktop/rdesktop.c 2005/08/04 12:51:44 975 @@ -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 @@ -27,10 +27,21 @@ #include /* gettimeofday */ #include /* times */ #include /* toupper */ +#include /* PATH_MAX */ #include #include "rdesktop.h" +#ifdef HAVE_LOCALE_H +#include +#endif +#ifdef HAVE_ICONV +#ifdef HAVE_LANGINFO_H +#include +#endif +#endif + #ifdef EGD_SOCKET +#include #include /* socket connect */ #include /* sockaddr_un */ #endif @@ -40,8 +51,11 @@ char g_title[64] = ""; char g_username[64]; char g_hostname[16]; -char keymapname[16]; +char g_keymapname[PATH_MAX] = ""; int g_keylayout = 0x409; /* Defaults to US keyboard layout */ +int g_keyboard_type = 0x4; /* Defaults to US keyboard layout */ +int g_keyboard_subtype = 0x0; /* Defaults to US keyboard layout */ +int g_keyboard_functionkeys = 0xc; /* Defaults to US keyboard layout */ int g_width = 800; /* width is special: If 0, the geometry will be fetched from @@ -51,6 +65,10 @@ int g_height = 600; int g_xpos = 0; int g_ypos = 0; +int g_pos = 0; /* 0 position unspecified, + 1 specified, + 2 xpos neg, + 4 ypos neg */ extern int g_tcp_port_rdp; int g_server_bpp = 8; int g_win_button_size = 0; /* If zero, disable single app mode */ @@ -61,7 +79,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; @@ -78,6 +97,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; @@ -94,7 +117,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); @@ -112,6 +135,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"); @@ -149,7 +175,7 @@ fprintf(stderr, " -5: use RDP version 5 (default)\n"); } -void +static void print_disconnect_reason(uint16 reason) { char *text; @@ -348,13 +374,21 @@ uint32 flags, ext_disc_reason = 0; char *p; int c; - + char *locale = NULL; int username_option = 0; +#ifdef HAVE_LOCALE_H + /* Set locale according to environment */ + locale = setlocale(LC_ALL, ""); + if (locale) + { + locale = xstrdup(locale); + } + +#endif flags = RDP_LOGON_NORMAL; prompt_password = False; domain[0] = password[0] = shell[0] = directory[0] = 0; - strcpy(keymapname, "en-us"); g_embed_wnd = 0; g_num_devices = 0; @@ -366,7 +400,7 @@ #endif while ((c = getopt(argc, argv, - VNCOPT "u:d:s:c:p:n:k:g:fbBeEmzCDKS: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) { @@ -389,6 +423,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; @@ -422,7 +464,7 @@ break; case 'k': - STRNCPY(keymapname, optarg, sizeof(keymapname)); + STRNCPY(g_keymapname, optarg, sizeof(g_keymapname)); break; case 'g': @@ -456,10 +498,16 @@ } if (*p == '+' || *p == '-') + { + g_pos |= (*p == '-') ? 2 : 1; g_xpos = strtol(p, &p, 10); - + + } if (*p == '+' || *p == '-') + { + g_pos |= (*p == '-') ? 4 : 1; g_ypos = strtol(p, NULL, 10); + } break; @@ -523,7 +571,7 @@ break; case 'X': - g_embed_wnd = strtol(optarg, NULL, 10); + g_embed_wnd = strtol(optarg, NULL, 0); break; case 'a': @@ -538,7 +586,7 @@ case 'z': DEBUG(("rdp compression enabled\n")); - flags |= RDP_COMPRESSION; + flags |= (RDP_LOGON_COMPRESSION | RDP_LOGON_COMPRESSION2); break; case 'x': @@ -675,6 +723,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) @@ -690,6 +752,21 @@ STRNCPY(g_hostname, fullhostname, sizeof(g_hostname)); } + if (g_keymapname[0] == 0) + { + if (locale && xkeymap_from_locale(locale)) + { + fprintf(stderr, "Autoselected keyboard map %s\n", g_keymapname); + } + else + { + STRNCPY(g_keymapname, "en-us", sizeof(g_keymapname)); + } + } + if (locale) + xfree(locale); + + if (prompt_password && read_password(password, sizeof(password))) flags |= RDP_LOGON_AUTO; @@ -857,6 +934,19 @@ exit(1); } return mem; +} + +/* strdup */ +char * +xstrdup(const char *s) +{ + char *mem = strdup(s); + if (mem == NULL) + { + perror("strdup"); + exit(1); + } + return mem; } /* realloc; exit if out of memory */