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
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
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
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*/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/*
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 */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <stdarg.h> /* va_list va_start va_end */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <unistd.h> /* read close getuid getgid getpid getppid gethostname */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <fcntl.h> /* open */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <pwd.h> /* getpwuid */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <termios.h> /* tcgetattr tcsetattr */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <sys/stat.h> /* stat */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <sys/time.h> /* gettimeofday */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <sys/times.h> /* times */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <ctype.h> /* toupper */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <limits.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <errno.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <signal.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include "rdesktop.h"
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef VBOX
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync# include <VBox/version.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync# include <iprt/log.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef HAVE_LOCALE_H
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <locale.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef HAVE_ICONV
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef HAVE_LANGINFO_H
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <langinfo.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef EGD_SOCKET
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <sys/types.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <sys/socket.h> /* socket connect */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <sys/un.h> /* sockaddr_un */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include "ssl.h"
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* Reconnect timeout based on approxiamted cookie life-time */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define RECONNECT_TIMEOUT (3600+600)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define RDESKTOP_LICENSE_STORE "/.local/share/rdesktop/licenses"
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncuint8 g_static_rdesktop_salt_16[16] = {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync 0xb8, 0x82, 0x29, 0x31, 0xc5, 0x39, 0xd9, 0x44,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync 0x54, 0x15, 0x5e, 0x14, 0x71, 0x38, 0xd5, 0x4d
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync};
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncchar g_title[64] = "";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncchar *g_username;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncchar g_password[64] = "";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncchar g_hostname[16] = "";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncchar g_keymapname[PATH_MAX] = "";
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. */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint g_width = 800;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint g_height = 600;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint g_xpos = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint g_ypos = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint g_pos = 0; /* 0 position unspecified,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync 1 specified,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync 2 xpos neg,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync 4 ypos neg */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncextern int g_tcp_port_rdp;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint g_server_depth = -1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint g_win_button_size = 0; /* If zero, disable single app mode */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL g_network_error = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL g_bitmap_compression = True;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL g_sendmotion = True;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL g_bitmap_cache = True;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL g_bitmap_cache_persist_enable = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL g_bitmap_cache_precache = True;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL g_use_ctrl = True;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL g_encryption = True;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL g_encryption_initial = True;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL g_packet_encryption = True;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL g_desktop_save = True; /* desktop save order */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL g_polygon_ellipse_orders = True; /* polygon / ellipse orders */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL g_fullscreen = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL g_grab_keyboard = True;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL g_hide_decorations = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRDP_VERSION g_rdp_version = RDP_V5; /* Default to version 5 */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL g_rdpclip = True;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL g_console_session = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifndef VBOX
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL g_numlock_sync = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#else /* VBOX */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* Always use numlock synchronization with VRDP. */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL g_numlock_sync = True;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* VBOX */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL g_lspci_enabled = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL g_owncolmap = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL g_ownbackstore = True; /* We can't rely on external BackingStore */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL g_seamless_rdp = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL g_use_password_as_pin = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncchar g_seamless_shell[512];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncchar g_seamless_spawn_cmd[512];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL g_seamless_persistent_mode = True;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL g_user_quit = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncuint32 g_embed_wnd;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncuint32 g_rdp5_performanceflags =
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync RDP5_NO_WALLPAPER | RDP5_NO_FULLWINDOWDRAG | RDP5_NO_MENUANIMATIONS | RDP5_NO_CURSOR_SHADOW;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* Session Directory redirection */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL g_redirect = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncchar *g_redirect_server;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncuint32 g_redirect_server_len;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncchar *g_redirect_domain;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncuint32 g_redirect_domain_len;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncchar *g_redirect_username;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncuint32 g_redirect_username_len;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncuint8 *g_redirect_lb_info;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncuint32 g_redirect_lb_info_len;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncuint8 *g_redirect_cookie;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncuint32 g_redirect_cookie_len;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncuint32 g_redirect_flags = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncuint32 g_redirect_session_id = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncuint32 g_reconnect_logonid = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncchar g_reconnect_random[16];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynctime_t g_reconnect_random_ts;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL g_has_reconnect_random = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL g_reconnect_loop = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncuint8 g_client_random[SEC_RANDOM_SIZE];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL g_pending_resize = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef WITH_RDPSND
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL g_rdpsnd = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef WITH_RDPUSB
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL g_rdpusb = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef WITH_BIRD_VD_HACKS
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL g_keep_virtual_desktop_shortcuts = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef HAVE_ICONV
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncchar g_codepage[16] = "";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncchar *g_sc_csp_name = NULL; /* Smartcard CSP name */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncchar *g_sc_reader_name = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncchar *g_sc_card_name = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncchar *g_sc_container_name = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncextern RDPDR_DEVICE g_rdpdr_device[];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncextern uint32 g_num_devices;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncextern char *g_rdpdr_clientname;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef RDP2VNC
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncextern int rfb_port;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncextern int defer_time;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncvoid
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncrdp2vnc_connect(char *server, uint32 flags, char *domain, char *password,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char *shell, char *directory);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* Display usage information */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncusage(char *program)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, "rdesktop: A Remote Desktop Protocol client.\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Version " PACKAGE_VERSION ". Copyright (C) 1999-2011 Matthew Chapman et al.\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef VBOX
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, "Modified for VirtualBox by " VBOX_VENDOR "\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, "See http://www.rdesktop.org/ for more information.\n\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, "Usage: %s [options] server[:port]\n", program);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef RDP2VNC
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -V: vnc port\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -Q: defer time (ms)\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -u: user name\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -d: domain\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -s: shell / seamless application to start remotly\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -c: working directory\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -p: password (- to prompt)\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -n: client hostname\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -k: keyboard layout on server (en-us, de, sv, etc.)\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -g: desktop geometry (WxH)\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef WITH_SCARD
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -i: enables smartcard authentication, password is used as pin\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -f: full-screen mode\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -b: force bitmap updates\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef HAVE_ICONV
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -L: local codepage\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
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, " -C: use private colour map\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: window title\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, " -a: connection colour depth\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -z: enable rdp compression\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 fprintf(stderr,
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 fprintf(stderr,
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 fprintf(stderr, " for redirected disks\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr,
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");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr,
2ffab3589d8afc899993678567d1a7c339ac3f1avboxsync " or mydeskjet=\"HP LaserJet IIIP\" to enter server driver as well\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef WITH_RDPSND
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr,
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 rdpsnd_show_help();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef WITH_RDPUSB
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync " '-r usb': enable USB redirection\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync " '-r clipboard:[off|PRIMARYCLIPBOARD|CLIPBOARD]': enable clipboard\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " redirection.\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr,
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#ifdef WITH_SCARD
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 fprintf(stderr,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync " \"eToken PRO 00 00\" -> Device in Linux/Unix enviroment\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr,
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 fprintf(stderr,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync " \"eToken PRO 00 00\" -> Device in Linux/Unix enviroment\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync " \"AKS ifdh 0\" -> Device shown in Windows enviroment \n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync " \"AKS\" -> Device vendor name \n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -0: attach to console\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -4: use RDP version 4\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -5: use RDP version 5 (default)\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef WITH_BIRD_VD_HACKS
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -H keep-virtual-desktop-shortcuts: Keep keyboard shortcuts typical\n"
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync " for switching virtual desktops (C-A-Left/Right). \n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef WITH_SCARD
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, " -o: name=value: Adds an additional option to rdesktop.\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync " sc-csp-name Specifies the Crypto Service Provider name which\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync " is used to authenticate the user by smartcard\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr,
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 fprintf(stderr,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync " sc-card-name Specifies the card name of the smartcard to use\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, "\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynchandle_disconnect_reason(RD_BOOL deactivated, uint16 reason)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char *text;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int retval;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync switch (reason)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case exDiscReasonNoInfo:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync text = "No information available";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (deactivated)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync retval = EX_OK;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync retval = EXRD_UNKNOWN;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case exDiscReasonAPIInitiatedDisconnect:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync text = "Server initiated disconnect";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync retval = EXRD_API_DISCONNECT;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case exDiscReasonAPIInitiatedLogoff:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync text = "Server initiated logoff";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync retval = EXRD_API_LOGOFF;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case exDiscReasonServerIdleTimeout:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync text = "Server idle timeout reached";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync retval = EXRD_IDLE_TIMEOUT;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case exDiscReasonServerLogonTimeout:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync text = "Server logon timeout reached";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync retval = EXRD_LOGON_TIMEOUT;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case exDiscReasonReplacedByOtherConnection:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync text = "The session was replaced";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync retval = EXRD_REPLACED;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case exDiscReasonOutOfMemory:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync text = "The server is out of memory";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync retval = EXRD_OUT_OF_MEM;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case exDiscReasonServerDeniedConnection:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync text = "The server denied the connection";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync retval = EXRD_DENIED;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case exDiscReasonServerDeniedConnectionFips:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync text = "The server denied the connection for security reason";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync retval = EXRD_DENIED_FIPS;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case exDiscReasonServerInsufficientPrivileges:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync text = "The user cannot connect to the server due to insufficient access privileges.";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync retval = EXRD_INSUFFICIENT_PRIVILEGES;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case exDiscReasonServerFreshCredentialsRequired:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync text = "The server does not accept saved user credentials and requires that the user enter their credentials for each connection.";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync retval = EXRD_FRESH_CREDENTIALS_REQUIRED;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case exDiscReasonRPCInitiatedDisconnectByUser:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync text = "Disconnect initiated by administration tool";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync retval = EXRD_RPC_DISCONNECT_BY_USER;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case exDiscReasonByUser:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync text = "Disconnect initiated by user";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync retval = EXRD_DISCONNECT_BY_USER;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case exDiscReasonLicenseInternal:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync text = "Internal licensing error";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync retval = EXRD_LIC_INTERNAL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case exDiscReasonLicenseNoLicenseServer:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync text = "No license server available";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync retval = EXRD_LIC_NOSERVER;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case exDiscReasonLicenseNoLicense:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync text = "No valid license available";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync retval = EXRD_LIC_NOLICENSE;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case exDiscReasonLicenseErrClientMsg:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync text = "Invalid licensing message";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync retval = EXRD_LIC_MSG;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case exDiscReasonLicenseHwidDoesntMatchLicense:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync text = "Hardware id doesn't match software license";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync retval = EXRD_LIC_HWID;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case exDiscReasonLicenseErrClientLicense:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync text = "Client license error";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync retval = EXRD_LIC_CLIENT;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case exDiscReasonLicenseCantFinishProtocol:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync text = "Network error during licensing protocol";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync retval = EXRD_LIC_NET;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case exDiscReasonLicenseClientEndedProtocol:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync text = "Licensing protocol was not completed";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync retval = EXRD_LIC_PROTO;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case exDiscReasonLicenseErrClientEncryption:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync text = "Incorrect client license encryption";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync retval = EXRD_LIC_ENC;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case exDiscReasonLicenseCantUpgradeLicense:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync text = "Can't upgrade license";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync retval = EXRD_LIC_UPGRADE;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case exDiscReasonLicenseNoRemoteConnections:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync text = "The server is not licensed to accept remote connections";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync retval = EXRD_LIC_NOREMOTE;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync default:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (reason > 0x1000 && reason < 0x7fff)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync text = "Internal protocol error";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync text = "Unknown reason";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync retval = EXRD_UNKNOWN;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (reason != exDiscReasonNoInfo)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, "disconnect: %s.\n", text);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return retval;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncrdesktop_reset_state(void)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync rdp_reset_state();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef WITH_SCARD
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync scard_reset_state();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef WITH_RDPSND
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync rdpsnd_reset_state();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic RD_BOOL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncread_password(char *password, int size)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync struct termios tios;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync RD_BOOL ret = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int istty = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char *p;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (tcgetattr(STDIN_FILENO, &tios) == 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, "Password: ");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync tios.c_lflag &= ~ECHO;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync tcsetattr(STDIN_FILENO, TCSANOW, &tios);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync istty = 1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (fgets(password, size, stdin) != NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = True;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* strip final newline */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync p = strchr(password, '\n');
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (p != NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *p = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (istty)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync tios.c_lflag |= ECHO;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync tcsetattr(STDIN_FILENO, TCSANOW, &tios);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, "\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncparse_server_and_port(char *server)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char *p;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef IPv6
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int addr_colons;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef IPv6
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync p = server;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync addr_colons = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while (*p)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (*p++ == ':')
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync addr_colons++;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (addr_colons >= 2)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* numeric IPv6 style address format - [1:2:3::4]:port */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync p = strchr(server, ']');
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (*server == '[' && p != NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (*(p + 1) == ':' && *(p + 2) != '\0')
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_tcp_port_rdp = strtol(p + 2, NULL, 10);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* remove the port number and brackets from the address */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *p = '\0';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync strncpy(server, server + 1, strlen(server));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* dns name or IPv4 style address format - server.example.com:port or 1.2.3.4:port */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync p = strchr(server, ':');
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (p != NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_tcp_port_rdp = strtol(p + 1, NULL, 10);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *p = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#else /* no IPv6 support */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync p = strchr(server, ':');
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (p != NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_tcp_port_rdp = strtol(p + 1, NULL, 10);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *p = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* IPv6 */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef VBOX
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* This disables iprt logging */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncDECLEXPORT(PRTLOGGER) RTLogDefaultInit(void)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* Client program */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncmain(int argc, char *argv[])
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char server[256];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char fullhostname[64];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char domain[256];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char shell[256];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char directory[256];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync RD_BOOL prompt_password, deactivated;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync struct passwd *pw;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync uint32 flags, ext_disc_reason = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char *p;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int c;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char *locale = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int username_option = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync RD_BOOL geometry_option = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef WITH_RDPSND
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char *rdpsnd_optarg = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef HAVE_LOCALE_H
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Set locale according to environment */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync locale = setlocale(LC_ALL, "");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (locale)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync locale = xstrdup(locale);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Ignore SIGPIPE, since we are using popen() */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync struct sigaction act;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync memset(&act, 0, sizeof(act));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync act.sa_handler = SIG_IGN;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync sigemptyset(&act.sa_mask);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync act.sa_flags = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync sigaction(SIGPIPE, &act, NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
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
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync prompt_password = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_seamless_spawn_cmd[0] = domain[0] = g_password[0] = shell[0] = directory[0] = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_embed_wnd = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_num_devices = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef RDP2VNC
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define VNCOPT "V:Q:"
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define VNCOPT
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef WITH_BIRD_VD_HACKS
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define VDHOPT "H:"
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define VDHOPT
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while ((c = getopt(argc, argv,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync VNCOPT VDHOPT "A:u:L:d:s:c:p:n:k:g:o:fbBeEitmzCDKS:T:NX:a:x:Pr:045h?")) != -1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync switch (c)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef RDP2VNC
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'V':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync rfb_port = strtol(optarg, NULL, 10);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (rfb_port < 100)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync rfb_port += 5900;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'Q':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync defer_time = strtol(optarg, NULL, 10);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (defer_time < 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync defer_time = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'A':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_seamless_rdp = True;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync STRNCPY(g_seamless_shell, optarg, sizeof(g_seamless_shell));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'u':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_username = (char *) xmalloc(strlen(optarg) + 1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync STRNCPY(g_username, optarg, strlen(optarg) + 1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync username_option = 1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'L':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef HAVE_ICONV
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync STRNCPY(g_codepage, optarg, sizeof(g_codepage));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync error("iconv support not available\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'd':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync STRNCPY(domain, optarg, sizeof(domain));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 's':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync STRNCPY(shell, optarg, sizeof(shell));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_seamless_persistent_mode = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'c':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync STRNCPY(directory, optarg, sizeof(directory));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'p':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((optarg[0] == '-') && (optarg[1] == 0))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync prompt_password = True;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync STRNCPY(g_password, optarg, sizeof(g_password));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync flags |= RDP_INFO_AUTOLOGON;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* try to overwrite argument so it won't appear in ps */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync p = optarg;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while (*p)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *(p++) = 'X';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef WITH_SCARD
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'i':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync flags |= RDP_INFO_PASSWORD_IS_SC_PIN;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_use_password_as_pin = True;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 't':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_use_ctrl = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'n':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync STRNCPY(g_hostname, optarg, sizeof(g_hostname));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'k':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync STRNCPY(g_keymapname, optarg, sizeof(g_keymapname));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'g':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync geometry_option = True;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_fullscreen = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!strcmp(optarg, "workarea"))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_sizeopt = 1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_width = strtol(optarg, &p, 10);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (g_width <= 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync error("invalid geometry\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return EX_USAGE;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (*p == 'x')
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_height = strtol(p + 1, &p, 10);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (g_height <= 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync error("invalid geometry\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return EX_USAGE;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (*p == '%')
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_sizeopt = -g_width;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_width = 800;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync p++;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (*p == '+' || *p == '-')
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_pos |= (*p == '-') ? 2 : 1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_xpos = strtol(p, &p, 10);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (*p == '+' || *p == '-')
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_pos |= (*p == '-') ? 4 : 1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_ypos = strtol(p, NULL, 10);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'f':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_fullscreen = True;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'b':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_bitmap_cache = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'B':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_ownbackstore = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'e':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_encryption_initial = g_encryption = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'E':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_packet_encryption = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'm':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_sendmotion = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'C':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_owncolmap = True;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'D':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_hide_decorations = True;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'K':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_grab_keyboard = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'S':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!strcmp(optarg, "standard"))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_win_button_size = 18;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_win_button_size = strtol(optarg, &p, 10);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (*p)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync error("invalid button size\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return EX_USAGE;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'T':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync STRNCPY(g_title, optarg, sizeof(g_title));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'N':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_numlock_sync = True;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'X':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_embed_wnd = strtol(optarg, NULL, 0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'a':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_server_depth = strtol(optarg, NULL, 10);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (g_server_depth != 8 &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_server_depth != 16 &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_server_depth != 15 && g_server_depth != 24
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync && g_server_depth != 32)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync error("Invalid server colour depth.\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return EX_USAGE;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'z':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync DEBUG(("rdp compression enabled\n"));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync flags |= (RDP_INFO_COMPRESSION | RDP_INFO_COMPRESSION2);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'x':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (str_startswith(optarg, "m")) /* modem */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_rdp5_performanceflags = RDP5_NO_CURSOR_SHADOW |
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync RDP5_NO_WALLPAPER | RDP5_NO_FULLWINDOWDRAG |
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync RDP5_NO_MENUANIMATIONS | RDP5_NO_THEMING;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (str_startswith(optarg, "b")) /* broadband */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_rdp5_performanceflags =
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync RDP5_NO_CURSOR_SHADOW | RDP5_NO_WALLPAPER;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (str_startswith(optarg, "l")) /* lan */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_rdp5_performanceflags =
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync RDP5_NO_CURSOR_SHADOW | RDP5_DISABLE_NOTHING;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_rdp5_performanceflags =
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync RDP5_NO_CURSOR_SHADOW | strtol(optarg, NULL, 16);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'P':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_bitmap_cache_persist_enable = True;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'r':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (str_startswith(optarg, "sound"))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync optarg += 5;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (*optarg == ':')
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync optarg++;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while ((p = next_arg(optarg, ',')))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (str_startswith(optarg, "remote"))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync flags |= RDP_INFO_REMOTE_CONSOLE_AUDIO;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (str_startswith(optarg, "local"))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef WITH_RDPSND
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync rdpsnd_optarg =
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync next_arg(optarg, ':');
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_rdpsnd = True;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync warning("Not compiled with sound support\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (str_startswith(optarg, "off"))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef WITH_RDPSND
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_rdpsnd = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync warning("Not compiled with sound support\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync optarg = p;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef WITH_RDPSND
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_rdpsnd = True;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync warning("Not compiled with sound support\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (str_startswith(optarg, "usb"))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef WITH_RDPUSB
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_rdpusb = True;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync warning("Not compiled with USB support\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (str_startswith(optarg, "disk"))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* -r disk:h:=/mnt/floppy */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync disk_enum_devices(&g_num_devices, optarg + 4);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (str_startswith(optarg, "comport"))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync serial_enum_devices(&g_num_devices, optarg + 7);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (str_startswith(optarg, "lspci"))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_lspci_enabled = True;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (str_startswith(optarg, "lptport"))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync parallel_enum_devices(&g_num_devices, optarg + 7);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (str_startswith(optarg, "printer"))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync printer_enum_devices(&g_num_devices, optarg + 7);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (str_startswith(optarg, "clientname"))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_rdpdr_clientname = xmalloc(strlen(optarg + 11) + 1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync strcpy(g_rdpdr_clientname, optarg + 11);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (str_startswith(optarg, "clipboard"))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync optarg += 9;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (*optarg == ':')
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync optarg++;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (str_startswith(optarg, "off"))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_rdpclip = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync cliprdr_set_mode(optarg);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_rdpclip = True;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (strncmp("scard", optarg, 5) == 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef WITH_SCARD
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync scard_enum_devices(&g_num_devices, optarg + 5);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync warning("Not compiled with smartcard support\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync warning("Unknown -r argument\n\n\tPossible arguments are: comport, disk, lptport, printer, sound, clipboard, scard\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case '0':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_console_session = True;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case '4':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_rdp_version = RDP_V4;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case '5':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_rdp_version = RDP_V5;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if WITH_SCARD
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'o':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char *p = strchr(optarg, '=');
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (p == NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync warning("Skipping option '%s' specified, lacks name=value format.\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync continue;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (strncmp(optarg, "sc-csp-name", strlen("sc-scp-name")) ==
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_sc_csp_name = strdup(p + 1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (strncmp
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (optarg, "sc-reader-name",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync strlen("sc-reader-name")) == 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_sc_reader_name = strdup(p + 1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (strncmp
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (optarg, "sc-card-name",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync strlen("sc-card-name")) == 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_sc_card_name = strdup(p + 1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (strncmp
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (optarg, "sc-container-name",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync strlen("sc-container-name")) == 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_sc_container_name = strdup(p + 1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef WITH_BIRD_VD_HACKS
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'H': /* hacks */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!strcmp(optarg, "keep-virtual-desktop-shortcuts"))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_keep_virtual_desktop_shortcuts = True;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync error("Unknown -H argument\n\n\tPossible argument is: keep-virtual-desktop-shortcuts\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'h':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case '?':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync default:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync usage(argv[0]);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return EX_USAGE;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (argc - optind != 1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync usage(argv[0]);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return EX_USAGE;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync STRNCPY(server, argv[optind], sizeof(server));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync parse_server_and_port(server);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (g_seamless_rdp)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (shell[0])
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync STRNCPY(g_seamless_spawn_cmd, shell, sizeof(g_seamless_spawn_cmd));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync STRNCPY(shell, g_seamless_shell, sizeof(shell));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (g_win_button_size)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync error("You cannot use -S and -A at the same time\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return EX_USAGE;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_rdp5_performanceflags &= ~RDP5_NO_FULLWINDOWDRAG;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (geometry_option)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync error("You cannot use -g and -A at the same time\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return EX_USAGE;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (g_fullscreen)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync error("You cannot use -f and -A at the same time\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return EX_USAGE;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (g_hide_decorations)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync error("You cannot use -D and -A at the same time\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return EX_USAGE;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (g_embed_wnd)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync error("You cannot use -X and -A at the same time\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return EX_USAGE;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (g_rdp_version < RDP_V5)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync error("You cannot use -4 and -A at the same time\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return EX_USAGE;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_sizeopt = -100;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_grab_keyboard = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!username_option)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync pw = getpwuid(getuid());
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((pw == NULL) || (pw->pw_name == NULL))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync error("could not determine username, use -u\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return EX_OSERR;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* +1 for trailing \0 */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int pwlen = strlen(pw->pw_name) + 1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_username = (char *) xmalloc(pwlen);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync STRNCPY(g_username, pw->pw_name, pwlen);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef HAVE_ICONV
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (g_codepage[0] == 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (setlocale(LC_CTYPE, ""))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync STRNCPY(g_codepage, nl_langinfo(CODESET), sizeof(g_codepage));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync STRNCPY(g_codepage, DEFAULT_CODEPAGE, sizeof(g_codepage));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (g_hostname[0] == 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (gethostname(fullhostname, sizeof(fullhostname)) == -1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync error("could not determine local hostname, use -n\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return EX_OSERR;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync p = strchr(fullhostname, '.');
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (p != NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *p = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync STRNCPY(g_hostname, fullhostname, sizeof(g_hostname));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (g_keymapname[0] == 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (locale && xkeymap_from_locale(locale))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, "Autoselected keyboard map %s\n", g_keymapname);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync STRNCPY(g_keymapname, "en-us", sizeof(g_keymapname));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (locale)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xfree(locale);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (prompt_password && read_password(g_password, sizeof(g_password)))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync flags |= RDP_INFO_AUTOLOGON;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (g_title[0] == 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync strcpy(g_title, "rdesktop - ");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync strncat(g_title, server, sizeof(g_title) - sizeof("rdesktop - "));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef RDP2VNC
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync rdp2vnc_connect(server, flags, domain, g_password, shell, directory);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return EX_OK;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Only startup ctrl functionality is seamless are used for now. */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (g_use_ctrl && g_seamless_rdp)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ctrl_init(server, domain, g_username) < 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync error("Failed to initialize ctrl mode.");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync exit(1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ctrl_is_slave())
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stdout,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "rdesktop in slave mode sending command to master process.\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (g_seamless_spawn_cmd[0])
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ctrl_send_command("seamless.spawn", g_seamless_spawn_cmd);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stdout, "No command specified to be spawn in seamless mode.\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return EX_USAGE;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!ui_init())
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return EX_OSERR;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef WITH_RDPSND
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!rdpsnd_init(rdpsnd_optarg))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync warning("Initializing sound-support failed!\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef WITH_RDPUSB
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (g_rdpusb)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync rdpusb_init();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (g_lspci_enabled)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync lspci_init();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync rdpdr_init();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_reconnect_loop = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while (1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync rdesktop_reset_state();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (g_redirect)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync STRNCPY(domain, g_redirect_domain, sizeof(domain));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xfree(g_username);
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 flags |= RDP_INFO_AUTOLOGON;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, "Redirected to %s@%s session %d.\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_redirect_username, g_redirect_server, g_redirect_session_id);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
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 */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_network_error = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_redirect = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ui_init_connection();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!rdp_connect
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (server, flags, domain, g_password, shell, directory, g_reconnect_loop))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_network_error = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (g_reconnect_loop == False)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return EX_PROTOCOL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* check if auto reconnect cookie has timed out */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (time(NULL) - g_reconnect_random_ts > RECONNECT_TIMEOUT)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, "Tried to reconnect for %d minutes, giving up.\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync RECONNECT_TIMEOUT / 60);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return EX_PROTOCOL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync sleep(4);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync continue;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (g_redirect)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync rdp_disconnect();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync continue;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* By setting encryption to False here, we have an encrypted login
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync packet but unencrypted transfer of other packets */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!g_packet_encryption)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_encryption_initial = g_encryption = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync DEBUG(("Connection successful.\n"));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync rd_create_ui();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync tcp_run_ui(True);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync deactivated = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_reconnect_loop = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync rdp_main_loop(&deactivated, &ext_disc_reason);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync tcp_run_ui(False);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync DEBUG(("Disconnecting...\n"));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync rdp_disconnect();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (g_redirect)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync continue;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* handle network error and start autoreconnect */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (g_network_error && !deactivated)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Disconnected due to network error, retrying to reconnect for %d minutes.\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync RECONNECT_TIMEOUT / 60);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_network_error = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_reconnect_loop = True;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync continue;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ui_seamless_end();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ui_destroy_window();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Enter a reconnect loop if we have a pending resize request */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (g_pending_resize)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_pending_resize = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync g_reconnect_loop = True;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync continue;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync cache_save_state();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ui_deinit();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef WITH_RDPUSB
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (g_rdpusb)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync rdpusb_close();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (g_user_quit)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return EXRD_WINDOW_CLOSED;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return handle_disconnect_reason(deactivated, ext_disc_reason);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (g_redirect_username)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xfree(g_redirect_username);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xfree(g_username);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef EGD_SOCKET
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* Read 32 random bytes from PRNGD or EGD socket (based on OpenSSL RAND_egd) */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic RD_BOOL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncgenerate_random_egd(uint8 * buf)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync struct sockaddr_un addr;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync RD_BOOL ret = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int fd;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fd = socket(AF_UNIX, SOCK_STREAM, 0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (fd == -1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync addr.sun_family = AF_UNIX;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync memcpy(addr.sun_path, EGD_SOCKET, sizeof(EGD_SOCKET));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (connect(fd, (struct sockaddr *) &addr, sizeof(addr)) == -1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync goto err;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
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 (write(fd, buf, 2) != 2)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync goto err;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((read(fd, buf, 1) != 1) || (buf[0] == 0)) /* Available? */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync goto err;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (read(fd, buf, 32) != 32)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync goto err;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = True;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync err:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync close(fd);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* Generate a 32-byte random for the secure transport code. */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncvoid
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncgenerate_random(uint8 * random)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync struct stat st;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync struct tms tmsbuf;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync RDSSL_MD5 md5;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync uint32 *r;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int fd, n;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* If we have a kernel random device, try that first */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (((fd = open("/dev/urandom", O_RDONLY)) != -1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync || ((fd = open("/dev/random", O_RDONLY)) != -1))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync n = read(fd, random, 32);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync close(fd);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (n == 32)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef EGD_SOCKET
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* As a second preference use an EGD */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (generate_random_egd(random))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Otherwise use whatever entropy we can gather - ideas welcome. */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync r = (uint32 *) random;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync r[0] = (getpid()) | (getppid() << 16);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync r[1] = (getuid()) | (getgid() << 16);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync r[2] = times(&tmsbuf); /* system uptime (clocks) */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync gettimeofday((struct timeval *) &r[3], NULL); /* sec and usec */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync stat("/tmp", &st);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync r[5] = st.st_atime;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync r[6] = st.st_mtime;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync r[7] = st.st_ctime;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Hash both halves with MD5 to obscure possible patterns */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync rdssl_md5_init(&md5);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync rdssl_md5_update(&md5, random, 16);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync rdssl_md5_final(&md5, random);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync rdssl_md5_update(&md5, random + 16, 16);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync rdssl_md5_final(&md5, random + 16);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* malloc; exit if out of memory */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncvoid *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmalloc(int size)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync void *mem = malloc(size);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (mem == NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync error("xmalloc %d\n", size);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync exit(EX_UNAVAILABLE);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return mem;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* Exit on NULL pointer. Use to verify result from XGetImage etc */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncvoid
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncexit_if_null(void *ptr)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ptr == NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync error("unexpected null pointer. Out of memory?\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync exit(EX_UNAVAILABLE);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* strdup */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncchar *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxstrdup(const char *s)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char *mem = strdup(s);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (mem == NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync perror("strdup");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync exit(EX_UNAVAILABLE);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return mem;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* realloc; exit if out of memory */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncvoid *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxrealloc(void *oldmem, size_t size)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync void *mem;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (size == 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync size = 1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync mem = realloc(oldmem, size);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (mem == NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync error("xrealloc %ld\n", size);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync exit(EX_UNAVAILABLE);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return mem;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* free */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncvoid
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxfree(void *mem)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync free(mem);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* report an error */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncvoid
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncerror(char *format, ...)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync va_list ap;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, "ERROR: ");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync va_start(ap, format);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync vfprintf(stderr, format, ap);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync va_end(ap);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* report a warning */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncvoid
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncwarning(char *format, ...)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync va_list ap;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, "WARNING: ");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync va_start(ap, format);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync vfprintf(stderr, format, ap);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync va_end(ap);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* report an unimplemented protocol feature */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncvoid
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncunimpl(char *format, ...)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync va_list ap;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, "NOT IMPLEMENTED: ");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync va_start(ap, format);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync vfprintf(stderr, format, ap);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync va_end(ap);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* produce a hex dump */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncvoid
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynchexdump(unsigned char *p, unsigned int len)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync unsigned char *line = p;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int i, thisline, offset = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while (offset < len)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync printf("%04x ", offset);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync thisline = len - offset;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (thisline > 16)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync thisline = 16;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync for (i = 0; i < thisline; i++)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync printf("%02x ", line[i]);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync for (; i < 16; i++)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync printf(" ");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync for (i = 0; i < thisline; i++)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync printf("%c", (line[i] >= 0x20 && line[i] < 0x7f) ? line[i] : '.');
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync printf("\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync offset += thisline;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync line += thisline;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/*
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 pitfalls:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync src is modified. 0x00 chars are inserted to
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync terminate strings.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return val, points on the next val chr after ins
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync 0x00
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync example usage:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while( (pos = next_arg( optarg, ',')) ){
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync printf("%s\n",optarg);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync optarg=pos;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync*/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncchar *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncnext_arg(char *src, char needle)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char *nextval;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char *p;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char *mvp = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* EOS */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (*src == (char) 0x00)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync p = src;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* skip escaped needles */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while ((nextval = strchr(p, needle)))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync mvp = nextval - 1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* found backslashed needle */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (*mvp == '\\' && (mvp > src))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* move string one to the left */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while (*(mvp + 1) != (char) 0x00)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *mvp = *(mvp + 1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync mvp++;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *mvp = (char) 0x00;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync p = nextval;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync p = nextval + 1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* more args available */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (nextval)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *nextval = (char) 0x00;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ++nextval;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* no more args after this, jump to EOS */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync nextval = src + strlen(src);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return nextval;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncvoid
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynctoupper_str(char *p)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while (*p)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((*p >= 'a') && (*p <= 'z'))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *p = toupper((int) *p);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync p++;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstr_startswith(const char *s, const char *prefix)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (strncmp(s, prefix, strlen(prefix)) == 0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
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. */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstr_handle_lines(const char *input, char **rest, str_handle_lines_t linehandler, void *data)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char *buf, *p;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char *oldrest;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync size_t inputlen;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync size_t buflen;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync size_t restlen = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync RD_BOOL ret = True;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Copy data to buffer */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync inputlen = strlen(input);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (*rest)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync restlen = strlen(*rest);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buflen = restlen + inputlen + 1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buf = (char *) xmalloc(buflen);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buf[0] = '\0';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (*rest)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync STRNCPY(buf, *rest, buflen);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync strncat(buf, input, inputlen);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync p = buf;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while (1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char *newline = strchr(p, '\n');
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (newline)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *newline = '\0';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!linehandler(p, data))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync p = newline + 1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync p = newline + 1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Save in rest */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync oldrest = *rest;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync restlen = buf + buflen - p;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *rest = (char *) xmalloc(restlen);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync STRNCPY((*rest), p, restlen);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xfree(oldrest);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xfree(buf);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* Execute the program specified by argv. For each line in
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync stdout/stderr output, call linehandler. Returns false on failure. */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncsubprocess(char *const argv[], str_handle_lines_t linehandler, void *data)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync pid_t child;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int fd[2];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int n = 1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char output[256];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char *rest = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (pipe(fd) < 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync perror("pipe");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((child = fork()) < 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync perror("fork");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Child */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (child == 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Close read end */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync close(fd[0]);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Redirect stdout and stderr to pipe */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync dup2(fd[1], 1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync dup2(fd[1], 2);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Execute */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync execvp(argv[0], argv);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync perror("Error executing child");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync _exit(128);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Parent. Close write end. */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync close(fd[1]);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while (n > 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync n = read(fd[0], output, 255);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync output[n] = '\0';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync str_handle_lines(output, &rest, linehandler, data);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xfree(rest);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return True;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* not all clibs got ltoa */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define LTOA_BUFSIZE (sizeof(long) * 8 + 1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncchar *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncl_to_a(long N, int base)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync static char ret[LTOA_BUFSIZE];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char *head = ret, buf[LTOA_BUFSIZE], *tail = buf + sizeof(buf);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync register int divrem;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (base < 36 || 2 > base)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync base = 10;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (N < 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *head++ = '-';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync N = -N;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync tail = buf + sizeof(buf);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *--tail = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync do
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync divrem = N % base;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *--tail = (divrem <= 9) ? divrem + '0' : divrem + 'a' - 10;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync N /= base;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while (N);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync strcpy(head, tail);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncload_licence(unsigned char **data)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync uint8 ho[20], hi[16];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char *home, path[PATH_MAX], hash[41];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync struct stat st;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int fd, length;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync home = getenv("HOME");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (home == NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return -1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync memset(hi, 0, sizeof(hi));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf((char *) hi, 16, "%s", g_hostname);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync sec_hash_sha1_16(ho, hi, g_static_rdesktop_salt_16);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync sec_hash_to_string(hash, sizeof(hash), ho, sizeof(ho));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(path, PATH_MAX, "%s" RDESKTOP_LICENSE_STORE "/%s.cal", home, hash);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync path[sizeof(path) - 1] = '\0';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fd = open(path, O_RDONLY);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (fd == -1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* fallback to try reading old license file */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(path, PATH_MAX, "%s/.rdesktop/license.%s", home, g_hostname);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync path[sizeof(path) - 1] = '\0';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((fd = open(path, O_RDONLY)) == -1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return -1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (fstat(fd, &st))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync close(fd);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return -1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *data = (uint8 *) xmalloc(st.st_size);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync length = read(fd, *data, st.st_size);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync close(fd);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return length;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncvoid
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncsave_licence(unsigned char *data, int length)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync uint8 ho[20], hi[16];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char *home, path[PATH_MAX], tmppath[PATH_MAX], hash[41];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int fd;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync home = getenv("HOME");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (home == NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(path, PATH_MAX, "%s" RDESKTOP_LICENSE_STORE, home);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync path[sizeof(path) - 1] = '\0';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (utils_mkdir_p(path, 0700) == -1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync perror(path);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync memset(hi, 0, sizeof(hi));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf((char *) hi, 16, "%s", g_hostname);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync sec_hash_sha1_16(ho, hi, g_static_rdesktop_salt_16);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync sec_hash_to_string(hash, sizeof(hash), ho, sizeof(ho));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
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 path[sizeof(path) - 1] = '\0';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(tmppath, PATH_MAX, "%s.new", path);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync path[sizeof(path) - 1] = '\0';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fd = open(tmppath, O_WRONLY | O_CREAT | O_TRUNC, 0600);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (fd == -1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync perror(tmppath);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (write(fd, data, length) != length)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync perror(tmppath);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync unlink(tmppath);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (rename(tmppath, path) == -1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync perror(path);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync unlink(tmppath);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync close(fd);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* create rdesktop ui */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncvoid
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncrd_create_ui()
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* only create a window if we dont have one intialized */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!ui_have_window())
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!ui_create_window())
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync exit(EX_OSERR);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* Create the bitmap cache directory */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncrd_pstcache_mkdir(void)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char *home;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char bmpcache_dir[256];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync home = getenv("HOME");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (home == NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef VBOX
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(bmpcache_dir, sizeof(bmpcache_dir), "%s/%s", home, ".rdesktop");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync sprintf(bmpcache_dir, "%s/%s", home, ".rdesktop");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((mkdir(bmpcache_dir, S_IRWXU) == -1) && errno != EEXIST)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync perror(bmpcache_dir);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef VBOX
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(bmpcache_dir, sizeof(bmpcache_dir), "%s/%s", home, ".rdesktop/cache");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync sprintf(bmpcache_dir, "%s/%s", home, ".rdesktop/cache");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((mkdir(bmpcache_dir, S_IRWXU) == -1) && errno != EEXIST)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync perror(bmpcache_dir);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return True;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* open a file in the .rdesktop directory */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncrd_open_file(char *filename)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char *home;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char fn[256];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int fd;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync home = getenv("HOME");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (home == NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return -1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef VBOX
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(fn, sizeof(fn), "%s/.rdesktop/%s", home, filename);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync sprintf(fn, "%s/.rdesktop/%s", home, filename);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fd = open(fn, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (fd == -1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync perror(fn);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return fd;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* close file */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncvoid
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncrd_close_file(int fd)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync close(fd);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* read from file*/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncrd_read_file(int fd, void *ptr, int len)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return read(fd, ptr, len);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* write to file */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncrd_write_file(int fd, void *ptr, int len)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return write(fd, ptr, len);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* move file pointer */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncrd_lseek_file(int fd, int offset)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return lseek(fd, offset, SEEK_SET);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/* do a write lock on a file */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRD_BOOL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncrd_lock_file(int fd, int start, int len)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync struct flock lock;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync lock.l_type = F_WRLCK;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync lock.l_whence = SEEK_SET;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync lock.l_start = start;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync lock.l_len = len;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (fcntl(fd, F_SETLK, &lock) == -1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return False;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return True;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync