added a bunch of error checks

ulab-original
jsorg71 20 years ago
parent d2da72f5c9
commit cf6e2abd41

@ -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);
}

@ -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));

@ -22,12 +22,94 @@
#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;

@ -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;
};

@ -428,3 +428,4 @@
#define WM_BUTTON4DOWN 108
#define WM_BUTTON5UP 109
#define WM_BUTTON5DOWN 110
#define WM_INVALIDATE 200

@ -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)

@ -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));
}
}
}

@ -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;
}

@ -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;

@ -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++;

@ -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)

@ -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;
}

@ -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 */

Loading…
Cancel
Save