--- sourceforge.net/trunk/rdesktop/rdesktop.c 2003/08/01 17:01:58 438 +++ sourceforge.net/trunk/rdesktop/rdesktop.c 2003/08/21 23:23:15 447 @@ -45,19 +45,19 @@ char hostname[16]; char keymapname[16]; int keylayout = 0x409; /* Defaults to US keyboard layout */ -int width = 800; /* If width or height are reset to zero, the geometry will +int g_width = 800; /* If width or height are reset to zero, the geometry will be fetched from _NET_WORKAREA */ -int height = 600; +int g_height = 600; int tcp_port_rdp = TCP_PORT_RDP; int g_server_bpp = 8; int win_button_size = 0; /* If zero, disable single app mode */ BOOL g_bitmap_compression = True; -BOOL sendmotion = True; +BOOL g_sendmotion = True; BOOL g_orders = True; BOOL g_encryption = True; BOOL packet_encryption = True; BOOL g_desktop_save = True; -BOOL fullscreen = False; +BOOL g_fullscreen = False; BOOL grab_keyboard = True; BOOL hide_decorations = False; BOOL g_use_rdp5 = False; @@ -141,6 +141,54 @@ return ret; } +static void +parse_server_and_port(char *server) +{ + char *p; +#ifdef IPv6 + int addr_colons; +#endif + +#ifdef IPv6 + p = server; + addr_colons = 0; + while (*p) + if (*p++ == ':') + addr_colons++; + if (addr_colons >= 2) + { + /* numeric IPv6 style address format - [1:2:3::4]:port */ + p = strchr(server, ']'); + if (*server == '[' && p != NULL) + { + if (*(p + 1) == ':' && *(p + 2) != '\0') + tcp_port_rdp = strtol(p + 2, NULL, 10); + /* remove the port number and brackets from the address */ + *p = '\0'; + strncpy(server, server + 1, strlen(server)); + } + } + else + { + /* dns name or IPv4 style address format - server.example.com:port or 1.2.3.4:port */ + p = strchr(server, ':'); + if (p != NULL) + { + tcp_port_rdp = strtol(p + 1, NULL, 10); + *p = 0; + } + } +#else /* no IPv6 support */ + p = strchr(server, ':'); + if (p != NULL) + { + tcp_port_rdp = strtol(p + 1, NULL, 10); + *p = 0; + } +#endif /* IPv6 */ + +} + /* Client program */ int main(int argc, char *argv[]) @@ -248,15 +296,15 @@ case 'g': if (!strcmp(optarg, "workarea")) { - width = height = 0; + g_width = g_height = 0; break; } - width = strtol(optarg, &p, 10); + g_width = strtol(optarg, &p, 10); if (*p == 'x') - height = strtol(p + 1, NULL, 10); + g_height = strtol(p + 1, NULL, 10); - if ((width == 0) || (height == 0)) + if ((g_width == 0) || (g_height == 0)) { error("invalid geometry\n"); return 1; @@ -264,7 +312,7 @@ break; case 'f': - fullscreen = True; + g_fullscreen = True; break; case 'b': @@ -278,7 +326,7 @@ packet_encryption = False; break; case 'm': - sendmotion = False; + g_sendmotion = False; break; case 'C': @@ -325,12 +373,7 @@ } STRNCPY(server, argv[optind], sizeof(server)); - p = strchr(server, ':'); - if (p != NULL) - { - tcp_port_rdp = strtol(p + 1, NULL, 10); - *p = 0; - } + parse_server_and_port(server); if (!username_option) {