diff options
Diffstat (limited to 'xrdp')
| -rw-r--r-- | xrdp/xrdp.ini | 23 | ||||
| -rw-r--r-- | xrdp/xrdp_listen.c | 20 | ||||
| -rw-r--r-- | xrdp/xrdp_login_wnd.c | 4 | ||||
| -rw-r--r-- | xrdp/xrdp_mcs.c | 13 | ||||
| -rw-r--r-- | xrdp/xrdp_process.c | 340 | ||||
| -rw-r--r-- | xrdp/xrdp_rdp.c | 63 |
6 files changed, 259 insertions, 204 deletions
diff --git a/xrdp/xrdp.ini b/xrdp/xrdp.ini index f46acb9c..9a682181 100644 --- a/xrdp/xrdp.ini +++ b/xrdp/xrdp.ini @@ -4,28 +4,19 @@ bitmap_cache=yes bitmap_compression=yes [vnc1] -name=self:2 +name=sesman lib=../vnc/libvnc.so auth=local ip=127.0.0.1 -port=5902 +port=-1 username=ask -password=master +password=ask [vnc2] -name=self:3 +name=console lib=../vnc/libvnc.so auth=local ip=127.0.0.1 -port=5903 -username=n/a -password=master - -[vnc3] -name=playback -lib=../vnc/libvnc.so -auth=local -ip=127.0.0.1 -port=5910 -username=n/a -password=tucker +port=5900 +username=ask +password=ask diff --git a/xrdp/xrdp_listen.c b/xrdp/xrdp_listen.c index 492466ee..f46cb187 100644 --- a/xrdp/xrdp_listen.c +++ b/xrdp/xrdp_listen.c @@ -47,17 +47,31 @@ int xrdp_listen_term_processes(struct xrdp_listen* self) /* tell all xrdp processes to end */ for (i = 0; i < self->process_list_count; i++) + { if (self->process_list[i] != 0) + { self->process_list[i]->term = 1; + } + } /* make sure they are done */ for (i = 0; i < self->process_list_count; i++) + { if (self->process_list[i] != 0) + { while (self->process_list[i]->status > 0) + { g_sleep(10); + } + } + } /* free them all */ for (i = 0; i < self->process_list_count; i++) + { if (self->process_list[i] != 0) + { xrdp_process_delete(self->process_list[i]); + } + } return 0; } @@ -133,9 +147,13 @@ int xrdp_listen_main_loop(struct xrdp_listen* self) { error = g_tcp_accept(self->sck); if (error == -1 && g_tcp_last_error_would_block(self->sck)) + { g_sleep(100); + } else if (error == -1) + { break; + } else { g_process = xrdp_process_create(self); @@ -147,7 +165,9 @@ int xrdp_listen_main_loop(struct xrdp_listen* self) g_sleep(100); } else + { xrdp_process_delete(g_process); + } } } } diff --git a/xrdp/xrdp_login_wnd.c b/xrdp/xrdp_login_wnd.c index 38b58d99..b6fa0d19 100644 --- a/xrdp/xrdp_login_wnd.c +++ b/xrdp/xrdp_login_wnd.c @@ -187,10 +187,10 @@ int xrdp_wm_login_notify(struct xrdp_bitmap* wnd, } else if (sender->id == 2) /* cancel button */ { - /*if (wnd != 0) + if (wnd != 0) if (wnd->wm != 0) if (wnd->wm->pro_layer != 0) - wnd->wm->pro_layer->term = 1;*/ + wnd->wm->pro_layer->term = 1; } else if (sender->id == 3) /* ok button */ { diff --git a/xrdp/xrdp_mcs.c b/xrdp/xrdp_mcs.c index 82eeff0f..41197cfa 100644 --- a/xrdp/xrdp_mcs.c +++ b/xrdp/xrdp_mcs.c @@ -584,25 +584,18 @@ int xrdp_mcs_send(struct xrdp_mcs* self, struct stream* s) /* returns error */ int xrdp_mcs_disconnect(struct xrdp_mcs* self) { - int len; struct stream* s; make_stream(s); init_stream(s, 8192); - if (xrdp_mcs_init(self, s) != 0) + if (xrdp_iso_init(self->iso_layer, s) != 0) { free_stream(s); return 1; } + out_uint8(s, (MCS_DPUM << 2) | 1); + out_uint8(s, 0x80); s_mark_end(s); - s_pop_layer(s, mcs_hdr); - len = (s->end - s->p) - 8; - len = len | 0x8000; - out_uint8(s, MCS_DPUM << 2); - out_uint16_be(s, self->userid); - out_uint16_be(s, MCS_GLOBAL_CHANNEL); - out_uint8(s, 0x70); - out_uint16_be(s, len); if (xrdp_iso_send(self->iso_layer, s) != 0) { free_stream(s); diff --git a/xrdp/xrdp_process.c b/xrdp/xrdp_process.c index aa9acfa1..91531688 100644 --- a/xrdp/xrdp_process.c +++ b/xrdp/xrdp_process.c @@ -1,169 +1,171 @@ -/*
- 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 2004-2005
-
- main rdp process
-
-*/
-
-#include "xrdp.h"
-
-/*****************************************************************************/
-struct xrdp_process* xrdp_process_create(struct xrdp_listen* owner)
-{
- struct xrdp_process* self;
-
- self = (struct xrdp_process*)g_malloc(sizeof(struct xrdp_process), 1);
- self->lis_layer = owner;
- return self;
-}
-
-/*****************************************************************************/
-void xrdp_process_delete(struct xrdp_process* self)
-{
- if (self == 0)
- {
- return;
- }
- xrdp_rdp_delete(self->rdp_layer);
- xrdp_orders_delete(self->orders);
- xrdp_wm_delete(self->wm);
- g_free(self);
-}
-
-/*****************************************************************************/
-int xrdp_process_loop(struct xrdp_process* self, struct stream* s)
-{
- int cont;
- int rv;
- int code;
-
- code = 0;
- rv = 0;
- cont = 1;
- while (cont && !self->term)
- {
- if (xrdp_rdp_recv(self->rdp_layer, s, &code) != 0)
- {
- rv = 1;
- break;
- }
- DEBUG(("xrdp_process_main_loop code %d\n\r", code));
- switch (code)
- {
- case -1:
- xrdp_rdp_send_demand_active(self->rdp_layer);
- break;
- case 0:
- break;
- case RDP_PDU_CONFIRM_ACTIVE: /* 3 */
- xrdp_rdp_process_confirm_active(self->rdp_layer, s);
- break;
- case RDP_PDU_DATA: /* 7 */
- if (xrdp_rdp_process_data(self->rdp_layer, s) != 0)
- {
- DEBUG(("xrdp_rdp_process_data returned non zero\n\r"));
- cont = 0;
- self->term = 1;
- }
- break;
- default:
- g_printf("unknown in xrdp_process_main_loop\n\r");
- break;
- }
- if (cont)
- {
- cont = s->next_packet < s->end;
- }
- }
- if (self->rdp_layer->up_and_running && self->wm == 0 && rv == 0)
- {
- /* only do this once */
- DEBUG(("xrdp_process_main_loop up and running\n\r"));
- self->orders = xrdp_orders_create(self, self->rdp_layer);
- self->wm = xrdp_wm_create(self, &self->rdp_layer->client_info);
- xrdp_wm_init(self->wm);
- }
- return rv;
-}
-
-/*****************************************************************************/
-int xrdp_process_main_loop(struct xrdp_process* self)
-{
-#ifndef XRDP_LIB
- int i;
- struct stream* s;
-
- make_stream(s);
- self->status = 1;
- self->rdp_layer = xrdp_rdp_create(self, self->sck);
- g_tcp_set_non_blocking(self->sck);
- if (xrdp_rdp_incoming(self->rdp_layer) == 0)
- {
- while (!g_is_term() && !self->term)
- {
- i = g_tcp_select(self->sck, self->app_sck);
- if (i & 1)
- {
- init_stream(s, 8192);
- if (xrdp_process_loop(self, s) != 0)
- {
- break;
- }
- }
- if (i & 2) /* mod socket fired */
- {
- if (self->wm->mod == 0)
- {
- break;
- }
- if (self->wm->mod->mod_signal == 0)
- {
- break;
- }
- if (self->wm->mod->mod_signal(self->wm->mod) != 0)
- {
- break;
- }
- }
- if (i == 0) /* no data on any stream */
- {
- g_sleep(10);
- }
- else if (i < 0)
- {
- break;
- }
- }
- }
- if (self->wm->mod != 0)
- {
- if (self->wm->mod->mod_end != 0)
- {
- self->wm->mod->mod_end(self->wm->mod);
- }
- }
- xrdp_rdp_disconnect(self->rdp_layer);
- xrdp_rdp_delete(self->rdp_layer);
- self->rdp_layer = 0;
- g_tcp_close(self->sck);
- self->status = -1;
- xrdp_listen_delete_pro(self->lis_layer, self);
- free_stream(s);
-#endif
- return 0;
-}
+/* + 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 2004-2005 + + main rdp process + +*/ + +#include "xrdp.h" + +/*****************************************************************************/ +struct xrdp_process* xrdp_process_create(struct xrdp_listen* owner) +{ + struct xrdp_process* self; + + self = (struct xrdp_process*)g_malloc(sizeof(struct xrdp_process), 1); + self->lis_layer = owner; + return self; +} + +/*****************************************************************************/ +void xrdp_process_delete(struct xrdp_process* self) +{ + if (self == 0) + { + return; + } + xrdp_rdp_delete(self->rdp_layer); + xrdp_orders_delete(self->orders); + xrdp_wm_delete(self->wm); + g_free(self); +} + +/*****************************************************************************/ +int xrdp_process_loop(struct xrdp_process* self, struct stream* s) +{ + int cont; + int rv; + int code; + + code = 0; + rv = 0; + cont = 1; + while (cont && !self->term) + { + if (xrdp_rdp_recv(self->rdp_layer, s, &code) != 0) + { + rv = 1; + break; + } + DEBUG(("xrdp_process_main_loop code %d\n\r", code)); + switch (code) + { + case -1: + xrdp_rdp_send_demand_active(self->rdp_layer); + break; + case 0: + break; + case RDP_PDU_CONFIRM_ACTIVE: /* 3 */ + xrdp_rdp_process_confirm_active(self->rdp_layer, s); + break; + case RDP_PDU_DATA: /* 7 */ + if (xrdp_rdp_process_data(self->rdp_layer, s) != 0) + { + DEBUG(("xrdp_rdp_process_data returned non zero\n\r")); + cont = 0; + self->term = 1; + } + break; + default: + g_printf("unknown in xrdp_process_main_loop\n\r"); + break; + } + if (cont) + { + cont = s->next_packet < s->end; + } + } + if (self->rdp_layer->up_and_running && self->wm == 0 && rv == 0) + { + /* only do this once */ + DEBUG(("xrdp_process_main_loop up and running\n\r")); + self->orders = xrdp_orders_create(self, self->rdp_layer); + self->wm = xrdp_wm_create(self, &self->rdp_layer->client_info); + xrdp_wm_init(self->wm); + } + return rv; +} + +/*****************************************************************************/ +int xrdp_process_main_loop(struct xrdp_process* self) +{ +#ifndef XRDP_LIB + int i; + struct stream* s; + + make_stream(s); + self->status = 1; + self->rdp_layer = xrdp_rdp_create(self, self->sck); + g_tcp_set_non_blocking(self->sck); + g_tcp_set_no_delay(self->sck); + if (xrdp_rdp_incoming(self->rdp_layer) == 0) + { + while (!g_is_term() && !self->term) + { + i = g_tcp_select(self->sck, self->app_sck); + if (i & 1) + { + init_stream(s, 8192); + if (xrdp_process_loop(self, s) != 0) + { + break; + } + } + if (i & 2) /* mod socket fired */ + { + if (self->wm->mod == 0) + { + break; + } + if (self->wm->mod->mod_signal == 0) + { + break; + } + if (self->wm->mod->mod_signal(self->wm->mod) != 0) + { + break; + } + } + if (i == 0) /* no data on any stream */ + { + g_sleep(10); + } + else if (i < 0) + { + break; + } + } + } + if (self->wm->mod != 0) + { + if (self->wm->mod->mod_end != 0) + { + self->wm->mod->mod_end(self->wm->mod); + } + } + xrdp_rdp_disconnect(self->rdp_layer); + g_sleep(500); + xrdp_rdp_delete(self->rdp_layer); + self->rdp_layer = 0; + g_tcp_close(self->sck); + self->status = -1; + xrdp_listen_delete_pro(self->lis_layer, self); + free_stream(s); +#endif + return 0; +} diff --git a/xrdp/xrdp_rdp.c b/xrdp/xrdp_rdp.c index bed3e833..a36aeac6 100644 --- a/xrdp/xrdp_rdp.c +++ b/xrdp/xrdp_rdp.c @@ -778,6 +778,53 @@ int xrdp_rdp_process_data_font(struct xrdp_rdp* self, struct stream* s) } /*****************************************************************************/ +/* sent 37 pdu */ +int xrdp_rdp_send_disconnect_query_response(struct xrdp_rdp* self) +{ + struct stream* s; + + make_stream(s); + init_stream(s, 8192); + if (xrdp_rdp_init_data(self, s) != 0) + { + free_stream(s); + return 1; + } + s_mark_end(s); + if (xrdp_rdp_send_data(self, s, 37) != 0) + { + free_stream(s); + return 1; + } + free_stream(s); + return 0; +} + +/*****************************************************************************/ +/* sent RDP_DATA_PDU_DISCONNECT 47 pdu */ +int xrdp_rdp_send_disconnect_reason(struct xrdp_rdp* self, int reason) +{ + struct stream* s; + + make_stream(s); + init_stream(s, 8192); + if (xrdp_rdp_init_data(self, s) != 0) + { + free_stream(s); + return 1; + } + out_uint32_le(s, reason); + s_mark_end(s); + if (xrdp_rdp_send_data(self, s, RDP_DATA_PDU_DISCONNECT) != 0) + { + free_stream(s); + return 1; + } + free_stream(s); + return 0; +} + +/*****************************************************************************/ /* RDP_PDU_DATA */ int xrdp_rdp_process_data(struct xrdp_rdp* self, struct stream* s) { @@ -806,18 +853,20 @@ int xrdp_rdp_process_data(struct xrdp_rdp* self, struct stream* s) case RDP_DATA_PDU_SYNCHRONISE: /* 31 */ xrdp_rdp_process_data_sync(self); break; - case 33: /* 33 ?? */ + case 33: /* 33 ?? Invalidate an area I think */ xrdp_rdp_process_screen_update(self, s); break; - - /*case 35:*/ + case 35: /* 35 ?? this comes when minimuzing a full screen mstsc.exe 2600 */ /* I think this is saying the client no longer wants screen */ /* updates and it will issue a 33 above to catch up */ - /* so minumized apps don't take bandwidth */ - - case 36: /* 36 ?? disconnect? */ - return 1; + /* so minimized apps don't take bandwidth */ + break; + case 36: /* 36 ?? disconnect query? */ + /* when this message comes, send a 37 back so the client */ + /* is sure the connection is alive and it can ask if user */ + /* really wants to disconnect */ + xrdp_rdp_send_disconnect_query_response(self); /* send a 37 back */ break; case RDP_DATA_PDU_FONT2: /* 39 */ xrdp_rdp_process_data_font(self, s); |
