parent
e02871e8a4
commit
4ce1dc3ed2
@ -0,0 +1,31 @@
|
|||||||
|
# libxup makefile
|
||||||
|
XUPOBJ = os_calls.o xup.o
|
||||||
|
|
||||||
|
DESTDIR = /usr/local/xrdp
|
||||||
|
CFGDIR = /etc/xrdp
|
||||||
|
PIDDIR = /var/run
|
||||||
|
MANDIR = /usr/local/man
|
||||||
|
DOCDIR = /usr/doc/xrdp
|
||||||
|
|
||||||
|
DEFINES =
|
||||||
|
|
||||||
|
CFLAGS = -Wall -O2 -I../common -fPIC $(DEFINES)
|
||||||
|
#CFLAGS += -DXRDP_DEBUG
|
||||||
|
C_OS_FLAGS = $(CFLAGS) -c
|
||||||
|
LDFLAGS = -shared
|
||||||
|
LIBS = -ldl
|
||||||
|
CC = gcc
|
||||||
|
|
||||||
|
all: xup
|
||||||
|
|
||||||
|
xup: $(XUPOBJ)
|
||||||
|
$(CC) $(LDFLAGS) -o libxup.so $(XUPOBJ) $(LIBS)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(XUPOBJ) libxup.so
|
||||||
|
|
||||||
|
os_calls.o: ../common/os_calls.c
|
||||||
|
$(CC) $(C_OS_FLAGS) ../common/os_calls.c
|
||||||
|
|
||||||
|
install:
|
||||||
|
install libxup.so $(DESTDIR)/libxup.so
|
@ -0,0 +1,396 @@
|
|||||||
|
/*
|
||||||
|
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
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
xrdp: A Remote Desktop Protocol server.
|
||||||
|
Copyright (C) Jay Sorg 2005-2006
|
||||||
|
|
||||||
|
libxup main file
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "xup.h"
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
/* returns error */
|
||||||
|
int DEFAULT_CC
|
||||||
|
lib_recv(struct mod* mod, char* data, int len)
|
||||||
|
{
|
||||||
|
int rcvd;
|
||||||
|
|
||||||
|
if (mod->sck_closed)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
while (len > 0)
|
||||||
|
{
|
||||||
|
rcvd = g_tcp_recv(mod->sck, data, len, 0);
|
||||||
|
if (rcvd == -1)
|
||||||
|
{
|
||||||
|
if (g_tcp_last_error_would_block(mod->sck))
|
||||||
|
{
|
||||||
|
if (mod->server_is_term(mod))
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
g_sleep(1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (rcvd == 0)
|
||||||
|
{
|
||||||
|
mod->sck_closed = 1;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
data += rcvd;
|
||||||
|
len -= rcvd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* returns error */
|
||||||
|
int DEFAULT_CC
|
||||||
|
lib_send(struct mod* mod, char* data, int len)
|
||||||
|
{
|
||||||
|
int sent;
|
||||||
|
|
||||||
|
if (mod->sck_closed)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
while (len > 0)
|
||||||
|
{
|
||||||
|
sent = g_tcp_send(mod->sck, data, len, 0);
|
||||||
|
if (sent == -1)
|
||||||
|
{
|
||||||
|
if (g_tcp_last_error_would_block(mod->sck))
|
||||||
|
{
|
||||||
|
if (mod->server_is_term(mod))
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
g_sleep(1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (sent == 0)
|
||||||
|
{
|
||||||
|
mod->sck_closed = 1;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
data += sent;
|
||||||
|
len -= sent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
/* return error */
|
||||||
|
int DEFAULT_CC
|
||||||
|
lib_mod_start(struct mod* mod, int w, int h, int bpp)
|
||||||
|
{
|
||||||
|
DEBUG(("in lib_mod_start\r\n"));
|
||||||
|
mod->width = w;
|
||||||
|
mod->height = h;
|
||||||
|
DEBUG(("out lib_mod_start\r\n"));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
/* return error */
|
||||||
|
int DEFAULT_CC
|
||||||
|
lib_mod_connect(struct mod* mod)
|
||||||
|
{
|
||||||
|
int error;
|
||||||
|
int len;
|
||||||
|
struct stream* s;
|
||||||
|
|
||||||
|
DEBUG(("in lib_mod_connect\r\n"));
|
||||||
|
/* clear screen */
|
||||||
|
mod->server_begin_update(mod);
|
||||||
|
mod->server_set_fgcolor(mod, 0);
|
||||||
|
mod->server_fill_rect(mod, 0, 0, mod->width, mod->height);
|
||||||
|
mod->server_end_update(mod);
|
||||||
|
mod->sck = g_tcp_socket();
|
||||||
|
mod->sck_closed = 0;
|
||||||
|
error = g_tcp_connect(mod->sck, "127.0.0.1", "6210");
|
||||||
|
if (error == 0)
|
||||||
|
{
|
||||||
|
g_tcp_set_non_blocking(mod->sck);
|
||||||
|
g_tcp_set_no_delay(mod->sck);
|
||||||
|
}
|
||||||
|
if (error == 0)
|
||||||
|
{
|
||||||
|
make_stream(s);
|
||||||
|
init_stream(s, 8192);
|
||||||
|
s_push_layer(s, iso_hdr, 4);
|
||||||
|
out_uint16_le(s, 103);
|
||||||
|
out_uint32_le(s, 200);
|
||||||
|
out_uint32_le(s, 0);
|
||||||
|
out_uint32_le(s, 0);
|
||||||
|
out_uint32_le(s, mod->width);
|
||||||
|
out_uint32_le(s, mod->height);
|
||||||
|
s_mark_end(s);
|
||||||
|
len = s->end - s->data;
|
||||||
|
s_pop_layer(s, iso_hdr);
|
||||||
|
out_uint32_le(s, len);
|
||||||
|
lib_send(mod, s->data, len);
|
||||||
|
free_stream(s);
|
||||||
|
}
|
||||||
|
DEBUG(("out lib_mod_connect error\r\n"));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
/* return error */
|
||||||
|
int DEFAULT_CC
|
||||||
|
lib_mod_event(struct mod* mod, int msg, long param1, long param2,
|
||||||
|
long param3, long param4)
|
||||||
|
{
|
||||||
|
struct stream* s;
|
||||||
|
int len;
|
||||||
|
int rv;
|
||||||
|
|
||||||
|
DEBUG(("in lib_mod_event\r\n"));
|
||||||
|
make_stream(s);
|
||||||
|
init_stream(s, 8192);
|
||||||
|
s_push_layer(s, iso_hdr, 4);
|
||||||
|
out_uint16_le(s, 103);
|
||||||
|
out_uint32_le(s, msg);
|
||||||
|
out_uint32_le(s, param1);
|
||||||
|
out_uint32_le(s, param2);
|
||||||
|
out_uint32_le(s, param3);
|
||||||
|
out_uint32_le(s, param4);
|
||||||
|
s_mark_end(s);
|
||||||
|
len = s->end - s->data;
|
||||||
|
s_pop_layer(s, iso_hdr);
|
||||||
|
out_uint32_le(s, len);
|
||||||
|
rv = lib_send(mod, s->data, len);
|
||||||
|
free_stream(s);
|
||||||
|
DEBUG(("out lib_mod_event\r\n"));
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
/* return error */
|
||||||
|
int DEFAULT_CC
|
||||||
|
lib_mod_signal(struct mod* mod)
|
||||||
|
{
|
||||||
|
struct stream* s;
|
||||||
|
int num_orders;
|
||||||
|
int index;
|
||||||
|
int rv;
|
||||||
|
int len;
|
||||||
|
int type;
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
|
int cx;
|
||||||
|
int cy;
|
||||||
|
int fgcolor;
|
||||||
|
int opcode;
|
||||||
|
int width;
|
||||||
|
int height;
|
||||||
|
int srcx;
|
||||||
|
int srcy;
|
||||||
|
int len_bmpdata;
|
||||||
|
int style;
|
||||||
|
int x1;
|
||||||
|
int y1;
|
||||||
|
int x2;
|
||||||
|
int y2;
|
||||||
|
char* bmpdata;
|
||||||
|
|
||||||
|
DEBUG(("in lib_mod_signal\r\n"));
|
||||||
|
make_stream(s);
|
||||||
|
init_stream(s, 8192);
|
||||||
|
rv = lib_recv(mod, s->data, 8);
|
||||||
|
if (rv == 0)
|
||||||
|
{
|
||||||
|
in_uint16_le(s, type);
|
||||||
|
in_uint16_le(s, num_orders);
|
||||||
|
in_uint32_le(s, len);
|
||||||
|
if (type == 1)
|
||||||
|
{
|
||||||
|
init_stream(s, len);
|
||||||
|
rv = lib_recv(mod, s->data, len);
|
||||||
|
if (rv == 0)
|
||||||
|
{
|
||||||
|
for (index = 0; index < num_orders; index++)
|
||||||
|
{
|
||||||
|
in_uint16_le(s, type);
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case 1: /* server_begin_update */
|
||||||
|
rv = mod->server_begin_update(mod);
|
||||||
|
break;
|
||||||
|
case 2: /* server_end_update */
|
||||||
|
rv = mod->server_end_update(mod);
|
||||||
|
break;
|
||||||
|
case 3: /* server_fill_rect */
|
||||||
|
in_sint16_le(s, x);
|
||||||
|
in_sint16_le(s, y);
|
||||||
|
in_uint16_le(s, cx);
|
||||||
|
in_uint16_le(s, cy);
|
||||||
|
rv = mod->server_fill_rect(mod, x, y, cx, cy);
|
||||||
|
break;
|
||||||
|
case 4: /* server_screen_blt */
|
||||||
|
in_sint16_le(s, x);
|
||||||
|
in_sint16_le(s, y);
|
||||||
|
in_uint16_le(s, cx);
|
||||||
|
in_uint16_le(s, cy);
|
||||||
|
in_sint16_le(s, srcx);
|
||||||
|
in_sint16_le(s, srcy);
|
||||||
|
rv = mod->server_screen_blt(mod, x, y, cx, cy, srcx, srcy);
|
||||||
|
break;
|
||||||
|
case 5: /* server_paint_rect */
|
||||||
|
in_sint16_le(s, x);
|
||||||
|
in_sint16_le(s, y);
|
||||||
|
in_uint16_le(s, cx);
|
||||||
|
in_uint16_le(s, cy);
|
||||||
|
in_uint32_le(s, len_bmpdata);
|
||||||
|
in_uint8p(s, bmpdata, len_bmpdata);
|
||||||
|
in_uint16_le(s, width);
|
||||||
|
in_uint16_le(s, height);
|
||||||
|
in_sint16_le(s, srcx);
|
||||||
|
in_sint16_le(s, srcy);
|
||||||
|
rv = mod->server_paint_rect(mod, x, y, cx, cy,
|
||||||
|
bmpdata, width, height,
|
||||||
|
srcx, srcy);
|
||||||
|
break;
|
||||||
|
case 10: /* server_set_clip */
|
||||||
|
in_sint16_le(s, x);
|
||||||
|
in_sint16_le(s, y);
|
||||||
|
in_uint16_le(s, cx);
|
||||||
|
in_uint16_le(s, cy);
|
||||||
|
rv = mod->server_set_clip(mod, x, y, cx, cy);
|
||||||
|
break;
|
||||||
|
case 11: /* server_reset_clip */
|
||||||
|
rv = mod->server_reset_clip(mod);
|
||||||
|
break;
|
||||||
|
case 12: /* server_set_fgcolor */
|
||||||
|
in_uint32_le(s, fgcolor);
|
||||||
|
rv = mod->server_set_fgcolor(mod, fgcolor);
|
||||||
|
break;
|
||||||
|
case 14:
|
||||||
|
in_uint16_le(s, opcode);
|
||||||
|
rv = mod->server_set_opcode(mod, opcode);
|
||||||
|
break;
|
||||||
|
case 17:
|
||||||
|
in_uint16_le(s, style);
|
||||||
|
in_uint16_le(s, width);
|
||||||
|
rv = mod->server_set_pen(mod, style, width);
|
||||||
|
break;
|
||||||
|
case 18:
|
||||||
|
in_sint16_le(s, x1);
|
||||||
|
in_sint16_le(s, y1);
|
||||||
|
in_sint16_le(s, x2);
|
||||||
|
in_sint16_le(s, y2);
|
||||||
|
rv = mod->server_draw_line(mod, x1, y1, x2, y2);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
rv = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (rv != 0)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free_stream(s);
|
||||||
|
DEBUG(("out lib_mod_signal\r\n"));
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
/* return error */
|
||||||
|
int DEFAULT_CC
|
||||||
|
lib_mod_end(struct mod* mod)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
/* return error */
|
||||||
|
int DEFAULT_CC
|
||||||
|
lib_mod_set_param(struct mod* mod, char* name, char* value)
|
||||||
|
{
|
||||||
|
if (g_strncasecmp(name, "username", 8) == 0)
|
||||||
|
{
|
||||||
|
g_strncpy(mod->username, value, 255);
|
||||||
|
}
|
||||||
|
else if (g_strncasecmp(name, "password", 8) == 0)
|
||||||
|
{
|
||||||
|
g_strncpy(mod->password, value, 255);
|
||||||
|
}
|
||||||
|
else if (g_strncasecmp(name, "ip", 2) == 0)
|
||||||
|
{
|
||||||
|
g_strncpy(mod->ip, value, 255);
|
||||||
|
}
|
||||||
|
else if (g_strncasecmp(name, "port", 4) == 0)
|
||||||
|
{
|
||||||
|
g_strncpy(mod->port, value, 255);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
struct mod* EXPORT_CC
|
||||||
|
mod_init(void)
|
||||||
|
{
|
||||||
|
struct mod* mod;
|
||||||
|
|
||||||
|
DEBUG(("in mod_init\r\n"));
|
||||||
|
mod = (struct mod*)g_malloc(sizeof(struct mod), 1);
|
||||||
|
mod->size = sizeof(struct mod);
|
||||||
|
mod->handle = (long)mod;
|
||||||
|
mod->mod_connect = lib_mod_connect;
|
||||||
|
mod->mod_start = lib_mod_start;
|
||||||
|
mod->mod_event = lib_mod_event;
|
||||||
|
mod->mod_signal = lib_mod_signal;
|
||||||
|
mod->mod_end = lib_mod_end;
|
||||||
|
mod->mod_set_param = lib_mod_set_param;
|
||||||
|
DEBUG(("out mod_init\r\n"));
|
||||||
|
return mod;
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
int EXPORT_CC
|
||||||
|
mod_exit(struct mod* mod)
|
||||||
|
{
|
||||||
|
DEBUG(("in mod_exit\r\n"));
|
||||||
|
if (mod == 0)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
g_tcp_close(mod->sck);
|
||||||
|
g_free(mod);
|
||||||
|
DEBUG(("out mod_exit\r\n"));
|
||||||
|
return 0;
|
||||||
|
}
|
@ -0,0 +1,86 @@
|
|||||||
|
/*
|
||||||
|
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
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
xrdp: A Remote Desktop Protocol server.
|
||||||
|
Copyright (C) Jay Sorg 2005-2006
|
||||||
|
|
||||||
|
libxup main header file
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* include other h files */
|
||||||
|
#include "arch.h"
|
||||||
|
#include "parse.h"
|
||||||
|
#include "os_calls.h"
|
||||||
|
#include "defines.h"
|
||||||
|
|
||||||
|
struct mod
|
||||||
|
{
|
||||||
|
int size; /* size of this struct */
|
||||||
|
/* client functions */
|
||||||
|
int (*mod_start)(struct mod* v, int w, int h, int bpp);
|
||||||
|
int (*mod_connect)(struct mod* v);
|
||||||
|
int (*mod_event)(struct mod* v, int msg, long param1, long param2,
|
||||||
|
long param3, long param4);
|
||||||
|
int (*mod_signal)(struct mod* v);
|
||||||
|
int (*mod_end)(struct mod* v);
|
||||||
|
int (*mod_set_param)(struct mod* v, char* name, char* value);
|
||||||
|
/* server functions */
|
||||||
|
int (*server_begin_update)(struct mod* v);
|
||||||
|
int (*server_end_update)(struct mod* v);
|
||||||
|
int (*server_fill_rect)(struct mod* v, int x, int y, int cx, int cy);
|
||||||
|
int (*server_screen_blt)(struct mod* v, int x, int y, int cx, int cy,
|
||||||
|
int srcx, int srcy);
|
||||||
|
int (*server_paint_rect)(struct mod* v, int x, int y, int cx, int cy,
|
||||||
|
char* data, int width, int height, int srcx, int srcy);
|
||||||
|
int (*server_set_cursor)(struct mod* v, int x, int y, char* data, char* mask);
|
||||||
|
int (*server_palette)(struct mod* v, int* palette);
|
||||||
|
int (*server_msg)(struct mod* v, char* msg, int code);
|
||||||
|
int (*server_is_term)(struct mod* v);
|
||||||
|
int (*server_set_clip)(struct mod* v, int x, int y, int cx, int cy);
|
||||||
|
int (*server_reset_clip)(struct mod* v);
|
||||||
|
int (*server_set_fgcolor)(struct mod* v, int fgcolor);
|
||||||
|
int (*server_set_bgcolor)(struct mod* v, int bgcolor);
|
||||||
|
int (*server_set_opcode)(struct mod* v, int opcode);
|
||||||
|
int (*server_set_mixmode)(struct mod* v, int mixmode);
|
||||||
|
int (*server_set_brush)(struct mod* v, int x_orgin, int y_orgin,
|
||||||
|
int style, char* pattern);
|
||||||
|
int (*server_set_pen)(struct mod* v, int style,
|
||||||
|
int width);
|
||||||
|
int (*server_draw_line)(struct mod* v, int x1, int y1, int x2, int y2);
|
||||||
|
int (*server_add_char)(struct mod* v, int font, int charactor,
|
||||||
|
int offset, int baseline,
|
||||||
|
int width, int height, char* data);
|
||||||
|
int (*server_draw_text)(struct mod* v, int font,
|
||||||
|
int flags, int mixmode, int clip_left, int clip_top,
|
||||||
|
int clip_right, int clip_bottom,
|
||||||
|
int box_left, int box_top,
|
||||||
|
int box_right, int box_bottom,
|
||||||
|
int x, int y, char* data, int data_len);
|
||||||
|
int (*server_reset)(struct mod* v, int width, int height, int bpp);
|
||||||
|
/* common */
|
||||||
|
long handle; /* pointer to self as long */
|
||||||
|
long wm;
|
||||||
|
long painter;
|
||||||
|
int sck;
|
||||||
|
/* mod data */
|
||||||
|
int width;
|
||||||
|
int height;
|
||||||
|
int sck_closed;
|
||||||
|
char username[256];
|
||||||
|
char password[256];
|
||||||
|
char ip[256];
|
||||||
|
char port[256];
|
||||||
|
};
|
Loading…
Reference in new issue