summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--common/os_calls.c48
-rw-r--r--common/os_calls.h1
-rw-r--r--vnc/vnc.c715
-rw-r--r--vnc/vnc.h12
-rw-r--r--xrdp/constants.h1
-rw-r--r--xrdp/xrdp.c2
-rw-r--r--xrdp/xrdp_bitmap.c12
-rw-r--r--xrdp/xrdp_interface.c8
-rw-r--r--xrdp/xrdp_login_wnd.c2
-rw-r--r--xrdp/xrdp_painter.c12
-rw-r--r--xrdp/xrdp_process.c24
-rw-r--r--xrdp/xrdp_tcp.c2
-rw-r--r--xrdp/xrdp_types.h27
13 files changed, 440 insertions, 426 deletions
diff --git a/common/os_calls.c b/common/os_calls.c
index 6d6acaef..e236088c 100644
--- a/common/os_calls.c
+++ b/common/os_calls.c
@@ -38,6 +38,7 @@
#include <dlfcn.h>
#include <arpa/inet.h>
#include <netdb.h>
+#include <signal.h>
#endif
#include <stdlib.h>
#include <string.h>
@@ -68,6 +69,10 @@ static int g_memid = 0;
static struct xrdp_list* g_memlist = 0;
#endif
+/* forward declarations */
+void g_printf(char* format, ...);
+void pipe_sig(int sig_num);
+
/*****************************************************************************/
int g_init_system(void)
{
@@ -76,13 +81,15 @@ int g_init_system(void)
WSAStartup(2, &w);
InitializeCriticalSection(&g_term_mutex);
+#else
+ signal(SIGPIPE, pipe_sig);
#endif
#ifdef MEMLEAK
g_memlist = xrdp_list_create();
- printf("some info\n\r");
- printf("sizeof xrdp_bitmap is %d\n\r", sizeof(struct xrdp_bitmap));
- printf("sizeof xrdp_wm is %d\n\r", sizeof(struct xrdp_wm));
- printf("sizeof stream is %d\n\r", sizeof(struct stream));
+ g_printf("some info\n\r");
+ g_printf("sizeof xrdp_bitmap is %d\n\r", sizeof(struct xrdp_bitmap));
+ g_printf("sizeof xrdp_wm is %d\n\r", sizeof(struct xrdp_wm));
+ g_printf("sizeof stream is %d\n\r", sizeof(struct stream));
#endif
return 0;
}
@@ -225,7 +232,7 @@ void g_hexdump(char* p, int len)
offset = 0;
while (offset < len)
{
- printf("%04x ", offset);
+ g_printf("%04x ", offset);
thisline = len - offset;
if (thisline > 16)
{
@@ -233,17 +240,17 @@ void g_hexdump(char* p, int len)
}
for (i = 0; i < thisline; i++)
{
- printf("%02x ", line[i]);
+ g_printf("%02x ", line[i]);
}
for (; i < 16; i++)
{
- printf(" ");
+ g_printf(" ");
}
for (i = 0; i < thisline; i++)
{
- printf("%c", (line[i] >= 0x20 && line[i] < 0x7f) ? line[i] : '.');
+ g_printf("%c", (line[i] >= 0x20 && line[i] < 0x7f) ? line[i] : '.');
}
- printf("\n\r");
+ g_printf("\n\r");
offset += thisline;
line += thisline;
}
@@ -509,8 +516,14 @@ int g_tcp_select(int sck1, int sck2)
time.tv_sec = 0;
time.tv_usec = 0;
FD_ZERO(&rfds);
- FD_SET(((unsigned int)sck1), &rfds);
- FD_SET(((unsigned int)sck2), &rfds);
+ if (sck1 > 0)
+ {
+ FD_SET(((unsigned int)sck1), &rfds);
+ }
+ if (sck2 > 0)
+ {
+ FD_SET(((unsigned int)sck2), &rfds);
+ }
max = sck1;
if (sck2 > max)
{
@@ -934,3 +947,16 @@ int g_system(char* aexec)
{
return system(aexec);
}
+
+/*****************************************************************************/
+void g_signal(int sig_num, void (*func)(int))
+{
+ signal(sig_num, func);
+}
+
+/*****************************************************************************/
+void pipe_sig(int sig_num)
+{
+ /* do nothing */
+ g_printf("got SIGPIPE(%d)\n\r", sig_num);
+}
diff --git a/common/os_calls.h b/common/os_calls.h
index 009ed4a4..b2018b67 100644
--- a/common/os_calls.h
+++ b/common/os_calls.h
@@ -86,3 +86,4 @@ int g_load_library(char* in);
int g_free_library(int lib);
void* g_get_proc_address(int lib, char* name);
int g_system(char* aexec);
+void g_signal(int sig_num, void (*func)(int));
diff --git a/vnc/vnc.c b/vnc/vnc.c
index 63eda712..63dbfdb8 100644
--- a/vnc/vnc.c
+++ b/vnc/vnc.c
@@ -23,11 +23,93 @@
#include "vnc.h"
/******************************************************************************/
+/* returns error */
+int lib_recv(struct vnc* v, char* data, int len)
+{
+ int rcvd;
+
+ if (v->sck_closed)
+ {
+ return 1;
+ }
+ while (len > 0)
+ {
+ rcvd = g_tcp_recv(v->sck, data, len, 0);
+ if (rcvd == -1)
+ {
+ if (g_tcp_last_error_would_block(v->sck))
+ {
+ g_sleep(1);
+ }
+ else
+ {
+ return 1;
+ }
+ }
+ else if (rcvd == 0)
+ {
+ v->sck_closed = 1;
+ return 1;
+ }
+ else
+ {
+ data += rcvd;
+ len -= rcvd;
+ }
+ }
+ return 0;
+}
+
+/*****************************************************************************/
+/* returns error */
+int lib_send(struct vnc* v, char* data, int len)
+{
+ int sent;
+
+ if (v->sck_closed)
+ {
+ return 1;
+ }
+ while (len > 0)
+ {
+ sent = g_tcp_send(v->sck, data, len, 0);
+ if (sent == -1)
+ {
+ if (g_tcp_last_error_would_block(v->sck))
+ {
+ g_sleep(1);
+ }
+ else
+ {
+ return 1;
+ }
+ }
+ else if (sent == 0)
+ {
+ v->sck_closed = 1;
+ return 1;
+ }
+ else
+ {
+ data += sent;
+ len -= sent;
+ }
+ }
+ return 0;
+}
+
+/******************************************************************************/
int lib_mod_event(struct vnc* v, int msg, int param1, int param2)
{
struct stream* s;
int key;
+ int error;
+ int x;
+ int y;
+ int cx;
+ int cy;
+ error = 0;
make_stream(s);
if (msg >= 15 && msg <= 16) /* key events */
{
@@ -81,13 +163,7 @@ int lib_mod_event(struct vnc* v, int msg, int param1, int param2)
out_uint8(s, msg == 15); /* down flag */
out_uint8s(s, 2);
out_uint32_be(s, key);
- if (g_tcp_force_send(v->sck, s->data, 8) != 0)
- {
- g_tcp_close(v->sck);
- v->sck = 0;
- free_stream(s);
- return 1;
- }
+ error = lib_send(v, s->data, 8);
}
}
else if (msg >= 100 && msg <= 110) /* mouse events */
@@ -111,16 +187,26 @@ int lib_mod_event(struct vnc* v, int msg, int param1, int param2)
out_uint8(s, v->mod_mouse_state);
out_uint16_be(s, param1);
out_uint16_be(s, param2);
- if (g_tcp_force_send(v->sck, s->data, 6) != 0)
- {
- g_tcp_close(v->sck);
- v->sck = 0;
- free_stream(s);
- return 1;
- }
+ error = lib_send(v, s->data, 6);
+ }
+ else if (msg == 200) /* invalidate */
+ {
+ /* FrambufferUpdateRequest */
+ init_stream(s, 8192);
+ out_uint8(s, 3);
+ out_uint8(s, 0);
+ x = (param1 >> 16) & 0xffff;
+ out_uint16_be(s, x);
+ y = param1 & 0xffff;
+ out_uint16_be(s, y);
+ cx = (param2 >> 16) & 0xffff;
+ out_uint16_be(s, cx);
+ cy = param2 & 0xffff;
+ out_uint16_be(s, cy);
+ error = lib_send(v, s->data, 10);
}
free_stream(s);
- return 0;
+ return error;
}
//******************************************************************************
@@ -130,13 +216,21 @@ int get_pixel_safe(char* data, int x, int y, int width, int height, int bpp)
int shift;
if (x < 0)
+ {
return 0;
+ }
if (y < 0)
+ {
return 0;
+ }
if (x >= width)
+ {
return 0;
+ }
if (y >= height)
+ {
return 0;
+ }
if (bpp == 1)
{
width = (width + 7) / 8;
@@ -150,9 +244,13 @@ int get_pixel_safe(char* data, int x, int y, int width, int height, int bpp)
start = y * width + x / 2;
shift = x % 2;
if (shift == 0)
+ {
return (data[start] & 0xf0) >> 4;
+ }
else
+ {
return data[start] & 0x0f;
+ }
}
else if (bpp == 8)
{
@@ -173,22 +271,34 @@ void set_pixel_safe(char* data, int x, int y, int width, int height, int bpp,
int shift;
if (x < 0)
+ {
return;
+ }
if (y < 0)
+ {
return;
+ }
if (x >= width)
+ {
return;
+ }
if (y >= height)
+ {
return;
+ }
if (bpp == 1)
{
width = (width + 7) / 8;
start = (y * width) + x / 8;
shift = x % 8;
if (pixel & 1)
+ {
data[start] = data[start] | (0x80 >> shift);
+ }
else
+ {
data[start] = data[start] & ~(0x80 >> shift);
+ }
}
else if (bpp == 15 || bpp == 16)
{
@@ -259,134 +369,117 @@ int lib_framebuffer_update(struct vnc* v)
int b;
int data_size;
int need_size;
+ int error;
struct stream* s;
data_size = 0;
data = 0;
+ num_recs = 0;
Bpp = (v->mod_bpp + 7) / 8;
make_stream(s);
init_stream(s, 8192);
- if (g_tcp_force_recv(v->sck, s->data, 3) != 0)
+ error = lib_recv(v, s->data, 3);
+ if (error == 0)
{
- free_stream(s);
- return 1;
+ in_uint8s(s, 1);
+ in_uint16_be(s, num_recs);
+ error = v->server_begin_update(v);
}
- in_uint8s(s, 1);
- in_uint16_be(s, num_recs);
-
- v->server_begin_update(v);
for (i = 0; i < num_recs; i++)
{
- init_stream(s, 8192);
- if (g_tcp_force_recv(v->sck, s->data, 12) != 0)
+ if (error != 0)
{
- free_stream(s);
- return 1;
+ break;
}
- in_uint16_be(s, x);
- in_uint16_be(s, y);
- in_uint16_be(s, cx);
- in_uint16_be(s, cy);
- in_uint32_be(s, encoding);
- if (encoding == 0) /* raw */
- {
- need_size = cx * cy * Bpp;
- if (need_size > data_size)
- {
- g_free(data);
- data = (char*)g_malloc(need_size, 0);
- data_size = need_size;
- }
- if (g_tcp_force_recv(v->sck, data, cx * cy * Bpp) != 0)
- {
- g_free(data);
- free_stream(s);
- return 1;
- }
- if (v->server_paint_rect(v, x, y, cx, cy, data) != 0)
- {
- g_free(data);
- free_stream(s);
- return 1;
- }
- }
- else if (encoding == 1) /* copy rect */
- {
- init_stream(s, 8192);
- if (g_tcp_force_recv(v->sck, s->data, 4) != 0)
- {
- g_free(data);
- free_stream(s);
- return 1;
- }
- in_uint16_be(s, srcx);
- in_uint16_be(s, srcy);
- if (v->server_screen_blt(v, x, y, cx, cy, srcx, srcy) != 0)
+ init_stream(s, 8192);
+ error = lib_recv(v, s->data, 12);
+ if (error == 0)
+ {
+ in_uint16_be(s, x);
+ in_uint16_be(s, y);
+ in_uint16_be(s, cx);
+ in_uint16_be(s, cy);
+ in_uint32_be(s, encoding);
+ if (encoding == 0) /* raw */
{
- g_free(data);
- free_stream(s);
- return 1;
+ need_size = cx * cy * Bpp;
+ if (need_size > data_size)
+ {
+ g_free(data);
+ data = (char*)g_malloc(need_size, 0);
+ data_size = need_size;
+ }
+ error = lib_recv(v, data, need_size);
+ /*g_printf("%d %d\n", i, need_size);*/
+ if (error == 0)
+ {
+ error = v->server_paint_rect(v, x, y, cx, cy, data);
+ }
}
- }
- else if (encoding == 0xffffff11) /* cursor */
- {
- g_memset(cursor_data, 0, 32 * (32 * 3));
- g_memset(cursor_mask, 0, 32 * (32 / 8));
- init_stream(s, 8192);
- if (g_tcp_force_recv(v->sck, s->data,
- cx * cy * Bpp + ((cx + 7) / 8) * cy) != 0)
+ else if (encoding == 1) /* copy rect */
{
- g_free(data);
- free_stream(s);
- return 1;
+ init_stream(s, 8192);
+ error = lib_recv(v, s->data, 4);
+ if (error == 0)
+ {
+ in_uint16_be(s, srcx);
+ in_uint16_be(s, srcy);
+ error = v->server_screen_blt(v, x, y, cx, cy, srcx, srcy);
+ }
}
- in_uint8p(s, d1, cx * cy * Bpp);
- in_uint8p(s, d2, ((cx + 7) / 8) * cy);
- for (j = 0; j < 32; j++)
+ else if (encoding == 0xffffff11) /* cursor */
{
- for (k = 0; k < 32; k++)
+ g_memset(cursor_data, 0, 32 * (32 * 3));
+ g_memset(cursor_mask, 0, 32 * (32 / 8));
+ init_stream(s, 8192);
+ error = lib_recv(v, s->data, cx * cy * Bpp + ((cx + 7) / 8) * cy);
+ if (error == 0)
{
- pixel = get_pixel_safe(d2, k, 31 - j, cx, cy, 1);
- set_pixel_safe(cursor_mask, k, j, 32, 32, 1, !pixel);
- if (pixel)
+ in_uint8p(s, d1, cx * cy * Bpp);
+ in_uint8p(s, d2, ((cx + 7) / 8) * cy);
+ for (j = 0; j < 32; j++)
{
- pixel = get_pixel_safe(d1, k, 31 - j, cx, cy, v->mod_bpp);
- split_color(pixel, &r, &g, &b, v->mod_bpp, v->palette);
- pixel = make_color(r, g, b, 24);
- set_pixel_safe(cursor_data, k, j, 32, 32, 24, pixel);
+ for (k = 0; k < 32; k++)
+ {
+ pixel = get_pixel_safe(d2, k, 31 - j, cx, cy, 1);
+ set_pixel_safe(cursor_mask, k, j, 32, 32, 1, !pixel);
+ if (pixel)
+ {
+ pixel = get_pixel_safe(d1, k, 31 - j, cx, cy, v->mod_bpp);
+ split_color(pixel, &r, &g, &b, v->mod_bpp, v->palette);
+ pixel = make_color(r, g, b, 24);
+ set_pixel_safe(cursor_data, k, j, 32, 32, 24, pixel);
+ }
+ }
}
+ error = v->server_set_cursor(v, x, y, cursor_data, cursor_mask);
}
}
- if (v->server_set_cursor(v, x, y, cursor_data, cursor_mask) != 0)
+ else
{
- g_free(data);
- free_stream(s);
- return 1;
+ g_printf("error in lib_framebuffer_update\n\r");
}
}
- else
- {
- g_printf("error in lib_framebuffer_update\n\r");
- }
}
- v->server_end_update(v);
+ if (error == 0)
+ {
+ error = v->server_end_update(v);
+ }
g_free(data);
-
- /* FrambufferUpdateRequest */
- init_stream(s, 8192);
- out_uint8(s, 3);
- out_uint8(s, 1);
- out_uint16_be(s, 0);
- out_uint16_be(s, 0);
- out_uint16_be(s, v->mod_width);
- out_uint16_be(s, v->mod_height);
- if (g_tcp_force_send(v->sck, s->data, 10) != 0)
- {
- free_stream(s);
- return 1;
+ if (error == 0)
+ {
+ /* FrambufferUpdateRequest */
+ init_stream(s, 8192);
+ out_uint8(s, 3);
+ out_uint8(s, 1);
+ out_uint16_be(s, 0);
+ out_uint16_be(s, 0);
+ out_uint16_be(s, v->mod_width);
+ out_uint16_be(s, v->mod_height);
+ error = lib_send(v, s->data, 10);
}
free_stream(s);
- return 0;
+ return error;
}
/******************************************************************************/
@@ -394,24 +487,20 @@ int lib_clip_data(struct vnc* v)
{
struct stream* s;
int size;
+ int error;
make_stream(s);
init_stream(s, 8192);
- if (g_tcp_force_recv(v->sck, s->data, 7) != 0)
- {
- free_stream(s);
- return 1;
- }
- in_uint8s(s, 3);
- in_uint32_be(s, size);
- init_stream(s, 8192);
- if (g_tcp_force_recv(v->sck, s->data, size) != 0)
+ error = lib_recv(v, s->data, 7);
+ if (error == 0)
{
- free_stream(s);
- return 1;
+ in_uint8s(s, 3);
+ in_uint32_be(s, size);
+ init_stream(s, 8192);
+ error = lib_recv(v, s->data, size);
}
free_stream(s);
- return 0;
+ return error;
}
/******************************************************************************/
@@ -424,83 +513,72 @@ int lib_palette_update(struct vnc* v)
int r;
int g;
int b;
+ int error;
make_stream(s);
init_stream(s, 8192);
- if (g_tcp_force_recv(v->sck, s->data, 5) != 0)
+ error = lib_recv(v, s->data, 5);
+ if (error == 0)
{
- free_stream(s);
- return 1;
+ in_uint8s(s, 1);
+ in_uint16_be(s, first_color);
+ in_uint16_be(s, num_colors);
+ init_stream(s, 8192);
+ error = lib_recv(v, s->data, num_colors * 6);
}
- in_uint8s(s, 1);
- in_uint16_be(s, first_color);
- in_uint16_be(s, num_colors);
- init_stream(s, 8192);
- if (g_tcp_force_recv(v->sck, s->data, num_colors * 6) != 0)
+ if (error == 0)
{
- free_stream(s);
- return 1;
+ for (i = 0; i < num_colors; i++)
+ {
+ in_uint16_be(s, r);
+ in_uint16_be(s, g);
+ in_uint16_be(s, b);
+ r = r >> 8;
+ g = g >> 8;
+ b = b >> 8;
+ v->palette[first_color + i] = (r << 16) | (g << 8) | b;
+ }
+ error = v->server_begin_update(v);
+ }
+ if (error == 0)
+ {
+ error = v->server_palette(v, v->palette);
}
- for (i = 0; i < num_colors; i++)
+ if (error == 0)
{
- in_uint16_be(s, r);
- in_uint16_be(s, g);
- in_uint16_be(s, b);
- r = r >> 8;
- g = g >> 8;
- b = b >> 8;
- v->palette[first_color + i] = (r << 16) | (g << 8) | b;
+ error = v->server_end_update(v);
}
- v->server_begin_update(v);
- v->server_palette(v, v->palette);
- v->server_end_update(v);
free_stream(s);
- return 0;
+ return error;
}
/******************************************************************************/
int lib_mod_signal(struct vnc* v)
{
char type;
+ int error;
- if (g_tcp_force_recv(v->sck, &type, 1) != 0)
- {
- g_tcp_close(v->sck);
- v->sck = 0;
- return 1;
- }
- if (type == 0) /* framebuffer update */
+ error = lib_recv(v, &type, 1);
+ if (error == 0)
{
- if (lib_framebuffer_update(v) != 0)
+ if (type == 0) /* framebuffer update */
{
- g_tcp_close(v->sck);
- v->sck = 0;
- return 1;
+ error = lib_framebuffer_update(v);
}
- }
- else if (type == 1) /* palette */
- {
- if (lib_palette_update(v) != 0)
+ else if (type == 1) /* palette */
{
- g_tcp_close(v->sck);
- v->sck = 0;
- return 1;
+ error = lib_palette_update(v);
}
- }
- else if (type == 3) /* clipboard */
- {
- if (lib_clip_data(v) != 0)
+ else if (type == 3) /* clipboard */
{
- g_tcp_close(v->sck);
- v->sck = 0;
- return 1;
+ error = lib_clip_data(v);
+ }
+ else
+ {
+ g_printf("unknown in lib_mod_signal %d\n\r", type);
}
}
- else
- {
- g_printf("unknown in lib_mod_signal %d\n\r", type);
- }
- return 0;
+ return error;
}
/******************************************************************************/
@@ -536,7 +614,6 @@ int lib_mod_connect(struct vnc* v)
int error;
int i;
int check_sec_result;
- int sck;
int version;
int size;
int code;
@@ -554,8 +631,9 @@ int lib_mod_connect(struct vnc* v)
i = 0;
error = 0;
init_stream(s, 8192);
- sck = g_tcp_socket();
- if (g_tcp_connect(sck, v->ip, "3350") == 0)
+ v->sck = g_tcp_socket();
+ v->sck_closed = 0;
+ if (g_tcp_connect(v->sck, v->ip, "3350") == 0)
{
s_push_layer(s, channel_hdr, 8);
out_uint16_be(s, 0); // code
@@ -572,49 +650,37 @@ int lib_mod_connect(struct vnc* v)
s_pop_layer(s, channel_hdr);
out_uint32_be(s, 0); // version
out_uint32_be(s, s->end - s->data); // size
- if (g_tcp_force_send(sck, s->data, s->end - s->data) != 0)
+ error = lib_send(v, s->data, s->end - s->data);
+ if (error == 0)
{
- g_tcp_close(sck);
- free_stream(s);
- return 7;
+ init_stream(s, 8192);
+ error = lib_recv(v, s->data, 8);
}
- init_stream(s, 8192);
- if (g_tcp_force_recv(sck, s->data, 8) == 0)
+ if (error == 0)
{
in_uint32_be(s, version);
in_uint32_be(s, size);
init_stream(s, 8192);
- if (g_tcp_force_recv(sck, s->data, size - 8) == 0)
+ error = lib_recv(v, s->data, size - 8);
+ }
+ if (error == 0)
+ {
+ if (version == 0)
{
- if (version == 0)
+ in_uint16_be(s, code);
+ if (code == 3)
{
- in_uint16_be(s, code);
- if (code == 3)
+ in_uint16_be(s, ok);
+ in_uint16_be(s, display);
+ if (ok)
{
- in_uint16_be(s, ok);
- in_uint16_be(s, display);
- if (ok)
- {
- i = display;
- }
+ i = display;
}
}
}
- else
- {
- g_tcp_close(sck);
- free_stream(s);
- return 7;
- }
- }
- else
- {
- g_tcp_close(sck);
- free_stream(s);
- return 7;
}
}
- g_tcp_close(sck);
+ g_tcp_close(v->sck);
if (error != 0 || i == 0)
{
free_stream(s);
@@ -629,128 +695,87 @@ int lib_mod_connect(struct vnc* v)
}
make_stream(pixel_format);
v->sck = g_tcp_socket();
+ v->sck_closed = 0;
error = g_tcp_connect(v->sck, v->ip, con_port);
if (error == 0)
{
g_tcp_set_non_blocking(v->sck);
+ g_tcp_set_no_delay(v->sck);
/* protocal version */
init_stream(s, 8192);
- if (g_tcp_force_recv(v->sck, s->data, 12) != 0)
+ error = lib_recv(v, s->data, 12);
+ if (error == 0)
{
- g_tcp_close(v->sck);
- v->sck = 0;
- free_stream(s);
- free_stream(pixel_format);
- return 7;
- }
- if (g_tcp_force_send(v->sck, "RFB 003.003\n", 12) != 0)
- {
- g_tcp_close(v->sck);
- v->sck = 0;
- free_stream(s);
- free_stream(pixel_format);
- return 7;
+ error = lib_send(v, "RFB 003.003\n", 12);
}
/* sec type */
- init_stream(s, 8192);
- if (g_tcp_force_recv(v->sck, s->data, 4) != 0)
+ if (error == 0)
{
- g_tcp_close(v->sck);
- v->sck = 0;
- free_stream(s);
- free_stream(pixel_format);
- return 7;
- }
- in_uint32_be(s, i);
- if (i == 1) /* none */
- {
- check_sec_result = 0;
+ init_stream(s, 8192);
+ error = lib_recv(v, s->data, 4);
}
- else if (i == 2) /* dec the password and the server random */
+ if (error == 0)
{
- init_stream(s, 8192);
- if (g_tcp_force_recv(v->sck, s->data, 16) != 0)
+ in_uint32_be(s, i);
+ if (i == 1) /* none */
+ {
+ check_sec_result = 0;
+ }
+ else if (i == 2) /* dec the password and the server random */
{
- g_tcp_close(v->sck);
- v->sck = 0;
- free_stream(s);
- free_stream(pixel_format);
- return 7;
+ init_stream(s, 8192);
+ error = lib_recv(v, s->data, 16);
+ if (error == 0)
+ {
+ rfbEncryptBytes((unsigned char*)s->data, v->password);
+ error = lib_send(v, s->data, 16);
+ }
}
- rfbEncryptBytes((unsigned char*)s->data, v->password);
- if (g_tcp_force_send(v->sck, s->data, 16) != 0)
+ else
{
- g_tcp_close(v->sck);
- v->sck = 0;
- free_stream(s);
- free_stream(pixel_format);
- return 7;
+ error = 1;
}
}
- else
- {
- error = 1;
- }
}
if (error == 0 && check_sec_result)
{
/* sec result */
init_stream(s, 8192);
- if (g_tcp_force_recv(v->sck, s->data, 4) != 0)
+ error = lib_recv(v, s->data, 4);
+ if (error == 0)
{
- g_tcp_close(v->sck);
- v->sck = 0;
- free_stream(s);
- free_stream(pixel_format);
- return 7;
- }
- in_uint32_be(s, i);
- if (i != 0)
- {
- error = 2;
+ in_uint32_be(s, i);
+ if (i != 0)
+ {
+ error = 2;
+ }
}
}
if (error == 0)
{
init_stream(s, 8192);
s->data[0] = 1;
- if (g_tcp_force_send(v->sck, s->data, 1) != 0) /* share flag */
- {
- g_tcp_close(v->sck);
- v->sck = 0;
- free_stream(s);
- free_stream(pixel_format);
- return 7;
- }
- if (g_tcp_force_recv(v->sck, s->data, 4) != 0) /* server init */
- {
- g_tcp_close(v->sck);
- v->sck = 0;
- free_stream(s);
- free_stream(pixel_format);
- return 7;
- }
+ error = lib_send(v, s->data, 1); /* share flag */
+ }
+ if (error == 0)
+ {
+ error = lib_recv(v, s->data, 4); /* server init */
+ }
+ if (error == 0)
+ {
in_uint16_be(s, v->mod_width);
in_uint16_be(s, v->mod_height);
init_stream(pixel_format, 8192);
- if (g_tcp_force_recv(v->sck, pixel_format->data, 16) != 0)
- {
- g_tcp_close(v->sck);
- v->sck = 0;
- free_stream(s);
- free_stream(pixel_format);
- return 7;
- }
+ error = lib_recv(v, pixel_format->data, 16);
+ }
+ if (error == 0)
+ {
in_uint8(pixel_format, v->mod_bpp);
init_stream(s, 8192);
- if (g_tcp_force_recv(v->sck, s->data, 4) != 0) /* name len */
- {
- g_tcp_close(v->sck);
- v->sck = 0;
- free_stream(s);
- free_stream(pixel_format);
- return 7;
- }
+ error = lib_recv(v, s->data, 4); /* name len */
+ }
+ if (error == 0)
+ {
in_uint32_be(s, i);
if (i > 255 || i < 0)
{
@@ -758,18 +783,11 @@ int lib_mod_connect(struct vnc* v)
}
else
{
- if (g_tcp_force_recv(v->sck, v->mod_name, i) != 0)
- {
- g_tcp_close(v->sck);
- v->sck = 0;
- free_stream(s);
- free_stream(pixel_format);
- return 7;
- }
+ error = lib_recv(v, v->mod_name, i);
v->mod_name[i] = 0;
}
- /* should be connected */
}
+ /* should be connected */
if (error == 0)
{
/* SetPixelFormat */
@@ -794,14 +812,10 @@ int lib_mod_connect(struct vnc* v)
out_uint8s(pixel_format, 3); /* pad */
}
out_uint8a(s, pixel_format->data, 16);
- if (g_tcp_force_send(v->sck, s->data, 20) != 0)
- {
- g_tcp_close(v->sck);
- v->sck = 0;
- free_stream(s);
- free_stream(pixel_format);
- return 7;
- }
+ error = lib_send(v, s->data, 20);
+ }
+ if (error == 0)
+ {
/* SetEncodings */
init_stream(s, 8192);
out_uint8(s, 2);
@@ -810,14 +824,10 @@ int lib_mod_connect(struct vnc* v)
out_uint32_be(s, 0); /* raw */
out_uint32_be(s, 1); /* copy rect */
out_uint32_be(s, 0xffffff11); /* cursor */
- if (g_tcp_force_send(v->sck, s->data, 4 + 3 * 4) != 0)
- {
- g_tcp_close(v->sck);
- v->sck = 0;
- free_stream(s);
- free_stream(pixel_format);
- return 7;
- }
+ error = lib_send(v, s->data, 4 + 3 * 4);
+ }
+ if (error == 0)
+ {
/* FrambufferUpdateRequest */
init_stream(s, 8192);
out_uint8(s, 3);
@@ -826,14 +836,7 @@ int lib_mod_connect(struct vnc* v)
out_uint16_be(s, 0);
out_uint16_be(s, v->mod_width);
out_uint16_be(s, v->mod_height);
- if (g_tcp_force_send(v->sck, s->data, 10) != 0)
- {
- g_tcp_close(v->sck);
- v->sck = 0;
- free_stream(s);
- free_stream(pixel_format);
- return 7;
- }
+ error = lib_send(v, s->data, 10);
}
if (error == 0)
{
@@ -843,46 +846,19 @@ int lib_mod_connect(struct vnc* v)
error = 4;
}
}
- /* set almost null cursor */
- g_memset(cursor_data, 0, 32 * (32 * 3));
- g_memset(cursor_data + (32 * (32 * 3) - 1 * 32 * 3), 0xff, 9);
- g_memset(cursor_data + (32 * (32 * 3) - 2 * 32 * 3), 0xff, 9);
- g_memset(cursor_data + (32 * (32 * 3) - 3 * 32 * 3), 0xff, 9);
- g_memset(cursor_mask, 0xff, 32 * (32 / 8));
- v->server_set_cursor(v, 0, 0, cursor_data, cursor_mask);
- free_stream(s);
- free_stream(pixel_format);
- if (error != 0)
+ if (error == 0)
{
- g_tcp_close(v->sck);
- v->sck = 0;
- }
- return error;
-}
-
-/******************************************************************************/
-int lib_mod_invalidate(struct vnc* v, int x, int y, int cx, int cy)
-{
- struct stream* s;
-
- make_stream(s);
- /* FrambufferUpdateRequest */
- init_stream(s, 8192);
- out_uint8(s, 3);
- out_uint8(s, 0);
- out_uint16_be(s, x);
- out_uint16_be(s, y);
- out_uint16_be(s, cx);
- out_uint16_be(s, cy);
- if (g_tcp_force_send(v->sck, s->data, 10) != 0)
- {
- free_stream(s);
- g_tcp_close(v->sck);
- v->sck = 0;
- return 1;
+ /* set almost null cursor */
+ g_memset(cursor_data, 0, 32 * (32 * 3));
+ g_memset(cursor_data + (32 * (32 * 3) - 1 * 32 * 3), 0xff, 9);
+ g_memset(cursor_data + (32 * (32 * 3) - 2 * 32 * 3), 0xff, 9);
+ g_memset(cursor_data + (32 * (32 * 3) - 3 * 32 * 3), 0xff, 9);
+ g_memset(cursor_mask, 0xff, 32 * (32 / 8));
+ error = v->server_set_cursor(v, 0, 0, cursor_data, cursor_mask);
}
free_stream(s);
- return 0;
+ free_stream(pixel_format);
+ return error;
}
/******************************************************************************/
@@ -924,12 +900,11 @@ int mod_init()
v = (struct vnc*)g_malloc(sizeof(struct vnc), 1);
/* set client functions */
v->size = sizeof(struct vnc);
- v->handle = (int)v;
+ v->handle = (long)v;
v->mod_connect = lib_mod_connect;
v->mod_start = lib_mod_start;
v->mod_event = lib_mod_event;
v->mod_signal = lib_mod_signal;
- v->mod_invalidate = lib_mod_invalidate;
v->mod_end = lib_mod_end;
v->mod_set_param = lib_mod_set_param;
return (int)v;
@@ -939,7 +914,9 @@ int mod_init()
int mod_exit(struct vnc* v)
{
if (v == 0)
+ {
return 0;
+ }
g_tcp_close(v->sck);
g_free(v);
return 0;
diff --git a/vnc/vnc.h b/vnc/vnc.h
index c2963011..9462ec61 100644
--- a/vnc/vnc.h
+++ b/vnc/vnc.h
@@ -14,7 +14,7 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
xrdp: A Remote Desktop Protocol server.
- Copyright (C) Jay Sorg 2004
+ Copyright (C) Jay Sorg 2004-2005
libvnc
@@ -35,10 +35,8 @@ struct vnc
int (*mod_connect)(struct vnc* v);
int (*mod_event)(struct vnc* v, int msg, int param1, int param2);
int (*mod_signal)(struct vnc* v);
- int (*mod_invalidate)(struct vnc* v, int x, int y, int cx, int cy);
int (*mod_end)(struct vnc* v);
int (*mod_set_param)(struct vnc* v, char* name, char* value);
- int d1[93];
/* server functions */
int (*server_begin_update)(struct vnc* v);
int (*server_end_update)(struct vnc* v);
@@ -51,11 +49,10 @@ struct vnc
int (*server_set_cursor)(struct vnc* v, int x, int y, char* data, char* mask);
int (*server_palette)(struct vnc* v, int* palette);
int (*server_error_popup)(struct vnc* v, char* error, char* caption);
- int d2[92];
/* common */
- int handle; /* pointer to self as int */
- int wm;
- int painter;
+ long handle; /* pointer to self as int */
+ long wm;
+ long painter;
int sck;
/* mod data */
int server_width;
@@ -72,4 +69,5 @@ struct vnc
char password[256];
char ip[256];
char port[256];
+ int sck_closed;
};
diff --git a/xrdp/constants.h b/xrdp/constants.h
index dd473ccc..2ee617d8 100644
--- a/xrdp/constants.h
+++ b/xrdp/constants.h
@@ -428,3 +428,4 @@
#define WM_BUTTON4DOWN 108
#define WM_BUTTON5UP 109
#define WM_BUTTON5DOWN 110
+#define WM_INVALIDATE 200
diff --git a/xrdp/xrdp.c b/xrdp/xrdp.c
index 41ec3971..bff20372 100644
--- a/xrdp/xrdp.c
+++ b/xrdp/xrdp.c
@@ -34,7 +34,7 @@ THREAD_RV THREAD_CC xrdp_listen_run(void* in_val)
return 0;
}
-//#define CLEAN_CLOSE
+#define CLEAN_CLOSE
/*****************************************************************************/
int main(int argc, char** argv)
diff --git a/xrdp/xrdp_bitmap.c b/xrdp/xrdp_bitmap.c
index de0c0d57..9080758b 100644
--- a/xrdp/xrdp_bitmap.c
+++ b/xrdp/xrdp_bitmap.c
@@ -891,14 +891,16 @@ int xrdp_bitmap_invalidate(struct xrdp_bitmap* self, struct xrdp_rect* rect)
{
if (self->wm->mod != 0)
{
- if (self->wm->mod->mod_invalidate != 0)
+ if (self->wm->mod->mod_event != 0)
{
if (rect != 0)
{
- self->wm->mod->mod_invalidate(self->wm->mod,
- rect->left, rect->top,
- rect->right - rect->left,
- rect->bottom - rect->top);
+ x = rect->left;
+ y = rect->top;
+ w = rect->right - rect->left;
+ h = rect->bottom - rect->top;
+ self->wm->mod->mod_event(self->wm->mod, WM_INVALIDATE, /* 200 */
+ MAKELONG(x, y), MAKELONG(w, h));
}
}
}
diff --git a/xrdp/xrdp_interface.c b/xrdp/xrdp_interface.c
index 55b1de55..388e017e 100644
--- a/xrdp/xrdp_interface.c
+++ b/xrdp/xrdp_interface.c
@@ -50,7 +50,7 @@ int server_init(void)
g_rdp_process = 0;
make_stream(g_s);
init_stream(g_s, 8192);
- g_mod.handle = (int)(&g_mod);
+ g_mod.handle = (long)(&g_mod);
g_mod.mod_event = mod_event;
return 0;
}
@@ -107,7 +107,7 @@ int server_loop(int sck)
}
if (g_mod.wm == 0)
{
- g_mod.wm = (int)(g_rdp_process->wm);
+ g_mod.wm = (long)(g_rdp_process->wm);
}
}
init_stream(g_s, 8192);
@@ -134,7 +134,7 @@ int server_begin_update(void)
wm = (struct xrdp_wm*)g_mod.wm;
p = xrdp_painter_create(wm);
xrdp_painter_begin_update(p);
- g_mod.painter = (int)p;
+ g_mod.painter = (long)p;
return 0;
}
@@ -224,7 +224,7 @@ int server_begin_update(struct xrdp_mod* mod)
wm = (struct xrdp_wm*)mod->wm;
p = xrdp_painter_create(wm);
xrdp_painter_begin_update(p);
- mod->painter = (int)p;
+ mod->painter = (long)p;
return 0;
}
diff --git a/xrdp/xrdp_login_wnd.c b/xrdp/xrdp_login_wnd.c
index b6fa0d19..e2320dfa 100644
--- a/xrdp/xrdp_login_wnd.c
+++ b/xrdp/xrdp_login_wnd.c
@@ -101,7 +101,7 @@ int xrdp_wm_setup_mod(struct xrdp_wm* self,
}
if (self->mod != 0)
{
- self->mod->wm = (int)self;
+ self->mod->wm = (long)self;
self->mod->server_begin_update = server_begin_update;
self->mod->server_end_update = server_end_update;
self->mod->server_fill_rect = server_fill_rect;
diff --git a/xrdp/xrdp_painter.c b/xrdp/xrdp_painter.c
index 7fcb7170..1863db4c 100644
--- a/xrdp/xrdp_painter.c
+++ b/xrdp/xrdp_painter.c
@@ -555,10 +555,20 @@ int xrdp_painter_draw_text(struct xrdp_painter* self,
draw_rect.right--;
draw_rect.bottom--;
flags = 0x03; /* 0x73; TEXT2_IMPLICIT_X and something else */
+ DEBUG(("sending text order \
+font %d flags %d mixmode %d color1 %d color2 %d \
+clip left %d clip top %d clip right %d clip bottom %d \
+box left %d box top %d box right %d box bottom %d \
+x %d y %d len %d rect %d %d %d %d\n\r",
+ f, flags, 0, font->color, 0, x, y, x + total_width,
+ y + total_height, 0, 0, 0, 0, x1, y1, len,
+ draw_rect.left, draw_rect.top,
+ draw_rect.right, draw_rect.bottom));
xrdp_orders_text(self->orders, f, flags, 0,
font->color, 0,
x, y, x + total_width, y + total_height,
- 0, 0, 0, 0, x1, y1, data, len * 2, &draw_rect);
+ 0, 0, 0, 0,
+ x1, y1, data, len * 2, &draw_rect);
}
}
k++;
diff --git a/xrdp/xrdp_process.c b/xrdp/xrdp_process.c
index 91531688..72c39ff5 100644
--- a/xrdp/xrdp_process.c
+++ b/xrdp/xrdp_process.c
@@ -105,7 +105,7 @@ int xrdp_process_loop(struct xrdp_process* self, struct stream* s)
int xrdp_process_main_loop(struct xrdp_process* self)
{
#ifndef XRDP_LIB
- int i;
+ int sel_r;
struct stream* s;
make_stream(s);
@@ -117,8 +117,16 @@ int xrdp_process_main_loop(struct xrdp_process* self)
{
while (!g_is_term() && !self->term)
{
- i = g_tcp_select(self->sck, self->app_sck);
- if (i & 1)
+ sel_r = g_tcp_select(self->sck, self->app_sck);
+ if (sel_r == 0) /* no data on any stream */
+ {
+ g_sleep(10);
+ }
+ else if (sel_r < 0)
+ {
+ break;
+ }
+ if (sel_r & 1)
{
init_stream(s, 8192);
if (xrdp_process_loop(self, s) != 0)
@@ -126,7 +134,7 @@ int xrdp_process_main_loop(struct xrdp_process* self)
break;
}
}
- if (i & 2) /* mod socket fired */
+ if (sel_r & 2) /* mod socket fired */
{
if (self->wm->mod == 0)
{
@@ -141,14 +149,6 @@ int xrdp_process_main_loop(struct xrdp_process* self)
break;
}
}
- if (i == 0) /* no data on any stream */
- {
- g_sleep(10);
- }
- else if (i < 0)
- {
- break;
- }
}
}
if (self->wm->mod != 0)
diff --git a/xrdp/xrdp_tcp.c b/xrdp/xrdp_tcp.c
index eed5278e..996e6932 100644
--- a/xrdp/xrdp_tcp.c
+++ b/xrdp/xrdp_tcp.c
@@ -77,6 +77,7 @@ int xrdp_tcp_recv(struct xrdp_tcp* self, struct stream* s, int len)
}
else
{
+ self->sck_closed = 1;
DEBUG((" error = -1 in xrdp_tcp_recv socket %d\n\r", self->sck));
return 1;
}
@@ -128,6 +129,7 @@ int xrdp_tcp_send(struct xrdp_tcp* self, struct stream* s)
}
else
{
+ self->sck_closed = 1;
DEBUG((" error = -1 in xrdp_tcp_send socket %d\n\r", self->sck));
return 1;
}
diff --git a/xrdp/xrdp_types.h b/xrdp/xrdp_types.h
index 2036b154..84764abc 100644
--- a/xrdp/xrdp_types.h
+++ b/xrdp/xrdp_types.h
@@ -29,10 +29,8 @@ struct xrdp_mod
int (*mod_connect)(struct xrdp_mod* v);
int (*mod_event)(struct xrdp_mod* v, int msg, int param1, int param2);
int (*mod_signal)(struct xrdp_mod* v);
- int (*mod_invalidate)(struct xrdp_mod* v, int x, int y, int cx, int cy);
int (*mod_end)(struct xrdp_mod* v);
int (*mod_set_param)(struct xrdp_mod* v, char* name, char* value);
- int d1[93];
/* server functions */
int (*server_begin_update)(struct xrdp_mod* v);
int (*server_end_update)(struct xrdp_mod* v);
@@ -45,11 +43,10 @@ struct xrdp_mod
int (*server_set_pointer)(struct xrdp_mod* v, int x, int y, char* data, char* mask);
int (*server_palette)(struct xrdp_mod* v, int* palette);
int (*server_error_popup)(struct xrdp_mod* v, char* error, char* caption);
- int d2[92];
/* common */
- int handle; /* pointer to self as int */
- int wm; /* struct xrdp_wm* */
- int painter;
+ long handle; /* pointer to self as int */
+ long wm; /* struct xrdp_wm* */
+ long painter;
int sck;
};
@@ -63,17 +60,17 @@ struct xrdp_mem
/* header for bmp file */
struct xrdp_bmp_header
{
- long size;
- long image_width;
- long image_height;
+ int size;
+ int image_width;
+ int image_height;
short planes;
short bit_count;
- long compression;
- long image_size;
- long x_pels_per_meter;
- long y_pels_per_meter;
- long clr_used;
- long clr_important;
+ int compression;
+ int image_size;
+ int x_pels_per_meter;
+ int y_pels_per_meter;
+ int clr_used;
+ int clr_important;
};
/* list */