diff options
author | jsorg71 <jsorg71> | 2005-02-08 03:45:30 +0000 |
---|---|---|
committer | jsorg71 <jsorg71> | 2005-02-08 03:45:30 +0000 |
commit | cf6e2abd416c26105396fa0dd1834e3879fa2e08 (patch) | |
tree | 920d5099051e3b3b036ffa097d554fb3af5bd504 /vnc/vnc.c | |
parent | d2da72f5c96f537a1b8bed9af0f5b648c06e530a (diff) | |
download | xrdp-proprietary-cf6e2abd416c26105396fa0dd1834e3879fa2e08.tar.gz xrdp-proprietary-cf6e2abd416c26105396fa0dd1834e3879fa2e08.zip |
added a bunch of error checks
Diffstat (limited to 'vnc/vnc.c')
-rw-r--r-- | vnc/vnc.c | 715 |
1 files changed, 346 insertions, 369 deletions
@@ -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; |