summaryrefslogtreecommitdiffstats
path: root/xup
diff options
context:
space:
mode:
Diffstat (limited to 'xup')
-rw-r--r--xup/xup.c1419
-rw-r--r--xup/xup.h40
2 files changed, 758 insertions, 701 deletions
diff --git a/xup/xup.c b/xup/xup.c
index 3c95c1e0..15498e64 100644
--- a/xup/xup.c
+++ b/xup/xup.c
@@ -1,828 +1,887 @@
-/*
- 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-2012
-
- libxup main file
-
-*/
+/**
+ * xrdp: A Remote Desktop Protocol server.
+ *
+ * Copyright (C) Jay Sorg 2004-2012
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * libxup main file
+ */
#include "xup.h"
/******************************************************************************/
/* returns error */
int DEFAULT_CC
-lib_recv(struct mod* mod, char* data, int len)
+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)
+ int rcvd;
+
+ if (mod->sck_closed)
{
- if (g_tcp_last_error_would_block(mod->sck))
- {
- if (mod->server_is_term(mod))
- {
- return 1;
- }
- g_tcp_can_recv(mod->sck, 10);
- }
- else
- {
return 1;
- }
- }
- else if (rcvd == 0)
- {
- mod->sck_closed = 1;
- return 1;
}
- else
+
+ while (len > 0)
{
- data += rcvd;
- len -= rcvd;
+ 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_tcp_can_recv(mod->sck, 10);
+ }
+ else
+ {
+ return 1;
+ }
+ }
+ else if (rcvd == 0)
+ {
+ mod->sck_closed = 1;
+ return 1;
+ }
+ else
+ {
+ data += rcvd;
+ len -= rcvd;
+ }
}
- }
- return 0;
+
+ return 0;
}
/*****************************************************************************/
/* returns error */
int DEFAULT_CC
-lib_send(struct mod* mod, char* data, int len)
+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)
+ int sent;
+
+ if (mod->sck_closed)
{
- if (g_tcp_last_error_would_block(mod->sck))
- {
- if (mod->server_is_term(mod))
- {
- return 1;
- }
- g_tcp_can_send(mod->sck, 10);
- }
- else
- {
return 1;
- }
}
- else if (sent == 0)
- {
- mod->sck_closed = 1;
- return 1;
- }
- else
+
+ while (len > 0)
{
- data += sent;
- len -= sent;
+ 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_tcp_can_send(mod->sck, 10);
+ }
+ else
+ {
+ return 1;
+ }
+ }
+ else if (sent == 0)
+ {
+ mod->sck_closed = 1;
+ return 1;
+ }
+ else
+ {
+ data += sent;
+ len -= sent;
+ }
}
- }
- return 0;
+
+ return 0;
}
/******************************************************************************/
/* return error */
int DEFAULT_CC
-lib_mod_start(struct mod* mod, int w, int h, int bpp)
+lib_mod_start(struct mod *mod, int w, int h, int bpp)
{
- LIB_DEBUG(mod, "in lib_mod_start");
- mod->width = w;
- mod->height = h;
- mod->bpp = bpp;
- LIB_DEBUG(mod, "out lib_mod_start");
- return 0;
+ LIB_DEBUG(mod, "in lib_mod_start");
+ mod->width = w;
+ mod->height = h;
+ mod->bpp = bpp;
+ LIB_DEBUG(mod, "out lib_mod_start");
+ return 0;
}
/******************************************************************************/
/* return error */
int DEFAULT_CC
-lib_mod_connect(struct mod* mod)
+lib_mod_connect(struct mod *mod)
{
- int error;
- int len;
- int i;
- int index;
- int use_uds;
- struct stream* s;
- char con_port[256];
-
- LIB_DEBUG(mod, "in lib_mod_connect");
- /* 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->server_msg(mod, "started connecting", 0);
- /* only support 8, 15, 16, and 24 bpp connections from rdp client */
- if (mod->bpp != 8 && mod->bpp != 15 && mod->bpp != 16 && mod->bpp != 24)
- {
- mod->server_msg(mod,
- "error - only supporting 8, 15, 16, and 24 bpp rdp connections", 0);
- LIB_DEBUG(mod, "out lib_mod_connect error");
- return 1;
- }
- if (g_strcmp(mod->ip, "") == 0)
- {
- mod->server_msg(mod, "error - no ip set", 0);
- LIB_DEBUG(mod, "out lib_mod_connect error");
- return 1;
- }
- make_stream(s);
- g_sprintf(con_port, "%s", mod->port);
- use_uds = 0;
- if (con_port[0] == '/')
- {
- use_uds = 1;
- }
- mod->sck_closed = 0;
- i = 0;
- while (1)
- {
- if (use_uds)
- {
- mod->sck = g_tcp_local_socket();
- }
- else
+ int error;
+ int len;
+ int i;
+ int index;
+ int use_uds;
+ struct stream *s;
+ char con_port[256];
+
+ LIB_DEBUG(mod, "in lib_mod_connect");
+ /* 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->server_msg(mod, "started connecting", 0);
+
+ /* only support 8, 15, 16, and 24 bpp connections from rdp client */
+ if (mod->bpp != 8 && mod->bpp != 15 && mod->bpp != 16 && mod->bpp != 24)
{
- mod->sck = g_tcp_socket();
- g_tcp_set_non_blocking(mod->sck);
- g_tcp_set_no_delay(mod->sck);
+ mod->server_msg(mod,
+ "error - only supporting 8, 15, 16, and 24 bpp rdp connections", 0);
+ LIB_DEBUG(mod, "out lib_mod_connect error");
+ return 1;
}
- mod->server_msg(mod, "connecting...", 0);
- if (use_uds)
+
+ if (g_strcmp(mod->ip, "") == 0)
{
- error = g_tcp_local_connect(mod->sck, con_port);
+ mod->server_msg(mod, "error - no ip set", 0);
+ LIB_DEBUG(mod, "out lib_mod_connect error");
+ return 1;
}
- else
+
+ make_stream(s);
+ g_sprintf(con_port, "%s", mod->port);
+ use_uds = 0;
+
+ if (con_port[0] == '/')
{
- error = g_tcp_connect(mod->sck, mod->ip, con_port);
+ use_uds = 1;
}
- if (error == -1)
+
+ mod->sck_closed = 0;
+ i = 0;
+
+ while (1)
{
- if (g_tcp_last_error_would_block(mod->sck))
- {
- error = 0;
- index = 0;
- while (!g_tcp_can_send(mod->sck, 100))
+ if (use_uds)
{
- index++;
- if ((index >= 30) || mod->server_is_term(mod))
- {
- mod->server_msg(mod, "connect timeout", 0);
- error = 1;
+ mod->sck = g_tcp_local_socket();
+ }
+ else
+ {
+ mod->sck = g_tcp_socket();
+ g_tcp_set_non_blocking(mod->sck);
+ g_tcp_set_no_delay(mod->sck);
+ }
+
+ mod->server_msg(mod, "connecting...", 0);
+
+ if (use_uds)
+ {
+ error = g_tcp_local_connect(mod->sck, con_port);
+ }
+ else
+ {
+ error = g_tcp_connect(mod->sck, mod->ip, con_port);
+ }
+
+ if (error == -1)
+ {
+ if (g_tcp_last_error_would_block(mod->sck))
+ {
+ error = 0;
+ index = 0;
+
+ while (!g_tcp_can_send(mod->sck, 100))
+ {
+ index++;
+
+ if ((index >= 30) || mod->server_is_term(mod))
+ {
+ mod->server_msg(mod, "connect timeout", 0);
+ error = 1;
+ break;
+ }
+ }
+ }
+ else
+ {
+ mod->server_msg(mod, "connect error", 0);
+ }
+ }
+
+ if (error == 0)
+ {
+ break;
+ }
+
+ g_tcp_close(mod->sck);
+ mod->sck = 0;
+ i++;
+
+ if (i >= 4)
+ {
+ mod->server_msg(mod, "connection problem, giving up", 0);
break;
- }
}
- }
- else
- {
- mod->server_msg(mod, "connect error", 0);
- }
+
+ g_sleep(250);
}
+
if (error == 0)
{
- break;
+ /* send version message */
+ init_stream(s, 8192);
+ s_push_layer(s, iso_hdr, 4);
+ out_uint16_le(s, 103);
+ out_uint32_le(s, 301);
+ out_uint32_le(s, 0);
+ out_uint32_le(s, 0);
+ out_uint32_le(s, 0);
+ out_uint32_le(s, 1);
+ s_mark_end(s);
+ len = (int)(s->end - s->data);
+ s_pop_layer(s, iso_hdr);
+ out_uint32_le(s, len);
+ lib_send(mod, s->data, len);
}
- g_tcp_close(mod->sck);
- mod->sck = 0;
- i++;
- if (i >= 4)
+
+ if (error == 0)
{
- mod->server_msg(mod, "connection problem, giving up", 0);
- break;
+ /* send screen size message */
+ init_stream(s, 8192);
+ s_push_layer(s, iso_hdr, 4);
+ out_uint16_le(s, 103);
+ out_uint32_le(s, 300);
+ out_uint32_le(s, mod->width);
+ out_uint32_le(s, mod->height);
+ out_uint32_le(s, mod->bpp);
+ out_uint32_le(s, 0);
+ s_mark_end(s);
+ len = (int)(s->end - s->data);
+ s_pop_layer(s, iso_hdr);
+ out_uint32_le(s, len);
+ lib_send(mod, s->data, len);
}
- g_sleep(250);
- }
- if (error == 0)
- {
- /* send version message */
- init_stream(s, 8192);
- s_push_layer(s, iso_hdr, 4);
- out_uint16_le(s, 103);
- out_uint32_le(s, 301);
- out_uint32_le(s, 0);
- out_uint32_le(s, 0);
- out_uint32_le(s, 0);
- out_uint32_le(s, 1);
- s_mark_end(s);
- len = (int)(s->end - s->data);
- s_pop_layer(s, iso_hdr);
- out_uint32_le(s, len);
- lib_send(mod, s->data, len);
- }
- if (error == 0)
- {
- /* send screen size message */
- init_stream(s, 8192);
- s_push_layer(s, iso_hdr, 4);
- out_uint16_le(s, 103);
- out_uint32_le(s, 300);
- out_uint32_le(s, mod->width);
- out_uint32_le(s, mod->height);
- out_uint32_le(s, mod->bpp);
- out_uint32_le(s, 0);
- s_mark_end(s);
- len = (int)(s->end - s->data);
- s_pop_layer(s, iso_hdr);
- out_uint32_le(s, len);
- lib_send(mod, s->data, len);
- }
- if (error == 0)
- {
- /* send invalidate message */
- init_stream(s, 8192);
- s_push_layer(s, iso_hdr, 4);
- out_uint16_le(s, 103);
- out_uint32_le(s, 200);
- /* x and y */
- i = 0;
- out_uint32_le(s, i);
- /* width and height */
- i = ((mod->width & 0xffff) << 16) | mod->height;
- out_uint32_le(s, i);
- out_uint32_le(s, 0);
- out_uint32_le(s, 0);
- s_mark_end(s);
- len = (int)(s->end - s->data);
- s_pop_layer(s, iso_hdr);
- out_uint32_le(s, len);
- lib_send(mod, s->data, len);
- }
- free_stream(s);
- if (error != 0)
- {
- mod->server_msg(mod, "some problem", 0);
- LIB_DEBUG(mod, "out lib_mod_connect error");
- return 1;
- }
- else
- {
- mod->server_msg(mod, "connected ok", 0);
- mod->sck_obj = g_create_wait_obj_from_socket(mod->sck, 0);
- }
- LIB_DEBUG(mod, "out lib_mod_connect");
- return 0;
+
+ if (error == 0)
+ {
+ /* send invalidate message */
+ init_stream(s, 8192);
+ s_push_layer(s, iso_hdr, 4);
+ out_uint16_le(s, 103);
+ out_uint32_le(s, 200);
+ /* x and y */
+ i = 0;
+ out_uint32_le(s, i);
+ /* width and height */
+ i = ((mod->width & 0xffff) << 16) | mod->height;
+ out_uint32_le(s, i);
+ out_uint32_le(s, 0);
+ out_uint32_le(s, 0);
+ s_mark_end(s);
+ len = (int)(s->end - s->data);
+ s_pop_layer(s, iso_hdr);
+ out_uint32_le(s, len);
+ lib_send(mod, s->data, len);
+ }
+
+ free_stream(s);
+
+ if (error != 0)
+ {
+ mod->server_msg(mod, "some problem", 0);
+ LIB_DEBUG(mod, "out lib_mod_connect error");
+ return 1;
+ }
+ else
+ {
+ mod->server_msg(mod, "connected ok", 0);
+ mod->sck_obj = g_create_wait_obj_from_socket(mod->sck, 0);
+ }
+
+ LIB_DEBUG(mod, "out lib_mod_connect");
+ return 0;
}
/******************************************************************************/
/* return error */
int DEFAULT_CC
-lib_mod_event(struct mod* mod, int msg, tbus param1, tbus param2,
+lib_mod_event(struct mod *mod, int msg, tbus param1, tbus param2,
tbus param3, tbus param4)
{
- struct stream* s;
- int len;
- int key;
- int rv;
-
- LIB_DEBUG(mod, "in lib_mod_event");
- make_stream(s);
- if ((msg >= 15) && (msg <= 16)) /* key events */
- {
- key = param2;
- if (key > 0)
+ struct stream *s;
+ int len;
+ int key;
+ int rv;
+
+ LIB_DEBUG(mod, "in lib_mod_event");
+ make_stream(s);
+
+ if ((msg >= 15) && (msg <= 16)) /* key events */
{
- if (key == 65027) /* altgr */
- {
- if (mod->shift_state)
+ key = param2;
+
+ if (key > 0)
{
- g_writeln("special");
- /* fix for mstsc sending left control down with altgr */
- /* control down / up
- msg param1 param2 param3 param4
- 15 0 65507 29 0
- 16 0 65507 29 49152 */
- init_stream(s, 8192);
- s_push_layer(s, iso_hdr, 4);
- out_uint16_le(s, 103);
- out_uint32_le(s, 16); /* key up */
- out_uint32_le(s, 0);
- out_uint32_le(s, 65507); /* left control */
- out_uint32_le(s, 29); /* RDP scan code */
- out_uint32_le(s, 0xc000); /* flags */
- s_mark_end(s);
- len = (int)(s->end - s->data);
- s_pop_layer(s, iso_hdr);
- out_uint32_le(s, len);
- lib_send(mod, s->data, len);
+ if (key == 65027) /* altgr */
+ {
+ if (mod->shift_state)
+ {
+ g_writeln("special");
+ /* fix for mstsc sending left control down with altgr */
+ /* control down / up
+ msg param1 param2 param3 param4
+ 15 0 65507 29 0
+ 16 0 65507 29 49152 */
+ init_stream(s, 8192);
+ s_push_layer(s, iso_hdr, 4);
+ out_uint16_le(s, 103);
+ out_uint32_le(s, 16); /* key up */
+ out_uint32_le(s, 0);
+ out_uint32_le(s, 65507); /* left control */
+ out_uint32_le(s, 29); /* RDP scan code */
+ out_uint32_le(s, 0xc000); /* flags */
+ s_mark_end(s);
+ len = (int)(s->end - s->data);
+ s_pop_layer(s, iso_hdr);
+ out_uint32_le(s, len);
+ lib_send(mod, s->data, len);
+ }
+ }
+
+ if (key == 65507) /* left control */
+ {
+ mod->shift_state = msg == 15;
+ }
}
- }
- if (key == 65507) /* left control */
- {
- mod->shift_state = msg == 15;
- }
}
- }
- 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 = (int)(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);
- LIB_DEBUG(mod, "out lib_mod_event");
- return rv;
+
+ 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 = (int)(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);
+ LIB_DEBUG(mod, "out lib_mod_event");
+ return rv;
}
/******************************************************************************/
/* return error */
static int APP_CC
-process_server_window_new_update(struct mod* mod, struct stream* s)
+process_server_window_new_update(struct mod *mod, struct stream *s)
{
- int flags;
- int window_id;
- int title_bytes;
- int index;
- int bytes;
- int rv;
- struct rail_window_state_order rwso;
-
- g_memset(&rwso, 0, sizeof(rwso));
- in_uint32_le(s, window_id);
- in_uint32_le(s, rwso.owner_window_id);
- in_uint32_le(s, rwso.style);
- in_uint32_le(s, rwso.extended_style);
- in_uint32_le(s, rwso.show_state);
- in_uint16_le(s, title_bytes);
- if (title_bytes > 0)
- {
- rwso.title_info = g_malloc(title_bytes + 1, 0);
- in_uint8a(s, rwso.title_info, title_bytes);
- rwso.title_info[title_bytes] = 0;
- }
- in_uint32_le(s, rwso.client_offset_x);
- in_uint32_le(s, rwso.client_offset_y);
- in_uint32_le(s, rwso.client_area_width);
- in_uint32_le(s, rwso.client_area_height);
- in_uint32_le(s, rwso.rp_content);
- in_uint32_le(s, rwso.root_parent_handle);
- in_uint32_le(s, rwso.window_offset_x);
- in_uint32_le(s, rwso.window_offset_y);
- in_uint32_le(s, rwso.window_client_delta_x);
- in_uint32_le(s, rwso.window_client_delta_y);
- in_uint32_le(s, rwso.window_width);
- in_uint32_le(s, rwso.window_height);
- in_uint16_le(s, rwso.num_window_rects);
- if (rwso.num_window_rects > 0)
- {
- bytes = sizeof(struct rail_window_rect) * rwso.num_window_rects;
- rwso.window_rects = (struct rail_window_rect*)g_malloc(bytes, 0);
- for (index = 0; index < rwso.num_window_rects; index++)
+ int flags;
+ int window_id;
+ int title_bytes;
+ int index;
+ int bytes;
+ int rv;
+ struct rail_window_state_order rwso;
+
+ g_memset(&rwso, 0, sizeof(rwso));
+ in_uint32_le(s, window_id);
+ in_uint32_le(s, rwso.owner_window_id);
+ in_uint32_le(s, rwso.style);
+ in_uint32_le(s, rwso.extended_style);
+ in_uint32_le(s, rwso.show_state);
+ in_uint16_le(s, title_bytes);
+
+ if (title_bytes > 0)
{
- in_uint16_le(s, rwso.window_rects[index].left);
- in_uint16_le(s, rwso.window_rects[index].top);
- in_uint16_le(s, rwso.window_rects[index].right);
- in_uint16_le(s, rwso.window_rects[index].bottom);
+ rwso.title_info = g_malloc(title_bytes + 1, 0);
+ in_uint8a(s, rwso.title_info, title_bytes);
+ rwso.title_info[title_bytes] = 0;
}
- }
- in_uint32_le(s, rwso.visible_offset_x);
- in_uint32_le(s, rwso.visible_offset_y);
- in_uint16_le(s, rwso.num_visibility_rects);
- if (rwso.num_visibility_rects > 0)
- {
- bytes = sizeof(struct rail_window_rect) * rwso.num_visibility_rects;
- rwso.visibility_rects = (struct rail_window_rect*)g_malloc(bytes, 0);
- for (index = 0; index < rwso.num_visibility_rects; index++)
+
+ in_uint32_le(s, rwso.client_offset_x);
+ in_uint32_le(s, rwso.client_offset_y);
+ in_uint32_le(s, rwso.client_area_width);
+ in_uint32_le(s, rwso.client_area_height);
+ in_uint32_le(s, rwso.rp_content);
+ in_uint32_le(s, rwso.root_parent_handle);
+ in_uint32_le(s, rwso.window_offset_x);
+ in_uint32_le(s, rwso.window_offset_y);
+ in_uint32_le(s, rwso.window_client_delta_x);
+ in_uint32_le(s, rwso.window_client_delta_y);
+ in_uint32_le(s, rwso.window_width);
+ in_uint32_le(s, rwso.window_height);
+ in_uint16_le(s, rwso.num_window_rects);
+
+ if (rwso.num_window_rects > 0)
+ {
+ bytes = sizeof(struct rail_window_rect) * rwso.num_window_rects;
+ rwso.window_rects = (struct rail_window_rect *)g_malloc(bytes, 0);
+
+ for (index = 0; index < rwso.num_window_rects; index++)
+ {
+ in_uint16_le(s, rwso.window_rects[index].left);
+ in_uint16_le(s, rwso.window_rects[index].top);
+ in_uint16_le(s, rwso.window_rects[index].right);
+ in_uint16_le(s, rwso.window_rects[index].bottom);
+ }
+ }
+
+ in_uint32_le(s, rwso.visible_offset_x);
+ in_uint32_le(s, rwso.visible_offset_y);
+ in_uint16_le(s, rwso.num_visibility_rects);
+
+ if (rwso.num_visibility_rects > 0)
{
- in_uint16_le(s, rwso.visibility_rects[index].left);
- in_uint16_le(s, rwso.visibility_rects[index].top);
- in_uint16_le(s, rwso.visibility_rects[index].right);
- in_uint16_le(s, rwso.visibility_rects[index].bottom);
+ bytes = sizeof(struct rail_window_rect) * rwso.num_visibility_rects;
+ rwso.visibility_rects = (struct rail_window_rect *)g_malloc(bytes, 0);
+
+ for (index = 0; index < rwso.num_visibility_rects; index++)
+ {
+ in_uint16_le(s, rwso.visibility_rects[index].left);
+ in_uint16_le(s, rwso.visibility_rects[index].top);
+ in_uint16_le(s, rwso.visibility_rects[index].right);
+ in_uint16_le(s, rwso.visibility_rects[index].bottom);
+ }
}
- }
- in_uint32_le(s, flags);
- mod->server_window_new_update(mod, window_id, &rwso, flags);
- rv = 0;
- g_free(rwso.title_info);
- g_free(rwso.window_rects);
- g_free(rwso.visibility_rects);
- return rv;
+
+ in_uint32_le(s, flags);
+ mod->server_window_new_update(mod, window_id, &rwso, flags);
+ rv = 0;
+ g_free(rwso.title_info);
+ g_free(rwso.window_rects);
+ g_free(rwso.visibility_rects);
+ return rv;
}
/******************************************************************************/
/* return error */
static int APP_CC
-process_server_window_delete(struct mod* mod, struct stream* s)
+process_server_window_delete(struct mod *mod, struct stream *s)
{
- int window_id;
- int rv;
+ int window_id;
+ int rv;
- in_uint32_le(s, window_id);
- mod->server_window_delete(mod, window_id);
- rv = 0;
- return rv;
+ in_uint32_le(s, window_id);
+ mod->server_window_delete(mod, window_id);
+ rv = 0;
+ return rv;
}
/******************************************************************************/
/* return error */
static int
-lib_mod_process_orders(struct mod* mod, int type, struct stream* s)
+lib_mod_process_orders(struct mod *mod, int type, struct stream *s)
{
- int rv;
- int x;
- int y;
- int cx;
- int cy;
- int srcx;
- int srcy;
- int len_bmpdata;
- int style;
- int x1;
- int y1;
- int x2;
- int y2;
- int rdpid;
- int hints;
- int mask;
- int width;
- int height;
- int fgcolor;
- int opcode;
- char* bmpdata;
- char cur_data[32 * (32 * 3)];
- char cur_mask[32 * (32 / 8)];
-
- rv = 0;
- 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;
- case 19:
- in_sint16_le(s, x);
- in_sint16_le(s, y);
- in_uint8a(s, cur_data, 32 * (32 * 3));
- in_uint8a(s, cur_mask, 32 * (32 / 8));
- rv = mod->server_set_cursor(mod, x, y, cur_data, cur_mask);
- break;
- case 20:
- in_uint32_le(s, rdpid);
- in_uint16_le(s, width);
- in_uint16_le(s, height);
- rv = mod->server_create_os_surface(mod, rdpid, width, height);
- break;
- case 21:
- in_uint32_le(s, rdpid);
- rv = mod->server_switch_os_surface(mod, rdpid);
- break;
- case 22:
- in_uint32_le(s, rdpid);
- rv = mod->server_delete_os_surface(mod, rdpid);
- break;
- case 23: /* server_paint_rect_os */
- in_sint16_le(s, x);
- in_sint16_le(s, y);
- in_uint16_le(s, cx);
- in_uint16_le(s, cy);
- in_uint32_le(s, rdpid);
- in_sint16_le(s, srcx);
- in_sint16_le(s, srcy);
- rv = mod->server_paint_rect_os(mod, x, y, cx, cy,
- rdpid, srcx, srcy);
- break;
- case 24: /* server_set_hints */
- in_uint32_le(s, hints);
- in_uint32_le(s, mask);
- rv = mod->server_set_hints(mod, hints, mask);
- break;
- case 25: /* server_window_new_update */
- rv = process_server_window_new_update(mod, s);
- break;
- case 26: /* server_window_delete */
- rv = process_server_window_delete(mod, s);
- break;
- default:
- g_writeln("lib_mod_process_orders: unknown order type %d", type);
- rv = 0;
- break;
- }
- return rv;
+ int rv;
+ int x;
+ int y;
+ int cx;
+ int cy;
+ int srcx;
+ int srcy;
+ int len_bmpdata;
+ int style;
+ int x1;
+ int y1;
+ int x2;
+ int y2;
+ int rdpid;
+ int hints;
+ int mask;
+ int width;
+ int height;
+ int fgcolor;
+ int opcode;
+ char *bmpdata;
+ char cur_data[32 * (32 * 3)];
+ char cur_mask[32 * (32 / 8)];
+
+ rv = 0;
+
+ 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;
+ case 19:
+ in_sint16_le(s, x);
+ in_sint16_le(s, y);
+ in_uint8a(s, cur_data, 32 * (32 * 3));
+ in_uint8a(s, cur_mask, 32 * (32 / 8));
+ rv = mod->server_set_cursor(mod, x, y, cur_data, cur_mask);
+ break;
+ case 20:
+ in_uint32_le(s, rdpid);
+ in_uint16_le(s, width);
+ in_uint16_le(s, height);
+ rv = mod->server_create_os_surface(mod, rdpid, width, height);
+ break;
+ case 21:
+ in_uint32_le(s, rdpid);
+ rv = mod->server_switch_os_surface(mod, rdpid);
+ break;
+ case 22:
+ in_uint32_le(s, rdpid);
+ rv = mod->server_delete_os_surface(mod, rdpid);
+ break;
+ case 23: /* server_paint_rect_os */
+ in_sint16_le(s, x);
+ in_sint16_le(s, y);
+ in_uint16_le(s, cx);
+ in_uint16_le(s, cy);
+ in_uint32_le(s, rdpid);
+ in_sint16_le(s, srcx);
+ in_sint16_le(s, srcy);
+ rv = mod->server_paint_rect_os(mod, x, y, cx, cy,
+ rdpid, srcx, srcy);
+ break;
+ case 24: /* server_set_hints */
+ in_uint32_le(s, hints);
+ in_uint32_le(s, mask);
+ rv = mod->server_set_hints(mod, hints, mask);
+ break;
+ case 25: /* server_window_new_update */
+ rv = process_server_window_new_update(mod, s);
+ break;
+ case 26: /* server_window_delete */
+ rv = process_server_window_delete(mod, s);
+ break;
+ default:
+ g_writeln("lib_mod_process_orders: unknown order type %d", type);
+ rv = 0;
+ break;
+ }
+
+ return rv;
}
/******************************************************************************/
/* return error */
static int APP_CC
-lib_send_client_info(struct mod* mod)
+lib_send_client_info(struct mod *mod)
{
- struct stream* s;
- int len;
-
- make_stream(s);
- init_stream(s, 8192);
- s_push_layer(s, iso_hdr, 4);
- out_uint16_le(s, 104);
- g_memcpy(s->p, &(mod->client_info), sizeof(mod->client_info));
- s->p += sizeof(mod->client_info);
- s_mark_end(s);
- len = (int)(s->end - s->data);
- s_pop_layer(s, iso_hdr);
- out_uint32_le(s, len);
- lib_send(mod, s->data, len);
- free_stream(s);
- return 0;
+ struct stream *s;
+ int len;
+
+ make_stream(s);
+ init_stream(s, 8192);
+ s_push_layer(s, iso_hdr, 4);
+ out_uint16_le(s, 104);
+ g_memcpy(s->p, &(mod->client_info), sizeof(mod->client_info));
+ s->p += sizeof(mod->client_info);
+ s_mark_end(s);
+ len = (int)(s->end - s->data);
+ s_pop_layer(s, iso_hdr);
+ out_uint32_le(s, len);
+ lib_send(mod, s->data, len);
+ free_stream(s);
+ return 0;
}
/******************************************************************************/
/* return error */
int DEFAULT_CC
-lib_mod_signal(struct mod* mod)
+lib_mod_signal(struct mod *mod)
{
- struct stream* s;
- int num_orders;
- int index;
- int rv;
- int len;
- int type;
- char* phold;
-
- LIB_DEBUG(mod, "in lib_mod_signal");
- 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) /* original order list */
+ struct stream *s;
+ int num_orders;
+ int index;
+ int rv;
+ int len;
+ int type;
+ char *phold;
+
+ LIB_DEBUG(mod, "in lib_mod_signal");
+ make_stream(s);
+ init_stream(s, 8192);
+ rv = lib_recv(mod, s->data, 8);
+
+ if (rv == 0)
{
- 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);
+ in_uint16_le(s, num_orders);
+ in_uint32_le(s, len);
+
+ if (type == 1) /* original order list */
{
- in_uint16_le(s, type);
- rv = lib_mod_process_orders(mod, type, s);
- if (rv != 0)
- {
- break;
- }
+ 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);
+ rv = lib_mod_process_orders(mod, type, s);
+
+ if (rv != 0)
+ {
+ break;
+ }
+ }
+ }
}
- }
- }
- else if (type == 2) /* caps */
- {
- g_writeln("lib_mod_signal: type 2 len %d", len);
- init_stream(s, len);
- rv = lib_recv(mod, s->data, len);
- if (rv == 0)
- {
- for (index = 0; index < num_orders; index++)
+ else if (type == 2) /* caps */
{
- phold = s->p;
- in_uint16_le(s, type);
- in_uint16_le(s, len);
- switch (type)
- {
- default:
- g_writeln("lib_mod_signal: unknown cap type %d len %d",
- type, len);
- break;
- }
- s->p = phold + len;
+ g_writeln("lib_mod_signal: type 2 len %d", len);
+ init_stream(s, len);
+ rv = lib_recv(mod, s->data, len);
+
+ if (rv == 0)
+ {
+ for (index = 0; index < num_orders; index++)
+ {
+ phold = s->p;
+ in_uint16_le(s, type);
+ in_uint16_le(s, len);
+
+ switch (type)
+ {
+ default:
+ g_writeln("lib_mod_signal: unknown cap type %d len %d",
+ type, len);
+ break;
+ }
+
+ s->p = phold + len;
+ }
+
+ lib_send_client_info(mod);
+ }
}
- lib_send_client_info(mod);
- }
- }
- else if (type == 3) /* order list with len after type */
- {
- init_stream(s, len);
- rv = lib_recv(mod, s->data, len);
- if (rv == 0)
- {
- for (index = 0; index < num_orders; index++)
+ else if (type == 3) /* order list with len after type */
{
- phold = s->p;
- in_uint16_le(s, type);
- in_uint16_le(s, len);
- rv = lib_mod_process_orders(mod, type, s);
- if (rv != 0)
- {
- break;
- }
- s->p = phold + len;
+ init_stream(s, len);
+ rv = lib_recv(mod, s->data, len);
+
+ if (rv == 0)
+ {
+ for (index = 0; index < num_orders; index++)
+ {
+ phold = s->p;
+ in_uint16_le(s, type);
+ in_uint16_le(s, len);
+ rv = lib_mod_process_orders(mod, type, s);
+
+ if (rv != 0)
+ {
+ break;
+ }
+
+ s->p = phold + len;
+ }
+ }
+ }
+ else
+ {
+ g_writeln("unknown type %d", type);
}
- }
- }
- else
- {
- g_writeln("unknown type %d", type);
}
- }
- free_stream(s);
- LIB_DEBUG(mod, "out lib_mod_signal");
- return rv;
+
+ free_stream(s);
+ LIB_DEBUG(mod, "out lib_mod_signal");
+ return rv;
}
/******************************************************************************/
/* return error */
int DEFAULT_CC
-lib_mod_end(struct mod* mod)
+lib_mod_end(struct mod *mod)
{
- return 0;
+ return 0;
}
/******************************************************************************/
/* return error */
int DEFAULT_CC
-lib_mod_set_param(struct mod* mod, char* name, char* value)
+lib_mod_set_param(struct mod *mod, char *name, char *value)
{
- if (g_strcasecmp(name, "username") == 0)
- {
- g_strncpy(mod->username, value, 255);
- }
- else if (g_strcasecmp(name, "password") == 0)
- {
- g_strncpy(mod->password, value, 255);
- }
- else if (g_strcasecmp(name, "ip") == 0)
- {
- g_strncpy(mod->ip, value, 255);
- }
- else if (g_strcasecmp(name, "port") == 0)
- {
- g_strncpy(mod->port, value, 255);
- }
- else if (g_strcasecmp(name, "client_info") == 0)
- {
- g_memcpy(&(mod->client_info), value, sizeof(mod->client_info));
- }
- return 0;
+ if (g_strcasecmp(name, "username") == 0)
+ {
+ g_strncpy(mod->username, value, 255);
+ }
+ else if (g_strcasecmp(name, "password") == 0)
+ {
+ g_strncpy(mod->password, value, 255);
+ }
+ else if (g_strcasecmp(name, "ip") == 0)
+ {
+ g_strncpy(mod->ip, value, 255);
+ }
+ else if (g_strcasecmp(name, "port") == 0)
+ {
+ g_strncpy(mod->port, value, 255);
+ }
+ else if (g_strcasecmp(name, "client_info") == 0)
+ {
+ g_memcpy(&(mod->client_info), value, sizeof(mod->client_info));
+ }
+
+ return 0;
}
/******************************************************************************/
/* return error */
int DEFAULT_CC
-lib_mod_get_wait_objs(struct mod* mod, tbus* read_objs, int* rcount,
- tbus* write_objs, int* wcount, int* timeout)
+lib_mod_get_wait_objs(struct mod *mod, tbus *read_objs, int *rcount,
+ tbus *write_objs, int *wcount, int *timeout)
{
- int i;
+ int i;
- i = *rcount;
- if (mod != 0)
- {
- if (mod->sck_obj != 0)
+ i = *rcount;
+
+ if (mod != 0)
{
- read_objs[i++] = mod->sck_obj;
+ if (mod->sck_obj != 0)
+ {
+ read_objs[i++] = mod->sck_obj;
+ }
}
- }
- *rcount = i;
- return 0;
+
+ *rcount = i;
+ return 0;
}
/******************************************************************************/
/* return error */
int DEFAULT_CC
-lib_mod_check_wait_objs(struct mod* mod)
+lib_mod_check_wait_objs(struct mod *mod)
{
- int rv;
+ int rv;
+
+ rv = 0;
- rv = 0;
- if (mod != 0)
- {
- if (mod->sck_obj != 0)
+ if (mod != 0)
{
- if (g_is_wait_obj_set(mod->sck_obj))
- {
- rv = lib_mod_signal(mod);
- }
+ if (mod->sck_obj != 0)
+ {
+ if (g_is_wait_obj_set(mod->sck_obj))
+ {
+ rv = lib_mod_signal(mod);
+ }
+ }
}
- }
- return rv;
+
+ return rv;
}
/******************************************************************************/
-struct mod* EXPORT_CC
+struct mod *EXPORT_CC
mod_init(void)
{
- struct mod* mod;
-
- mod = (struct mod*)g_malloc(sizeof(struct mod), 1);
- mod->size = sizeof(struct mod);
- mod->version = CURRENT_MOD_VER;
- mod->handle = (tbus)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;
- mod->mod_get_wait_objs = lib_mod_get_wait_objs;
- mod->mod_check_wait_objs = lib_mod_check_wait_objs;
- return mod;
+ struct mod *mod;
+
+ mod = (struct mod *)g_malloc(sizeof(struct mod), 1);
+ mod->size = sizeof(struct mod);
+ mod->version = CURRENT_MOD_VER;
+ mod->handle = (tbus)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;
+ mod->mod_get_wait_objs = lib_mod_get_wait_objs;
+ mod->mod_check_wait_objs = lib_mod_check_wait_objs;
+ return mod;
}
/******************************************************************************/
int EXPORT_CC
-mod_exit(struct mod* mod)
+mod_exit(struct mod *mod)
{
- if (mod == 0)
- {
+ if (mod == 0)
+ {
+ return 0;
+ }
+
+ g_delete_wait_obj_from_socket(mod->sck_obj);
+ g_tcp_close(mod->sck);
+ g_free(mod);
return 0;
- }
- g_delete_wait_obj_from_socket(mod->sck_obj);
- g_tcp_close(mod->sck);
- g_free(mod);
- return 0;
}
diff --git a/xup/xup.h b/xup/xup.h
index 110d3af4..ae98c5ff 100644
--- a/xup/xup.h
+++ b/xup/xup.h
@@ -1,24 +1,22 @@
-/*
- 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-2012
-
- libxup main header file
-
-*/
+/**
+ * xrdp: A Remote Desktop Protocol server.
+ *
+ * Copyright (C) Jay Sorg 2004-2012
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * libxup main header file
+ */
/* include other h files */
#include "arch.h"