a180a41bba1d50822df23fff0099e90b86638b89vboxsync/*
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdesktop: A Remote Desktop Protocol client.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync Master include file
a180a41bba1d50822df23fff0099e90b86638b89vboxsync Copyright (C) Matthew Chapman 1999-2008
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync This program is free software: you can redistribute it and/or modify
a180a41bba1d50822df23fff0099e90b86638b89vboxsync it under the terms of the GNU General Public License as published by
a180a41bba1d50822df23fff0099e90b86638b89vboxsync the Free Software Foundation, either version 3 of the License, or
a180a41bba1d50822df23fff0099e90b86638b89vboxsync (at your option) any later version.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync This program is distributed in the hope that it will be useful,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync but WITHOUT ANY WARRANTY; without even the implied warranty of
a180a41bba1d50822df23fff0099e90b86638b89vboxsync MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
a180a41bba1d50822df23fff0099e90b86638b89vboxsync GNU General Public License for more details.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync You should have received a copy of the GNU General Public License
a180a41bba1d50822df23fff0099e90b86638b89vboxsync along with this program. If not, see <http://www.gnu.org/licenses/>.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync*/
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync/*
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync * Oracle GPL Disclaimer: For the avoidance of doubt, except that if any license choice
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync * other than GPL or LGPL is available it will apply instead, Oracle elects to use only
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync * the General Public License version 2 (GPLv2) at this time for any software where
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync * a choice of GPL license versions is made available with the language indicating
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync * that GPLv2 or any later version may be used, or where a choice of which version
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync * of the GPL is applied is otherwise unspecified.
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync */
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#include <stdlib.h>
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#include <stdio.h>
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#include <string.h>
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifdef _WIN32
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define WINVER 0x0400
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#include <windows.h>
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#include <winsock.h>
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#include <time.h>
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define DIR int
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#else
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#include <dirent.h>
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#include <sys/time.h>
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifdef HAVE_SYS_SELECT_H
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#include <sys/select.h>
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#else
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#include <sys/types.h>
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#include <unistd.h>
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#include <limits.h> /* PATH_MAX */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifdef HAVE_SYSEXITS_H
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#include <sysexits.h>
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* standard exit codes */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifndef EX_OK
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EX_OK 0
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifndef EX_USAGE
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EX_USAGE 64
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifndef EX_DATAERR
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EX_DATAERR 65
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifndef EX_NOINPUT
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EX_NOINPUT 66
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifndef EX_NOUSER
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EX_NOUSER 67
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifndef EX_NOHOST
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EX_NOHOST 68
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifndef EX_UNAVAILABLE
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EX_UNAVAILABLE 69
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifndef EX_SOFTWARE
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EX_SOFTWARE 70
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifndef EX_OSERR
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EX_OSERR 71
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifndef EX_OSFILE
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EX_OSFILE 72
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifndef EX_CANTCREAT
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EX_CANTCREAT 73
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifndef EX_IOERR
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EX_IOERR 74
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifndef EX_TEMPFAIL
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EX_TEMPFAIL 75
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifndef EX_PROTOCOL
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EX_PROTOCOL 76
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifndef EX_NOPERM
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EX_NOPERM 77
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifndef EX_CONFIG
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EX_CONFIG 78
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* rdesktop specific exit codes, lined up with disconnect PDU reasons */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EXRD_API_DISCONNECT 1
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EXRD_API_LOGOFF 2
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EXRD_IDLE_TIMEOUT 3
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EXRD_LOGON_TIMEOUT 4
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EXRD_REPLACED 5
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EXRD_OUT_OF_MEM 6
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EXRD_DENIED 7
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EXRD_DENIED_FIPS 8
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EXRD_INSUFFICIENT_PRIVILEGES 9
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EXRD_FRESH_CREDENTIALS_REQUIRED 10
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EXRD_RPC_DISCONNECT_BY_USER 11
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EXRD_DISCONNECT_BY_USER 12
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EXRD_LIC_INTERNAL 16
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EXRD_LIC_NOSERVER 17
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EXRD_LIC_NOLICENSE 18
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EXRD_LIC_MSG 19
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EXRD_LIC_HWID 20
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EXRD_LIC_CLIENT 21
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EXRD_LIC_NET 22
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EXRD_LIC_PROTO 23
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EXRD_LIC_ENC 24
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EXRD_LIC_UPGRADE 25
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EXRD_LIC_NOREMOTE 26
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* other exit codes */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EXRD_WINDOW_CLOSED 62
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define EXRD_UNKNOWN 63
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync#ifdef VBOX
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync#undef DEBUG
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync#endif
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifdef WITH_DEBUG
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define DEBUG(args) printf args;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#else
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define DEBUG(args)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifdef WITH_DEBUG_KBD
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define DEBUG_KBD(args) printf args;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#else
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define DEBUG_KBD(args)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifdef WITH_DEBUG_RDP5
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define DEBUG_RDP5(args) printf args;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#else
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define DEBUG_RDP5(args)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifdef WITH_DEBUG_CLIPBOARD
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define DEBUG_CLIPBOARD(args) printf args;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#else
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define DEBUG_CLIPBOARD(args)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifdef WITH_DEBUG_SOUND
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define DEBUG_SOUND(args) printf args;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#else
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define DEBUG_SOUND(args)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifdef WITH_DEBUG_CHANNEL
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define DEBUG_CHANNEL(args) printf args;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#else
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define DEBUG_CHANNEL(args)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifdef WITH_DEBUG_SCARD
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define DEBUG_SCARD(args) printf args;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#else
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define DEBUG_SCARD(args)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define STRNCPY(dst,src,n) { strncpy(dst,src,n-1); dst[n-1] = 0; }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifndef MIN
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define MIN(x,y) (((x) < (y)) ? (x) : (y))
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifndef MAX
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define MAX(x,y) (((x) > (y)) ? (x) : (y))
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* timeval macros */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifndef timerisset
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define timerisset(tvp)\
a180a41bba1d50822df23fff0099e90b86638b89vboxsync ((tvp)->tv_sec || (tvp)->tv_usec)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifndef timercmp
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define timercmp(tvp, uvp, cmp)\
a180a41bba1d50822df23fff0099e90b86638b89vboxsync ((tvp)->tv_sec cmp (uvp)->tv_sec ||\
a180a41bba1d50822df23fff0099e90b86638b89vboxsync (tvp)->tv_sec == (uvp)->tv_sec &&\
a180a41bba1d50822df23fff0099e90b86638b89vboxsync (tvp)->tv_usec cmp (uvp)->tv_usec)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifndef timerclear
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define timerclear(tvp)\
a180a41bba1d50822df23fff0099e90b86638b89vboxsync ((tvp)->tv_sec = (tvp)->tv_usec = 0)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* If configure does not define the endianess, try
a180a41bba1d50822df23fff0099e90b86638b89vboxsync to find it out */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#if !defined(L_ENDIAN) && !defined(B_ENDIAN)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#if __BYTE_ORDER == __LITTLE_ENDIAN
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define L_ENDIAN
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#elif __BYTE_ORDER == __BIG_ENDIAN
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define B_ENDIAN
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#else
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#error Unknown endianness. Edit rdesktop.h.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif /* B_ENDIAN, L_ENDIAN from configure */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* No need for alignment on x86 and amd64 */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#if !defined(NEED_ALIGN)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#if !(defined(__x86__) || defined(__x86_64__) || \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync defined(__AMD64__) || defined(_M_IX86) || \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync defined(__i386__))
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define NEED_ALIGN
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#include "parse.h"
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#include "constants.h"
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#include "types.h"
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifndef MAKE_PROTO
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#include "proto.h"
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif