Portability fixes, including elimination of variable argument macros.

Rudimentary configure script.
Miscellaneous cleanups.


git-svn-id: svn://svn.code.sf.net/p/rdesktop/code/trunk/rdesktop@29 423420c4-83ab-492f-b58f-81f9feb106b5
This commit is contained in:
Matt Chapman 2001-09-14 13:51:38 +00:00
parent a42509f2e5
commit 24ea31f68a
15 changed files with 344 additions and 219 deletions

View File

@ -1,21 +1,45 @@
##############################################
# rdesktop: A Remote Desktop Protocol client #
# Basic Makefile #
# Copyright (C) Matthew Chapman 1999-2000 #
##############################################
#
# rdesktop: A Remote Desktop Protocol client
# Makefile
# Copyright (C) Matthew Chapman 1999-2001
#
# Uncomment to enable debugging
# DEBUG = -g -DRDP_DEBUG
# Configuration defaults
CC = gcc
CFLAGS = -O2 -Wall $(DEBUG) -I/usr/X11R6/include
LIBS = -L/usr/X11R6/lib -lX11 -lnsl
CC = cc
CFLAGS = -O2
INCLUDES = -I/usr/X11R6/include
LDLIBS = -L/usr/X11R6/lib -lX11
PREFIX = /usr/local
EPREFIX = $(PREFIX)
BINDIR = $(EPREFIX)/bin
MANDIR = $(PREFIX)/man
RDPOBJ = rdesktop.o tcp.o iso.o mcs.o secure.o licence.o rdp.o orders.o bitmap.o cache.o xwin.o
CRYPTOBJ = crypto/rc4_enc.o crypto/rc4_skey.o crypto/md5_dgst.o crypto/sha1dgst.o crypto/arith.o
include Makeconf # local configuration
rdesktop: $(RDPOBJ) $(CRYPTOBJ)
$(CC) $(CFLAGS) -o rdesktop $(LIBS) $(RDPOBJ) $(CRYPTOBJ)
$(CC) $(CFLAGS) -o rdesktop $(RDPOBJ) $(CRYPTOBJ) $(LDDIRS) $(LDLIBS)
Makeconf:
./configure
install: installbin
installbin: rdesktop
mkdir -p $(BINDIR)
cp rdesktop $(BINDIR)
strip $(BINDIR)/rdesktop
chmod 755 $(BINDIR)/rdesktop
installman: rdesktop.1
mkdir -p $(MANDIR)/man1
cp rdesktop.1 $(MANDIR)/man1
chmod 755 $(MANDIR)/man1/rdesktop.1
proto:
cproto -DMAKE_PROTO -o proto.h *.c
@ -27,4 +51,5 @@ clean:
.SUFFIXES: .c .o
.c.o:
$(CC) $(CFLAGS) -o $@ -c $<
$(CC) $(CFLAGS) $(INCLUDES) -o $@ -c $<

View File

@ -1,7 +1,7 @@
/*
rdesktop: A Remote Desktop Protocol client.
Bitmap decompression routines
Copyright (C) Matthew Chapman 1999-2000
Copyright (C) Matthew Chapman 1999-2001
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -244,7 +244,7 @@ bitmap_decompress(unsigned char *output, int width, int height,
break;
default:
NOTIMP("bitmap opcode 0x%x\n",
unimpl("bitmap opcode 0x%x\n",
opcode);
return False;
}

22
cache.c
View File

@ -1,7 +1,7 @@
/*
rdesktop: A Remote Desktop Protocol client.
Cache routines
Copyright (C) Matthew Chapman 1999-2000
Copyright (C) Matthew Chapman 1999-2001
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -40,7 +40,7 @@ cache_get_bitmap(uint8 cache_id, uint16 cache_idx)
return bitmap;
}
ERROR("get bitmap %d:%d\n", cache_id, cache_idx);
error("get bitmap %d:%d\n", cache_id, cache_idx);
return NULL;
}
@ -61,7 +61,7 @@ cache_put_bitmap(uint8 cache_id, uint16 cache_idx, HBITMAP bitmap)
}
else
{
ERROR("put bitmap %d:%d\n", cache_id, cache_idx);
error("put bitmap %d:%d\n", cache_id, cache_idx);
}
}
@ -83,7 +83,7 @@ cache_get_font(uint8 font, uint16 character)
return glyph;
}
ERROR("get font %d:%d\n", font, character);
error("get font %d:%d\n", font, character);
return NULL;
}
@ -109,7 +109,7 @@ cache_put_font(uint8 font, uint16 character, uint16 offset,
}
else
{
ERROR("put font %d:%d\n", font, character);
error("put font %d:%d\n", font, character);
}
}
@ -130,7 +130,7 @@ cache_get_text(uint8 cache_id)
return text;
}
ERROR("get text %d\n", cache_id);
error("get text %d\n", cache_id);
return NULL;
}
@ -152,7 +152,7 @@ cache_put_text(uint8 cache_id, void *data, int length)
}
else
{
ERROR("put text %d\n", cache_id);
error("put text %d\n", cache_id);
}
}
@ -171,7 +171,7 @@ cache_get_desktop(uint32 offset, int cx, int cy, int bytes_per_pixel)
return &deskcache[offset];
}
ERROR("get desktop %d:%d\n", offset, length);
error("get desktop %d:%d\n", offset, length);
return NULL;
}
@ -194,7 +194,7 @@ cache_put_desktop(uint32 offset, int cx, int cy, int scanline,
}
else
{
ERROR("put desktop %d:%d\n", offset, length);
error("put desktop %d:%d\n", offset, length);
}
}
@ -214,7 +214,7 @@ HCURSOR cache_get_cursor(uint16 cache_idx)
return cursor;
}
ERROR("get cursor %d\n", cache_idx);
error("get cursor %d\n", cache_idx);
return NULL;
}
@ -234,6 +234,6 @@ cache_put_cursor(uint16 cache_idx, HCURSOR cursor)
}
else
{
ERROR("put cursor %d\n", cache_idx);
error("put cursor %d\n", cache_idx);
}
}

48
configure vendored Executable file
View File

@ -0,0 +1,48 @@
#!/bin/sh
#
# rdesktop: A Remote Desktop Protocol client
# configure script
# Copyright (C) Matthew Chapman 1999-2001
#
echo "# Generated by $0 $*" >Makeconf
for arg in $*; do
optarg=`echo $arg | sed 's/[-a-z]*=//'`
case $arg in
--prefix=*)
echo "PREFIX = $optarg" >>Makeconf
;;
--exec-prefix=*)
echo "EPREFIX = $optarg" >>Makeconf
;;
--bindir=*)
echo "BINDIR = $optarg" >>Makeconf
;;
--mandir=*)
echo "MANDIR = $optarg" >>Makeconf
;;
--with-debug*)
echo "CFLAGS += -g -DWITH_DEBUG" >>Makeconf
;;
--without-debug*)
;;
*)
echo "rdesktop build configuration script"
echo
echo "Target directories:"
echo " --prefix=PREFIX location for architecture-independent files"
echo " --exec-prefix=EPREFIX location for architecture-dependent files"
echo " --bindir=BINDIR location for program binaries [EPREFIX/bin]"
echo " --mandir=MANDIR location for man pages [PREFIX/man]"
echo
echo "Build configuration:"
echo " --with-debug enable debugging output"
echo
rm -f Makeconf
exit 1
;;
esac
done
echo "configure complete - now run make"

8
iso.c
View File

@ -1,7 +1,7 @@
/*
rdesktop: A Remote Desktop Protocol client.
Protocol services - ISO layer
Copyright (C) Matthew Chapman 1999-2000
Copyright (C) Matthew Chapman 1999-2001
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -57,7 +57,7 @@ iso_recv_msg(uint8 *code)
in_uint8(s, version);
if (version != 3)
{
ERROR("TPKT v%d\n", version);
error("TPKT v%d\n", version);
return False;
}
@ -123,7 +123,7 @@ iso_recv()
s = iso_recv_msg(&code);
if ((s == NULL) || (code != ISO_PDU_DT))
{
ERROR("expected DT, got %d\n", code);
error("expected DT, got %d\n", code);
return False;
}
@ -143,7 +143,7 @@ iso_connect(char *server)
if ((iso_recv_msg(&code) == NULL) || (code != ISO_PDU_CC))
{
ERROR("expected CC, got %d\n", code);
error("expected CC, got %d\n", code);
tcp_disconnect();
return False;
}

View File

@ -1,7 +1,7 @@
/*
rdesktop: A Remote Desktop Protocol client.
RDP licensing negotiation
Copyright (C) Matthew Chapman 1999-2000
Copyright (C) Matthew Chapman 1999-2001
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -142,7 +142,7 @@ licence_parse_authreq(STREAM s, uint8 **token, uint8 **signature)
in_uint16_le(s, tokenlen);
if (tokenlen != LICENCE_TOKEN_SIZE)
{
ERROR("token len %d\n", tokenlen);
error("token len %d\n", tokenlen);
return False;
}
@ -216,7 +216,6 @@ licence_process_issue(STREAM s)
licence_issued = True;
/* We should save the licence here */
STATUS("Server issued licence.\n");
}
/* Process a licence packet */
@ -246,6 +245,6 @@ licence_process(STREAM s)
break;
default:
NOTIMP("licence tag 0x%x\n", tag);
unimpl("licence tag 0x%x\n", tag);
}
}

18
mcs.c
View File

@ -1,7 +1,7 @@
/*
rdesktop: A Remote Desktop Protocol client.
Protocol services - Multipoint Communications Service
Copyright (C) Matthew Chapman 1999-2000
Copyright (C) Matthew Chapman 1999-2001
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -38,7 +38,7 @@ ber_parse_header(STREAM s, int tagval, int *length)
if (tag != tagval)
{
ERROR("expected tag %d, got %d\n", tagval, tag);
error("expected tag %d, got %d\n", tagval, tag);
return False;
}
@ -161,7 +161,7 @@ mcs_recv_connect_response(STREAM mcs_data)
in_uint8(s, result);
if (result != 0)
{
ERROR("MCS connect: %d\n", result);
error("MCS connect: %d\n", result);
return False;
}
@ -172,7 +172,7 @@ mcs_recv_connect_response(STREAM mcs_data)
ber_parse_header(s, BER_TAG_OCTET_STRING, &length);
if (length > mcs_data->size)
{
WARN("MCS data length %d\n", length);
error("MCS data length %d\n", length);
length = mcs_data->size;
}
@ -227,14 +227,14 @@ mcs_recv_aucf(uint16 *mcs_userid)
in_uint8(s, opcode);
if ((opcode >> 2) != MCS_AUCF)
{
ERROR("expected AUcf, got %d\n", opcode);
error("expected AUcf, got %d\n", opcode);
return False;
}
in_uint8(s, result);
if (result != 0)
{
ERROR("AUrq: %d\n", result);
error("AUrq: %d\n", result);
return False;
}
@ -274,14 +274,14 @@ mcs_recv_cjcf()
in_uint8(s, opcode);
if ((opcode >> 2) != MCS_CJCF)
{
ERROR("expected CJcf, got %d\n", opcode);
error("expected CJcf, got %d\n", opcode);
return False;
}
in_uint8(s, result);
if (result != 0)
{
ERROR("CJrq: %d\n", result);
error("CJrq: %d\n", result);
return False;
}
@ -340,7 +340,7 @@ mcs_recv()
{
if (appid != MCS_DPUM)
{
ERROR("expected data, got %d\n", opcode);
error("expected data, got %d\n", opcode);
}
return NULL;
}

View File

@ -1,7 +1,7 @@
/*
rdesktop: A Remote Desktop Protocol client.
RDP order processing
Copyright (C) Matthew Chapman 1999-2000
Copyright (C) Matthew Chapman 1999-2001
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -165,8 +165,8 @@ process_destblt(STREAM s, DESTBLT_ORDER *os, uint32 present, BOOL delta)
if (present & 0x10)
in_uint8(s, os->opcode);
DEBUG("DESTBLT(op=0x%x,x=%d,y=%d,cx=%d,cy=%d)\n",
os->opcode, os->x, os->y, os->cx, os->cy);
DEBUG(("DESTBLT(op=0x%x,x=%d,y=%d,cx=%d,cy=%d)\n",
os->opcode, os->x, os->y, os->cx, os->cy));
ui_destblt(ROP2_S(os->opcode), os->x, os->y, os->cx, os->cy);
}
@ -198,9 +198,9 @@ process_patblt(STREAM s, PATBLT_ORDER *os, uint32 present, BOOL delta)
rdp_parse_brush(s, &os->brush, present >> 7);
DEBUG("PATBLT(op=0x%x,x=%d,y=%d,cx=%d,cy=%d,bs=%d,bg=0x%x,fg=0x%x)\n",
DEBUG(("PATBLT(op=0x%x,x=%d,y=%d,cx=%d,cy=%d,bs=%d,bg=0x%x,fg=0x%x)\n",
os->opcode, os->x, os->y, os->cx, os->cy,
os->brush.style, os->bgcolour, os->fgcolour);
os->brush.style, os->bgcolour, os->fgcolour));
ui_patblt(ROP2_P(os->opcode), os->x, os->y, os->cx, os->cy,
&os->brush, os->bgcolour, os->fgcolour);
@ -231,8 +231,8 @@ process_screenblt(STREAM s, SCREENBLT_ORDER *os, uint32 present, BOOL delta)
if (present & 0x0040)
rdp_in_coord(s, &os->srcy, delta);
DEBUG("SCREENBLT(op=0x%x,x=%d,y=%d,cx=%d,cy=%d,srcx=%d,srcy=%d)\n",
os->opcode, os->x, os->y, os->cx, os->cy, os->srcx, os->srcy);
DEBUG(("SCREENBLT(op=0x%x,x=%d,y=%d,cx=%d,cy=%d,srcx=%d,srcy=%d)\n",
os->opcode, os->x, os->y, os->cx, os->cy, os->srcx, os->srcy));
ui_screenblt(ROP2_S(os->opcode), os->x, os->y, os->cx, os->cy,
os->srcx, os->srcy);
@ -265,13 +265,13 @@ process_line(STREAM s, LINE_ORDER *os, uint32 present, BOOL delta)
rdp_parse_pen(s, &os->pen, present >> 7);
DEBUG("LINE(op=0x%x,sx=%d,sy=%d,dx=%d,dx=%d,fg=0x%x)\n",
DEBUG(("LINE(op=0x%x,sx=%d,sy=%d,dx=%d,dx=%d,fg=0x%x)\n",
os->opcode, os->startx, os->starty, os->endx, os->endy,
os->pen.colour);
os->pen.colour));
if (os->opcode < 0x01 || os->opcode > 0x10)
{
ERROR("bad ROP2 0x%x\n", os->opcode);
error("bad ROP2 0x%x\n", os->opcode);
return;
}
@ -298,8 +298,8 @@ process_rect(STREAM s, RECT_ORDER *os, uint32 present, BOOL delta)
if (present & 0x10)
in_uint8(s, os->colour);
DEBUG("RECT(x=%d,y=%d,cx=%d,cy=%d,fg=0x%x)\n",
os->x, os->y, os->cx, os->cy, os->colour);
DEBUG(("RECT(x=%d,y=%d,cx=%d,cy=%d,fg=0x%x)\n",
os->x, os->y, os->cx, os->cy, os->colour));
ui_rect(os->x, os->y, os->cx, os->cy, os->colour);
}
@ -328,9 +328,9 @@ process_desksave(STREAM s, DESKSAVE_ORDER *os, uint32 present, BOOL delta)
if (present & 0x20)
in_uint8(s, os->action);
DEBUG("DESKSAVE(l=%d,t=%d,r=%d,b=%d,off=%d,op=%d)\n",
DEBUG(("DESKSAVE(l=%d,t=%d,r=%d,b=%d,off=%d,op=%d)\n",
os->left, os->top, os->right, os->bottom, os->offset,
os->action);
os->action));
width = os->right - os->left + 1;
height = os->bottom - os->top + 1;
@ -378,9 +378,9 @@ process_memblt(STREAM s, MEMBLT_ORDER *os, uint32 present, BOOL delta)
if (present & 0x0100)
in_uint16_le(s, os->cache_idx);
DEBUG("MEMBLT(op=0x%x,x=%d,y=%d,cx=%d,cy=%d,id=%d,idx=%d)\n",
DEBUG(("MEMBLT(op=0x%x,x=%d,y=%d,cx=%d,cy=%d,id=%d,idx=%d)\n",
os->opcode, os->x, os->y, os->cx, os->cy, os->cache_id,
os->cache_idx);
os->cache_idx));
bitmap = cache_get_bitmap(os->cache_id, os->cache_idx);
if (bitmap == NULL)
@ -437,10 +437,9 @@ process_triblt(STREAM s, TRIBLT_ORDER *os, uint32 present, BOOL delta)
if (present & 0x010000)
in_uint16_le(s, os->unknown);
DEBUG
("TRIBLT(op=0x%x,x=%d,y=%d,cx=%d,cy=%d,id=%d,idx=%d,bs=%d,bg=0x%x,fg=0x%x)\n",
DEBUG(("TRIBLT(op=0x%x,x=%d,y=%d,cx=%d,cy=%d,id=%d,idx=%d,bs=%d,bg=0x%x,fg=0x%x)\n",
os->opcode, os->x, os->y, os->cx, os->cy, os->cache_id,
os->cache_idx, os->brush.style, os->bgcolour, os->fgcolour);
os->cache_idx, os->brush.style, os->bgcolour, os->fgcolour));
bitmap = cache_get_bitmap(os->cache_id, os->cache_idx);
if (bitmap == NULL)
@ -499,15 +498,15 @@ process_polyline(STREAM s, POLYLINE_ORDER *os, uint32 present, BOOL delta)
in_uint8a(s, os->data, os->datasize);
}
DEBUG("POLYLINE(x=%d,y=%d,fl=0x%x,fg=0x%x,n=%d,sz=%d)\n",
os->x, os->y, os->flags, os->fgcolour, os->lines, os->datasize);
DEBUG(("POLYLINE(x=%d,y=%d,fl=0x%x,fg=0x%x,n=%d,sz=%d)\n",
os->x, os->y, os->flags, os->fgcolour, os->lines, os->datasize));
DEBUG("Data: ");
DEBUG(("Data: "));
for (index = 0; index < os->datasize; index++)
DEBUG("%02x ", os->data[index]);
DEBUG(("%02x ", os->data[index]));
DEBUG("\n");
DEBUG(("\n"));
x = os->x;
y = os->y;
@ -600,19 +599,18 @@ process_text2(STREAM s, TEXT2_ORDER *os, uint32 present, BOOL delta)
in_uint8a(s, os->text, os->length);
}
DEBUG
("TEXT2(x=%d,y=%d,cl=%d,ct=%d,cr=%d,cb=%d,bl=%d,bt=%d,bb=%d,br=%d,fg=0x%x,bg=0x%x,font=%d,fl=0x%x,mix=%d,unk=0x%x,n=%d)\n",
DEBUG(("TEXT2(x=%d,y=%d,cl=%d,ct=%d,cr=%d,cb=%d,bl=%d,bt=%d,bb=%d,br=%d,fg=0x%x,bg=0x%x,font=%d,fl=0x%x,mix=%d,unk=0x%x,n=%d)\n",
os->x, os->y, os->clipleft, os->cliptop, os->clipright,
os->clipbottom, os->boxleft, os->boxtop, os->boxright,
os->boxbottom, os->fgcolour, os->bgcolour, os->font,
os->flags, os->mixmode, os->unknown, os->length);
os->flags, os->mixmode, os->unknown, os->length));
DEBUG("Text: ");
DEBUG(("Text: "));
for (i = 0; i < os->length; i++)
DEBUG("%02x ", os->text[i]);
DEBUG(("%02x ", os->text[i]));
DEBUG("\n");
DEBUG(("\n"));
/* Process special cache strings */
if ((os->length >= 2) && (os->text[0] == 0xfe))
@ -661,8 +659,8 @@ process_raw_bmpcache(STREAM s)
in_uint16_le(s, cache_idx);
in_uint8p(s, data, bufsize);
DEBUG("RAW_BMPCACHE(cx=%d,cy=%d,id=%d,idx=%d)\n",
width, height, cache_id, cache_idx);
DEBUG(("RAW_BMPCACHE(cx=%d,cy=%d,id=%d,idx=%d)\n",
width, height, cache_id, cache_idx));
inverted = xmalloc(width * height);
for (y = 0; y < height; y++)
{
@ -696,8 +694,8 @@ process_bmpcache(STREAM s)
in_uint8s(s, 4); /* row_size, final_size */
in_uint8p(s, data, size);
DEBUG("BMPCACHE(cx=%d,cy=%d,id=%d,idx=%d)\n",
width, height, cache_id, cache_idx);
DEBUG(("BMPCACHE(cx=%d,cy=%d,id=%d,idx=%d)\n",
width, height, cache_id, cache_idx));
bmpdata = xmalloc(width * height);
@ -734,7 +732,7 @@ process_colcache(STREAM s)
in_uint8s(s, 1); /* pad */
}
DEBUG("COLCACHE(id=%d,n=%d)\n", cache_id, map.ncolours);
DEBUG(("COLCACHE(id=%d,n=%d)\n", cache_id, map.ncolours));
hmap = ui_create_colourmap(&map);
ui_set_colourmap(hmap);
@ -755,7 +753,7 @@ process_fontcache(STREAM s)
in_uint8(s, font);
in_uint8(s, nglyphs);
DEBUG("FONTCACHE(font=%d,n=%d)\n", font, nglyphs);
DEBUG(("FONTCACHE(font=%d,n=%d)\n", font, nglyphs));
for (i = 0; i < nglyphs; i++)
{
@ -807,7 +805,7 @@ process_secondary_order(STREAM s)
break;
default:
NOTIMP("secondary order %d\n", type);
unimpl("secondary order %d\n", type);
}
s->p = next_order;
@ -834,7 +832,7 @@ process_orders(STREAM s)
if (!(order_flags & RDP_ORDER_STANDARD))
{
ERROR("order parsing failed\n");
error("order parsing failed\n");
break;
}
@ -936,7 +934,7 @@ process_orders(STREAM s)
break;
default:
NOTIMP("order %d\n", os->order_type);
unimpl("order %d\n", os->order_type);
return;
}
@ -948,7 +946,7 @@ process_orders(STREAM s)
}
if (s->p != next_packet)
WARN("%d bytes remaining\n", (int) (next_packet - s->p));
error("%d bytes remaining\n", (int) (next_packet - s->p));
}
/* Reset order state */

View File

@ -35,6 +35,8 @@ void generate_random(uint8 *random);
void *xmalloc(int size);
void *xrealloc(void *oldmem, int size);
void xfree(void *mem);
void error(char *format, ...);
void unimpl(char *format, ...);
void hexdump(unsigned char *p, unsigned int len);
/* rdp.c */
void rdp_out_unistr(STREAM s, char *string, int len);

View File

@ -1,7 +1,7 @@
/*
rdesktop: A Remote Desktop Protocol client.
Entrypoint and utility functions
Copyright (C) Matthew Chapman 1999-2000
Copyright (C) Matthew Chapman 1999-2001
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -19,6 +19,7 @@
*/
#include <stdlib.h> /* malloc realloc free */
#include <stdarg.h> /* va_list va_start va_end */
#include <unistd.h> /* read close getuid getgid getpid getppid gethostname */
#include <fcntl.h> /* open */
#include <pwd.h> /* getpwuid */
@ -29,14 +30,14 @@
char username[16];
char hostname[16];
int width = 800;
int height = 600;
int width;
int height;
int keylayout = 0x409;
BOOL bitmap_compression = True;
BOOL sendmotion = True;
BOOL orders = True;
BOOL licence = True;
BOOL use_encryption = True;
BOOL encryption = True;
BOOL desktop_save = True;
BOOL fullscreen = False;
@ -44,113 +45,114 @@ BOOL fullscreen = False;
static void
usage(char *program)
{
STATUS("Usage: %s [options] server\n", program);
STATUS(" -u: user name\n");
STATUS(" -d: domain\n");
STATUS(" -s: shell\n");
STATUS(" -c: working directory\n");
STATUS(" -p: password (autologon)\n");
STATUS(" -n: client hostname\n");
STATUS(" -w: desktop width\n");
STATUS(" -h: desktop height\n");
STATUS(" -k: keyboard layout (hex)\n");
STATUS(" -b: force bitmap updates\n");
STATUS(" -m: do not send motion events\n");
STATUS(" -l: do not request licence\n\n");
printf("Usage: %s [options] server\n", program);
printf(" -u: user name\n");
printf(" -d: domain\n");
printf(" -s: shell\n");
printf(" -c: working directory\n");
printf(" -p: password (autologon)\n");
printf(" -n: client hostname\n");
printf(" -k: keyboard layout (hex)\n");
printf(" -g: desktop geometry (WxH)\n");
printf(" -f: full-screen mode\n");
printf(" -b: force bitmap updates\n");
printf(" -e: disable encryption (French TS)\n");
printf(" -m: do not send motion events\n");
printf(" -l: do not request licence\n\n");
}
/* Client program */
int
main(int argc, char *argv[])
{
struct passwd *pw;
char *server;
uint32 flags;
char fullhostname[64];
char domain[16];
char password[16];
char shell[32];
char directory[32];
char title[32];
struct passwd *pw;
char *server, *p;
uint32 flags;
int c;
STATUS("rdesktop: A Remote Desktop Protocol client.\n");
STATUS("Version " VERSION
". Copyright (C) 1999-2000 Matt Chapman.\n");
STATUS("See http://www.rdesktop.org/ for more information.\n\n");
printf("rdesktop: A Remote Desktop Protocol client.\n");
printf("Version " VERSION ". Copyright (C) 1999-2001 Matt Chapman.\n");
printf("See http://www.rdesktop.org/ for more information.\n\n");
flags = RDP_LOGON_NORMAL;
domain[0] = password[0] = shell[0] = directory[0] = 0;
while ((c = getopt(argc, argv, "u:d:s:c:p:n:g:k:mbleKFVh?")) != -1)
while ((c = getopt(argc, argv, "u:d:s:c:p:n:k:g:fbemlh?")) != -1)
{
switch (c)
{
case 'u':
strncpy(username, optarg, sizeof(username));
STRNCPY(username, optarg, sizeof(username));
break;
case 'd':
strncpy(domain, optarg, sizeof(domain));
break;
case 'p':
flags |= RDP_LOGON_AUTO;
strncpy(password, optarg, sizeof(password));
STRNCPY(domain, optarg, sizeof(domain));
break;
case 's':
strncpy(shell, optarg, sizeof(shell));
STRNCPY(shell, optarg, sizeof(shell));
break;
case 'c':
strncpy(directory, optarg, sizeof(directory));
STRNCPY(directory, optarg, sizeof(directory));
break;
case 'p':
STRNCPY(password, optarg, sizeof(password));
flags |= RDP_LOGON_AUTO;
break;
case 'n':
strncpy(hostname, optarg, sizeof(hostname));
break;
case 'g':
{
char *tgem = 0;
width = strtol(optarg, NULL, 10);
tgem = strchr(optarg, 'x');
if ((tgem == 0) || (strlen(tgem) < 2))
{
ERROR
("-g: invalid parameter. Syntax example: -g 1024x768\n");
exit(1);
}
height = strtol(tgem + 1, NULL, 10);
}
STRNCPY(hostname, optarg, sizeof(hostname));
break;
case 'k':
keylayout = strtol(optarg, NULL, 16);
/* keylayout = find_keyb_code(optarg); */
if (keylayout == 0)
return 0;
{
error("invalid keyboard layout\n");
return 1;
}
break;
case 'm':
sendmotion = False;
case 'g':
width = strtol(optarg, &p, 10);
if (*p == 'x')
height = strtol(p+1, NULL, 10);
if ((width == 0) || (height == 0))
{
error("invalid geometry\n");
return 1;
}
break;
case 'f':
fullscreen = True;
break;
case 'b':
orders = False;
break;
case 'e':
encryption = False;
break;
case 'm':
sendmotion = False;
break;
case 'l':
licence = False;
break;
case 'e':
use_encryption = False;
break;
case 'F':
fullscreen = True;
break;
case 'h':
case '?':
default:
@ -172,24 +174,47 @@ main(int argc, char *argv[])
pw = getpwuid(getuid());
if ((pw == NULL) || (pw->pw_name == NULL))
{
STATUS("Could not determine user name.\n");
error("could not determine username, use -u\n");
return 1;
}
strncpy(username, pw->pw_name, sizeof(username));
STRNCPY(username, pw->pw_name, sizeof(username));
}
if (hostname[0] == 0)
{
if (gethostname(hostname, sizeof(hostname)) == -1)
if (gethostname(fullhostname, sizeof(fullhostname)) == -1)
{
STATUS("Could not determine host name.\n");
error("could not determine local hostname, use -n\n");
return 1;
}
p = strchr(fullhostname, '.');
if (p != NULL)
*p = 0;
STRNCPY(hostname, fullhostname, sizeof(hostname));
}
if (!strcmp(password, "-"))
{
p = getpass("Password: ");
if (p == NULL)
{
error("failed to read password\n");
return 0;
}
STRNCPY(password, p, sizeof(password));
}
if ((width == 0) || (height == 0))
{
width = 800;
height = 600;
}
strcpy(title, "rdesktop - ");
strncat(title, server, sizeof(title));
strncat(title, server, sizeof(title) - sizeof("rdesktop - "));
if (ui_create_window(title))
{
@ -197,7 +222,7 @@ main(int argc, char *argv[])
directory))
return 1;
STATUS("Connection successful.\n");
printf("Connection successful.\n");
rdp_main_loop();
ui_destroy_window();
}
@ -216,7 +241,8 @@ generate_random(uint8 *random)
int fd;
/* If we have a kernel random device, use it. */
if ((fd = open("/dev/urandom", O_RDONLY)) != -1)
if (((fd = open("/dev/urandom", O_RDONLY)) != -1)
|| ((fd = open("/dev/random", O_RDONLY)) != -1))
{
read(fd, random, 32);
close(fd);
@ -241,7 +267,7 @@ xmalloc(int size)
void *mem = malloc(size);
if (mem == NULL)
{
ERROR("xmalloc %d\n", size);
error("xmalloc %d\n", size);
exit(1);
}
return mem;
@ -254,7 +280,7 @@ xrealloc(void *oldmem, int size)
void *mem = realloc(oldmem, size);
if (mem == NULL)
{
ERROR("xrealloc %d\n", size);
error("xrealloc %d\n", size);
exit(1);
}
return mem;
@ -267,7 +293,33 @@ xfree(void *mem)
free(mem);
}
/* Produce a hex dump */
/* report an error */
void
error(char *format, ...)
{
va_list ap;
fprintf(stderr, "ERROR: ");
va_start(ap, format);
vfprintf(stderr, format, ap);
va_end(ap);
}
/* report an unimplemented protocol feature */
void
unimpl(char *format, ...)
{
va_list ap;
fprintf(stderr, "NOT IMPLEMENTED: ");
va_start(ap, format);
vfprintf(stderr, format, ap);
va_end(ap);
}
/* produce a hex dump */
void
hexdump(unsigned char *p, unsigned int len)
{
@ -277,21 +329,23 @@ hexdump(unsigned char *p, unsigned int len)
while (offset < len)
{
STATUS("%04x ", offset);
printf("%04x ", offset);
thisline = len - offset;
if (thisline > 16)
thisline = 16;
for (i = 0; i < thisline; i++)
STATUS("%02x ", line[i]) for (; i < 16; i++)
STATUS(" ");
printf("%02x ", line[i]);
for (; i < 16; i++)
printf(" ");
for (i = 0; i < thisline; i++)
STATUS("%c",
printf("%c",
(line[i] >= 0x20
&& line[i] < 0x7f) ? line[i] : '.');
STATUS("\n");
printf("\n");
offset += thisline;
line += thisline;
}

View File

@ -24,17 +24,14 @@
#define VERSION "1.1.0"
#define STATUS(args...) fprintf(stderr, args);
#define ERROR(args...) fprintf(stderr, "ERROR: "args);
#define WARN(args...) fprintf(stderr, "WARNING: "args);
#define NOTIMP(args...) fprintf(stderr, "NOTIMP: "args);
#ifdef RDP_DEBUG
#define DEBUG(args...) fprintf(stderr, args);
#ifdef WITH_DEBUG
#define DEBUG(args) printf args;
#else
#define DEBUG(args...)
#define DEBUG(args)
#endif
#define STRNCPY(dst,src,n) { strncpy(dst,src,n-1); dst[n-1] = 0; }
#include "constants.h"
#include "types.h"
#include "parse.h"

36
rdp.c
View File

@ -1,7 +1,7 @@
/*
rdesktop: A Remote Desktop Protocol client.
Protocol services - RDP layer
Copyright (C) Matthew Chapman 1999-2000
Copyright (C) Matthew Chapman 1999-2001
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -24,7 +24,7 @@ extern uint16 mcs_userid;
extern char username[16];
extern BOOL bitmap_compression;
extern BOOL orders;
extern BOOL use_encryption;
extern BOOL encryption;
extern BOOL desktop_save;
uint8 *next_packet;
@ -36,7 +36,7 @@ rdp_init(int maxlen)
{
STREAM s;
s = sec_init(use_encryption ? SEC_ENCRYPT : 0, maxlen + 6);
s = sec_init(encryption ? SEC_ENCRYPT : 0, maxlen + 6);
s_push_layer(s, rdp_hdr, 6);
return s;
@ -55,7 +55,7 @@ rdp_send(STREAM s, uint8 pdu_type)
out_uint16_le(s, (pdu_type | 0x10)); /* Version 1 */
out_uint16_le(s, (mcs_userid + 1001));
sec_send(s, use_encryption ? SEC_ENCRYPT : 0);
sec_send(s, encryption ? SEC_ENCRYPT : 0);
}
/* Receive an RDP packet */
@ -83,8 +83,8 @@ rdp_recv(uint8 *type)
in_uint8s(rdp_s, 2); /* userid */
*type = pdu_type & 0xf;
#if RDP_DEBUG
DEBUG("RDP packet (type %x):\n", *type);
#if WITH_DEBUG
DEBUG(("RDP packet (type %x):\n", *type));
hexdump(next_packet, length);
#endif /* */
@ -98,7 +98,7 @@ rdp_init_data(int maxlen)
{
STREAM s;
s = sec_init(use_encryption ? SEC_ENCRYPT : 0, maxlen + 18);
s = sec_init(encryption ? SEC_ENCRYPT : 0, maxlen + 18);
s_push_layer(s, rdp_hdr, 18);
return s;
@ -125,7 +125,7 @@ rdp_send_data(STREAM s, uint8 data_pdu_type)
out_uint8(s, 0); /* compress_type */
out_uint16(s, 0); /* compress_len */
sec_send(s, use_encryption ? SEC_ENCRYPT : 0);
sec_send(s, encryption ? SEC_ENCRYPT : 0);
}
/* Output a string in Unicode */
@ -155,7 +155,7 @@ rdp_send_logon_info(uint32 flags, char *domain, char *user,
int len_password = 2 * strlen(password);
int len_program = 2 * strlen(program);
int len_directory = 2 * strlen(directory);
uint32 sec_flags = use_encryption ? (SEC_LOGON_INFO | SEC_ENCRYPT)
uint32 sec_flags = encryption ? (SEC_LOGON_INFO | SEC_ENCRYPT)
: SEC_LOGON_INFO;
STREAM s;
@ -479,7 +479,7 @@ process_demand_active(STREAM s)
in_uint32_le(s, rdp_shareid);
DEBUG("DEMAND_ACTIVE(id=0x%x)\n", rdp_shareid);
DEBUG(("DEMAND_ACTIVE(id=0x%x)\n", rdp_shareid));
rdp_send_confirm_active();
rdp_send_synchronise();
@ -538,7 +538,7 @@ process_pointer_pdu(STREAM s)
break;
default:
DEBUG("Pointer message 0x%x\n", message_type);
DEBUG(("Pointer message 0x%x\n", message_type));
}
}
@ -569,8 +569,8 @@ process_bitmap_updates(STREAM s)
cx = right - left + 1;
cy = bottom - top + 1;
DEBUG("UPDATE(l=%d,t=%d,r=%d,b=%d,w=%d,h=%d,cmp=%d)\n",
left, top, right, bottom, width, height, compress);
DEBUG(("UPDATE(l=%d,t=%d,r=%d,b=%d,w=%d,h=%d,cmp=%d)\n",
left, top, right, bottom, width, height, compress));
if (!compress)
{
@ -610,11 +610,13 @@ process_palette(STREAM s)
{
HCOLOURMAP hmap;
COLOURMAP map;
uint8 *colours;
in_uint8s(s, 2); /* pad */
in_uint16_le(s, map.ncolours);
in_uint8s(s, 2); /* pad */
in_uint8p(s, (uint8 *) map.colours, (map.ncolours * 3));
in_uint8p(s, colours, (map.ncolours * 3));
map.colours = (COLOURENTRY *)colours;
hmap = ui_create_colourmap(&map);
ui_set_colourmap(hmap);
@ -646,7 +648,7 @@ process_update_pdu(STREAM s)
break;
default:
NOTIMP("update %d\n", update_type);
unimpl("update %d\n", update_type);
}
}
@ -680,7 +682,7 @@ process_data_pdu(STREAM s)
break;
default:
NOTIMP("data PDU %d\n", data_pdu_type);
unimpl("data PDU %d\n", data_pdu_type);
}
}
@ -707,7 +709,7 @@ rdp_main_loop()
break;
default:
NOTIMP("PDU %d\n", type);
unimpl("PDU %d\n", type);
}
}
}

View File

@ -1,7 +1,7 @@
/*
rdesktop: A Remote Desktop Protocol client.
Protocol services - RDP encryption and licensing
Copyright (C) Matthew Chapman 1999-2000
Copyright (C) Matthew Chapman 1999-2001
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -28,7 +28,7 @@ extern char hostname[16];
extern int width;
extern int height;
extern int keylayout;
extern BOOL use_encryption;
extern BOOL encryption;
extern BOOL licence_issued;
static int rc4_key_len;
@ -126,7 +126,7 @@ sec_generate_keys(uint8 *client_key, uint8 *server_key, int rc4_key_size)
if (rc4_key_size == 1)
{
DEBUG("40-bit encryption enabled\n");
DEBUG(("40-bit encryption enabled\n"));
sec_make_40bit(sec_sign_key);
sec_make_40bit(sec_decrypt_key);
sec_make_40bit(sec_encrypt_key);
@ -134,7 +134,7 @@ sec_generate_keys(uint8 *client_key, uint8 *server_key, int rc4_key_size)
}
else
{
DEBUG("128-bit encryption enabled\n");
DEBUG(("128-bit encryption enabled\n"));
rc4_key_len = 16;
}
@ -339,8 +339,8 @@ sec_send(STREAM s, uint32 flags)
flags &= ~SEC_ENCRYPT;
datalen = s->end - s->p - 8;
#if RDP_DEBUG
DEBUG("Sending encrypted packet:\n");
#if WITH_DEBUG
DEBUG(("Sending encrypted packet:\n"));
hexdump(s->p + 8, datalen);
#endif
@ -418,7 +418,7 @@ sec_out_mcs_data(STREAM s)
/* Client encryption settings */
out_uint16_le(s, SEC_TAG_CLI_CRYPT);
out_uint16(s, 8); /* length */
out_uint32_le(s, use_encryption ? 1 : 0); /* encryption enabled */
out_uint32_le(s, encryption ? 1 : 0); /* encryption enabled */
s_mark_end(s);
}
@ -431,14 +431,14 @@ sec_parse_public_key(STREAM s, uint8 **modulus, uint8 **exponent)
in_uint32_le(s, magic);
if (magic != SEC_RSA_MAGIC)
{
ERROR("RSA magic 0x%x\n", magic);
error("RSA magic 0x%x\n", magic);
return False;
}
in_uint32_le(s, modulus_len);
if (modulus_len != SEC_MODULUS_SIZE + SEC_PADDING_SIZE)
{
ERROR("modulus len 0x%x\n", modulus_len);
error("modulus len 0x%x\n", modulus_len);
return False;
}
@ -466,7 +466,7 @@ sec_parse_crypt_info(STREAM s, uint32 *rc4_key_size,
if (random_len != SEC_RANDOM_SIZE)
{
ERROR("random len %d\n", random_len);
error("random len %d\n", random_len);
return False;
}
@ -501,7 +501,7 @@ sec_parse_crypt_info(STREAM s, uint32 *rc4_key_size,
break;
default:
NOTIMP("crypt tag 0x%x\n", tag);
unimpl("crypt tag 0x%x\n", tag);
}
s->p = next_tag;
@ -559,7 +559,7 @@ sec_process_mcs_data(STREAM s)
break;
default:
NOTIMP("response tag 0x%x\n", tag);
unimpl("response tag 0x%x\n", tag);
}
s->p = next_tag;
@ -575,7 +575,7 @@ sec_recv()
while ((s = mcs_recv()) != NULL)
{
if (use_encryption || !licence_issued)
if (encryption || !licence_issued)
{
in_uint32_le(s, sec_flags);
@ -613,7 +613,7 @@ sec_connect(char *server)
return False;
sec_process_mcs_data(&mcs_data);
if (use_encryption)
if (encryption)
sec_establish_key();
return True;
}

12
tcp.c
View File

@ -1,7 +1,7 @@
/*
rdesktop: A Remote Desktop Protocol client.
Protocol services - TCP layer
Copyright (C) Matthew Chapman 1999-2000
Copyright (C) Matthew Chapman 1999-2001
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -60,7 +60,7 @@ tcp_send(STREAM s)
if (sent <= 0)
{
STATUS("write: %s\n", strerror(errno));
error("write: %s\n", strerror(errno));
return;
}
@ -101,7 +101,7 @@ tcp_recv(int length)
if (rcvd <= 0)
{
STATUS("read: %s\n", strerror(errno));
error("read: %s\n", strerror(errno));
return NULL;
}
@ -128,13 +128,13 @@ tcp_connect(char *server)
}
else if (!(servaddr.sin_addr.s_addr = inet_addr(server)))
{
STATUS("%s: unable to resolve host\n", server);
error("%s: unable to resolve host\n", server);
return False;
}
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
STATUS("socket: %s\n", strerror(errno));
error("socket: %s\n", strerror(errno));
return False;
}
@ -145,7 +145,7 @@ tcp_connect(char *server)
(sock, (struct sockaddr *) &servaddr,
sizeof(struct sockaddr)) < 0)
{
STATUS("connect: %s\n", strerror(errno));
error("connect: %s\n", strerror(errno));
close(sock);
return False;
}

14
xwin.c
View File

@ -1,7 +1,7 @@
/*
rdesktop: A Remote Desktop Protocol client.
User interface services - X-Windows
Copyright (C) Matthew Chapman 1999-2000
Copyright (C) Matthew Chapman 1999-2001
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -151,7 +151,7 @@ ui_create_window(char *title)
display = XOpenDisplay(NULL);
if (display == NULL)
{
ERROR("Failed to open display\n");
error("Failed to open display\n");
return False;
}
@ -177,7 +177,7 @@ ui_create_window(char *title)
if (bpp < 8)
{
ERROR("Less than 8 bpp not currently supported.\n");
error("Less than 8 bpp not currently supported.\n");
XCloseDisplay(display);
return False;
}
@ -205,7 +205,7 @@ ui_create_window(char *title)
attribs.override_redirect = False;
}
width &= ~3; /* make width a multiple of 32 bits */
width = (width + 3) & ~3; /* make width a multiple of 32 bits */
wnd = XCreateWindow(display, RootWindowOfScreen(screen),
0, 0, width, height, 0, CopyFromParent,
@ -259,7 +259,7 @@ ui_destroy_window()
static uint8
xwin_translate_key(unsigned long key)
{
DEBUG("KEY(code=0x%lx)\n", key);
DEBUG(("KEY(code=0x%lx)\n", key));
if ((key > 8) && (key <= 0x60))
return (key - 8);
@ -707,7 +707,7 @@ ui_patblt(uint8 opcode,
break;
default:
NOTIMP("brush %d\n", brush->style);
unimpl("brush %d\n", brush->style);
}
RESET_FUNCTION(opcode);
@ -765,7 +765,7 @@ ui_triblt(uint8 opcode,
break;
default:
NOTIMP("triblt 0x%x\n", opcode);
unimpl("triblt 0x%x\n", opcode);
ui_memblt(ROP2_COPY, x, y, cx, cy, src, srcx, srcy);
}
}