38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* -*- c-basic-offset: 8 -*-
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync rdesktop: A Remote Desktop Protocol client.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync Entrypoint and utility functions
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync Copyright (C) Matthew Chapman <matthewc.unsw.edu.au> 1999-2008
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync Copyright 2002-2011 Peter Astrand <astrand@cendio.se> for Cendio AB
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync Copyright 2010-2014 Henrik Andersson <hean01@cendio.se> for Cendio AB
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync This program is free software: you can redistribute it and/or modify
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync it under the terms of the GNU General Public License as published by
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync the Free Software Foundation, either version 3 of the License, or
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (at your option) any later version.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync This program is distributed in the hope that it will be useful,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync but WITHOUT ANY WARRANTY; without even the implied warranty of
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync GNU General Public License for more details.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync You should have received a copy of the GNU General Public License
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync along with this program. If not, see <http://www.gnu.org/licenses/>.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Oracle GPL Disclaimer: For the avoidance of doubt, except that if any license choice
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * other than GPL or LGPL is available it will apply instead, Oracle elects to use only
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * the General Public License version 2 (GPLv2) at this time for any software where
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * a choice of GPL license versions is made available with the language indicating
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * that GPLv2 or any later version may be used, or where a choice of which version
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * of the GPL is applied is otherwise unspecified.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <unistd.h> /* read close getuid getgid getpid getppid gethostname */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* Reconnect timeout based on approxiamted cookie life-time */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define RDESKTOP_LICENSE_STORE "/.local/share/rdesktop/licenses"
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncunsigned int g_keylayout = 0x409; /* Defaults to US keyboard layout */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint g_keyboard_type = 0x4; /* Defaults to US keyboard layout */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint g_keyboard_subtype = 0x0; /* Defaults to US keyboard layout */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint g_keyboard_functionkeys = 0xc; /* Defaults to US keyboard layout */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint g_sizeopt = 0; /* If non-zero, a special size has been
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync requested. If 1, the geometry will be fetched
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync from _NET_WORKAREA. If negative, absolute value
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync specifies the percent of the whole screen. */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync 1 specified,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync 2 xpos neg,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync 4 ypos neg */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint g_win_button_size = 0; /* If zero, disable single app mode */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL g_desktop_save = True; /* desktop save order */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL g_polygon_ellipse_orders = True; /* polygon / ellipse orders */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRDP_VERSION g_rdp_version = RDP_V5; /* Default to version 5 */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#else /* VBOX */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* Always use numlock synchronization with VRDP. */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* VBOX */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL g_ownbackstore = True; /* We can't rely on external BackingStore */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync RDP5_NO_WALLPAPER | RDP5_NO_FULLWINDOWDRAG | RDP5_NO_MENUANIMATIONS | RDP5_NO_CURSOR_SHADOW;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* Session Directory redirection */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncchar *g_sc_csp_name = NULL; /* Smartcard CSP name */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncrdp2vnc_connect(char *server, uint32 flags, char *domain, char *password,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* Display usage information */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, "rdesktop: A Remote Desktop Protocol client.\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Version " PACKAGE_VERSION ". Copyright (C) 1999-2011 Matthew Chapman et al.\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, "Modified for VirtualBox by " VBOX_VENDOR "\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, "See http://www.rdesktop.org/ for more information.\n\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, "Usage: %s [options] server[:port]\n", program);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -s: shell / seamless application to start remotly\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -k: keyboard layout on server (en-us, de, sv, etc.)\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -i: enables smartcard authentication, password is used as pin\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -A: path to SeamlessRDP shell, this enables SeamlessRDP mode\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -B: use BackingStore of X-server (if available)\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -e: disable encryption (French TS)\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -E: disable encryption from client to server\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -m: do not send motion events\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -D: hide window manager decorations\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -K: keep window manager key bindings\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -S: caption button size (single application mode)\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -t: disable use of remote ctrl\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -N: enable numlock syncronization\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -X: embed into another window with a given id.\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -x: RDP5 experience (m[odem 28.8], b[roadband], l[an] or hex nr.)\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -P: use persistent bitmap caching\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -r: enable specified device redirection (this flag can be repeated)\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync " '-r comport:COM1=/dev/ttyS0': enable serial redirection of /dev/ttyS0 to COM1\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " or COM1=/dev/ttyS0,COM2=/dev/ttyS1\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync " '-r disk:floppy=/mnt/floppy': enable redirection of /mnt/floppy to 'floppy' share\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " or 'floppy=/mnt/floppy,cdrom=/mnt/cdrom'\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " '-r clientname=<client name>': Set the client name displayed\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync " '-r lptport:LPT1=/dev/lp0': enable parallel redirection of /dev/lp0 to LPT1\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " or LPT1=/dev/lp0,LPT2=/dev/lp1\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " '-r printer:mydeskjet': enable printer redirection\n");
2ffab3589d8afc899993678567d1a7c339ac3f1avboxsync " or mydeskjet=\"HP LaserJet IIIP\" to enter server driver as well\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync " '-r sound:[local[:driver[:device]]|off|remote]': enable sound redirection\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " remote would leave sound on server\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " available drivers for 'local':\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync " '-r usb': enable USB redirection\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync " '-r clipboard:[off|PRIMARYCLIPBOARD|CLIPBOARD]': enable clipboard\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync " 'PRIMARYCLIPBOARD' looks at both PRIMARY and CLIPBOARD\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " when sending data to server.\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " 'CLIPBOARD' looks at only CLIPBOARD.\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " '-r scard[:\"Scard Name\"=\"Alias Name[;Vendor Name]\"[,...]]\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " example: -r scard:\"eToken PRO 00 00\"=\"AKS ifdh 0\"\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync " \"eToken PRO 00 00\" -> Device in Linux/Unix enviroment\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync " \"AKS ifdh 0\" -> Device shown in Windows enviroment \n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " example: -r scard:\"eToken PRO 00 00\"=\"AKS ifdh 0;AKS\"\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync " \"eToken PRO 00 00\" -> Device in Linux/Unix enviroment\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync " \"AKS ifdh 0\" -> Device shown in Windows enviroment \n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync " \"AKS\" -> Device vendor name \n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -5: use RDP version 5 (default)\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -H keep-virtual-desktop-shortcuts: Keep keyboard shortcuts typical\n"
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync " for switching virtual desktops (C-A-Left/Right). \n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -o: name=value: Adds an additional option to rdesktop.\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync " sc-csp-name Specifies the Crypto Service Provider name which\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync " is used to authenticate the user by smartcard\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync " sc-container-name Specifies the container name, this is usally the username\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " sc-reader-name Smartcard reader name to use\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync " sc-card-name Specifies the card name of the smartcard to use\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynchandle_disconnect_reason(RD_BOOL deactivated, uint16 reason)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync text = "The server denied the connection for security reason";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync text = "The user cannot connect to the server due to insufficient access privileges.";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync text = "The server does not accept saved user credentials and requires that the user enter their credentials for each connection.";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync text = "Disconnect initiated by administration tool";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync text = "Hardware id doesn't match software license";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync text = "The server is not licensed to accept remote connections";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* strip final newline */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (*p++ == ':')
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* numeric IPv6 style address format - [1:2:3::4]:port */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* remove the port number and brackets from the address */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* dns name or IPv4 style address format - server.example.com:port or 1.2.3.4:port */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#else /* no IPv6 support */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* IPv6 */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* This disables iprt logging */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* Client program */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Set locale according to environment */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Ignore SIGPIPE, since we are using popen() */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* setup default flags for TS_INFO_PACKET */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync flags = RDP_INFO_MOUSE | RDP_INFO_DISABLECTRLALTDEL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync | RDP_INFO_UNICODE | RDP_INFO_MAXIMIZESHELL | RDP_INFO_ENABLEWINDOWSKEY;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_seamless_spawn_cmd[0] = domain[0] = g_password[0] = shell[0] = directory[0] = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync VNCOPT VDHOPT "A:u:L:d:s:c:p:n:k:g:o:fbBeEitmzCDKS:T:NX:a:x:Pr:045h?")) != -1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync STRNCPY(g_seamless_shell, optarg, sizeof(g_seamless_shell));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* try to overwrite argument so it won't appear in ps */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *(p++) = 'X';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync STRNCPY(g_keymapname, optarg, sizeof(g_keymapname));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (*p == 'x')
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (*p == '%')
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync flags |= (RDP_INFO_COMPRESSION | RDP_INFO_COMPRESSION2);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (str_startswith(optarg, "b")) /* broadband */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* -r disk:h:=/mnt/floppy */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_rdpdr_clientname = xmalloc(strlen(optarg + 11) + 1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync warning("Unknown -r argument\n\n\tPossible arguments are: comport, disk, lptport, printer, sound, clipboard, scard\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync warning("Skipping option '%s' specified, lacks name=value format.\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (strncmp(optarg, "sc-csp-name", strlen("sc-scp-name")) ==
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!strcmp(optarg, "keep-virtual-desktop-shortcuts"))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync error("Unknown -H argument\n\n\tPossible argument is: keep-virtual-desktop-shortcuts\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync STRNCPY(g_seamless_spawn_cmd, shell, sizeof(g_seamless_spawn_cmd));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync error("You cannot use -S and -A at the same time\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_rdp5_performanceflags &= ~RDP5_NO_FULLWINDOWDRAG;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync error("You cannot use -g and -A at the same time\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync error("You cannot use -f and -A at the same time\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync error("You cannot use -D and -A at the same time\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync error("You cannot use -X and -A at the same time\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync error("You cannot use -4 and -A at the same time\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* +1 for trailing \0 */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync STRNCPY(g_codepage, nl_langinfo(CODESET), sizeof(g_codepage));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync STRNCPY(g_codepage, DEFAULT_CODEPAGE, sizeof(g_codepage));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (gethostname(fullhostname, sizeof(fullhostname)) == -1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync error("could not determine local hostname, use -n\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync STRNCPY(g_hostname, fullhostname, sizeof(g_hostname));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, "Autoselected keyboard map %s\n", g_keymapname);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync STRNCPY(g_keymapname, "en-us", sizeof(g_keymapname));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (prompt_password && read_password(g_password, sizeof(g_password)))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (g_title[0] == 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync strncat(g_title, server, sizeof(g_title) - sizeof("rdesktop - "));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync rdp2vnc_connect(server, flags, domain, g_password, shell, directory);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Only startup ctrl functionality is seamless are used for now. */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "rdesktop in slave mode sending command to master process.\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ctrl_send_command("seamless.spawn", g_seamless_spawn_cmd);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stdout, "No command specified to be spawn in seamless mode.\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync STRNCPY(domain, g_redirect_domain, sizeof(domain));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_username = (char *) xmalloc(strlen(g_redirect_username) + 1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync STRNCPY(g_username, g_redirect_username, strlen(g_redirect_username) + 1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync STRNCPY(server, g_redirect_server, sizeof(server));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, "Redirected to %s@%s session %d.\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_redirect_username, g_redirect_server, g_redirect_session_id);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* A redirect on SSL from a 2003 WTS will result in a 'connection reset by peer'
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync and therefor we just clear this error before we connect to redirected server.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (server, flags, domain, g_password, shell, directory, g_reconnect_loop))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* check if auto reconnect cookie has timed out */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (time(NULL) - g_reconnect_random_ts > RECONNECT_TIMEOUT)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, "Tried to reconnect for %d minutes, giving up.\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* By setting encryption to False here, we have an encrypted login
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync packet but unencrypted transfer of other packets */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* handle network error and start autoreconnect */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Disconnected due to network error, retrying to reconnect for %d minutes.\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Enter a reconnect loop if we have a pending resize request */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return handle_disconnect_reason(deactivated, ext_disc_reason);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* Read 32 random bytes from PRNGD or EGD socket (based on OpenSSL RAND_egd) */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync memcpy(addr.sun_path, EGD_SOCKET, sizeof(EGD_SOCKET));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (connect(fd, (struct sockaddr *) &addr, sizeof(addr)) == -1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* PRNGD and EGD use a simple communications protocol */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buf[0] = 1; /* Non-blocking (similar to /dev/urandom) */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buf[1] = 32; /* Number of requested random bytes */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((read(fd, buf, 1) != 1) || (buf[0] == 0)) /* Available? */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* Generate a 32-byte random for the secure transport code. */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* If we have a kernel random device, try that first */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (n == 32)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* As a second preference use an EGD */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Otherwise use whatever entropy we can gather - ideas welcome. */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync r[2] = times(&tmsbuf); /* system uptime (clocks) */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync gettimeofday((struct timeval *) &r[3], NULL); /* sec and usec */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Hash both halves with MD5 to obscure possible patterns */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* malloc; exit if out of memory */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* Exit on NULL pointer. Use to verify result from XGetImage etc */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync error("unexpected null pointer. Out of memory?\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* strdup */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* realloc; exit if out of memory */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* report an error */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* report a warning */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* report an unimplemented protocol feature */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* produce a hex dump */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync for (i = 0; i < thisline; i++)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync for (; i < 16; i++)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync for (i = 0; i < thisline; i++)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync printf("%c", (line[i] >= 0x20 && line[i] < 0x7f) ? line[i] : '.');
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync input: src is the string we look in for needle.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync Needle may be escaped by a backslash, in
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync that case we ignore that particular needle.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return value: returns next src pointer, for
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync succesive executions, like in a while loop
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if retval is 0, then there are no more args.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync src is modified. 0x00 chars are inserted to
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync terminate strings.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return val, points on the next val chr after ins
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync example usage:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while( (pos = next_arg( optarg, ',')) ){
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync printf("%s\n",optarg);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync optarg=pos;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* skip escaped needles */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* found backslashed needle */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* move string one to the left */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* more args available */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* no more args after this, jump to EOS */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *p = toupper((int) *p);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* Split input into lines, and call linehandler for each
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync line. Incomplete lines are saved in the rest variable, which should
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync initially point to NULL. When linehandler returns False, stop and
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return False. Otherwise, return True. */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstr_handle_lines(const char *input, char **rest, str_handle_lines_t linehandler, void *data)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Copy data to buffer */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Save in rest */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* Execute the program specified by argv. For each line in
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync stdout/stderr output, call linehandler. Returns false on failure. */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncsubprocess(char *const argv[], str_handle_lines_t linehandler, void *data)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Child */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Close read end */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Redirect stdout and stderr to pipe */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Execute */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Parent. Close write end. */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while (n > 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync str_handle_lines(output, &rest, linehandler, data);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* not all clibs got ltoa */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char *head = ret, buf[LTOA_BUFSIZE], *tail = buf + sizeof(buf);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *--tail = (divrem <= 9) ? divrem + '0' : divrem + 'a' - 10;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync sec_hash_sha1_16(ho, hi, g_static_rdesktop_salt_16);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync sec_hash_to_string(hash, sizeof(hash), ho, sizeof(ho));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(path, PATH_MAX, "%s" RDESKTOP_LICENSE_STORE "/%s.cal", home, hash);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* fallback to try reading old license file */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(path, PATH_MAX, "%s/.rdesktop/license.%s", home, g_hostname);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char *home, path[PATH_MAX], tmppath[PATH_MAX], hash[41];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(path, PATH_MAX, "%s" RDESKTOP_LICENSE_STORE, home);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync sec_hash_sha1_16(ho, hi, g_static_rdesktop_salt_16);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync sec_hash_to_string(hash, sizeof(hash), ho, sizeof(ho));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* write licence to {sha1}.cal.new, then atomically
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync rename to {sha1}.cal */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(path, PATH_MAX, "%s" RDESKTOP_LICENSE_STORE "/%s.cal", home, hash);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fd = open(tmppath, O_WRONLY | O_CREAT | O_TRUNC, 0600);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* create rdesktop ui */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* only create a window if we dont have one intialized */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* Create the bitmap cache directory */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(bmpcache_dir, sizeof(bmpcache_dir), "%s/%s", home, ".rdesktop");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((mkdir(bmpcache_dir, S_IRWXU) == -1) && errno != EEXIST)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(bmpcache_dir, sizeof(bmpcache_dir), "%s/%s", home, ".rdesktop/cache");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync sprintf(bmpcache_dir, "%s/%s", home, ".rdesktop/cache");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((mkdir(bmpcache_dir, S_IRWXU) == -1) && errno != EEXIST)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* open a file in the .rdesktop directory */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(fn, sizeof(fn), "%s/.rdesktop/%s", home, filename);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fd = open(fn, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* close file */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* read from file*/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* write to file */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* move file pointer */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* do a write lock on a file */