From 238d14b60a278c76d0ba983aea290e64c17e652d Mon Sep 17 00:00:00 2001 From: Jay Sorg Date: Fri, 16 Mar 2012 16:07:19 -0700 Subject: [PATCH] xrdp: added override setting for chansrv port --- xrdp/xrdp_mm.c | 113 ++++++++++++++++++++++++++++++---------------- xrdp/xrdp_types.h | 1 + xrdp/xrdp_wm.c | 2 +- 3 files changed, 75 insertions(+), 41 deletions(-) diff --git a/xrdp/xrdp_mm.c b/xrdp/xrdp_mm.c index 16f31acf..29c777ce 100644 --- a/xrdp/xrdp_mm.c +++ b/xrdp/xrdp_mm.c @@ -680,6 +680,61 @@ xrdp_mm_chan_send_init(struct xrdp_mm* self) return trans_force_write(self->chan_trans); } +/*****************************************************************************/ +/* connect to chansrv */ +static int APP_CC +xrdp_mm_connect_chansrv(struct xrdp_mm* self, char* ip, char* port) +{ + int index; + + self->usechansrv = 1; + + /* connect channel redir */ + if ((ip == 0) || (strcmp(ip, "127.0.0.1") == 0) || (ip[0] == 0)) + { + /* unix socket */ + self->chan_trans = trans_create(TRANS_MODE_UNIX, 8192, 8192); + } + else + { + /* tcp */ + self->chan_trans = trans_create(TRANS_MODE_TCP, 8192, 8192); + } + self->chan_trans->trans_data_in = xrdp_mm_chan_data_in; + self->chan_trans->header_size = 8; + self->chan_trans->callback_data = self; + /* try to connect up to 4 times */ + for (index = 0; index < 4; index++) + { + if (trans_connect(self->chan_trans, ip, port, 3000) == 0) + { + self->chan_trans_up = 1; + break; + } + g_sleep(1000); + g_writeln("xrdp_mm_connect_chansrv: connect failed " + "trying again..."); + } + if (!(self->chan_trans_up)) + { + g_writeln("xrdp_mm_connect_chansrv: error in trans_connect " + "chan"); + } + if (self->chan_trans_up) + { + if (xrdp_mm_chan_send_init(self) != 0) + { + g_writeln("xrdp_mm_connect_chansrv: error in " + "xrdp_mm_chan_send_init"); + } + else + { + g_writeln("xrdp_mm_connect_chansrv: chansrv connect successful"); + } + } + return 0; +} + /*****************************************************************************/ static int APP_CC xrdp_mm_process_login_response(struct xrdp_mm* self, struct stream* s) @@ -687,16 +742,12 @@ xrdp_mm_process_login_response(struct xrdp_mm* self, struct stream* s) int ok; int display; int rv; - int index; int uid; int gid; char text[256]; char ip[256]; char port[256]; - g_memset(text,0,sizeof(char) * 256); - g_memset(ip,0,sizeof(char) * 256); - g_memset(port,0,sizeof(char) * 256); rv = 0; in_uint16_be(s, ok); in_uint16_be(s, display); @@ -714,46 +765,15 @@ xrdp_mm_process_login_response(struct xrdp_mm* self, struct stream* s) xrdp_wm_set_login_mode(self->wm, 10); self->wm->dragging = 0; /* connect channel redir */ - if (strcmp(ip, "127.0.0.1") == 0) + if ((ip == 0) || (strcmp(ip, "127.0.0.1") == 0) || (ip[0] == 0)) { - /* unix socket */ - self->chan_trans = trans_create(TRANS_MODE_UNIX, 8192, 8192); g_snprintf(port, 255, "/tmp/.xrdp/xrdp_chansrv_socket_%d", 7200 + display); } else { - /* tcp */ - self->chan_trans = trans_create(TRANS_MODE_TCP, 8192, 8192); g_snprintf(port, 255, "%d", 7200 + display); } - self->chan_trans->trans_data_in = xrdp_mm_chan_data_in; - self->chan_trans->header_size = 8; - self->chan_trans->callback_data = self; - /* try to connect up to 4 times */ - for (index = 0; index < 4; index++) - { - if (trans_connect(self->chan_trans, ip, port, 3000) == 0) - { - self->chan_trans_up = 1; - break; - } - g_sleep(1000); - g_writeln("xrdp_mm_process_login_response: connect failed " - "trying again..."); - } - if (!(self->chan_trans_up)) - { - g_writeln("xrdp_mm_process_login_response: error in trans_connect " - "chan"); - } - if (self->chan_trans_up) - { - if (xrdp_mm_chan_send_init(self) != 0) - { - g_writeln("xrdp_mm_process_login_response: error in " - "xrdp_mm_chan_send_init"); - } - } + xrdp_mm_connect_chansrv(self, ip, port); } } } @@ -931,6 +951,7 @@ xrdp_mm_connect(struct xrdp_mm* self) char errstr[256]; char text[256]; char port[8]; + char chansrvport[256]; g_memset(ip,0,sizeof(char) * 256); g_memset(errstr,0,sizeof(char) * 256); @@ -956,6 +977,11 @@ xrdp_mm_connect(struct xrdp_mm* self) use_sesman = 1; } } + else if (g_strcasecmp(name, "chansrvport") == 0) + { + g_strncpy(chansrvport, value, 255); + self->usechansrv = 1; + } } if (use_sesman) { @@ -1016,6 +1042,13 @@ xrdp_mm_connect(struct xrdp_mm* self) } self->sesman_controlled = use_sesman; + if ((self->wm->login_mode == 10) && (self->sesman_controlled == 0) && + (self->usechansrv != 0)) + { + /* if sesman controlled, this will connect later */ + xrdp_mm_connect_chansrv(self, "", chansrvport); + } + return rv; } @@ -1502,7 +1535,7 @@ server_query_channel(struct xrdp_mod* mod, int index, char* channel_name, struct xrdp_wm* wm; wm = (struct xrdp_wm*)(mod->wm); - if (wm->mm->sesman_controlled) + if (wm->mm->usechansrv) { return 1; } @@ -1518,7 +1551,7 @@ server_get_channel_id(struct xrdp_mod* mod, char* name) struct xrdp_wm* wm; wm = (struct xrdp_wm*)(mod->wm); - if (wm->mm->sesman_controlled) + if (wm->mm->usechansrv) { return -1; } @@ -1534,7 +1567,7 @@ server_send_to_channel(struct xrdp_mod* mod, int channel_id, struct xrdp_wm* wm; wm = (struct xrdp_wm*)(mod->wm); - if (wm->mm->sesman_controlled) + if (wm->mm->usechansrv) { return 1; } diff --git a/xrdp/xrdp_types.h b/xrdp/xrdp_types.h index 1a16e1be..3187225a 100644 --- a/xrdp/xrdp_types.h +++ b/xrdp/xrdp_types.h @@ -191,6 +191,7 @@ struct xrdp_mm struct trans* chan_trans; /* connection to chansrv */ int chan_trans_up; /* true once connected to chansrv */ int delete_chan_trans; /* boolean set when done with channel connection */ + int usechansrv; /* true if chansrvport is set in xrdp.ini or using sesman */ }; struct xrdp_key_info diff --git a/xrdp/xrdp_wm.c b/xrdp/xrdp_wm.c index 8c36abf2..ca8e5ce9 100644 --- a/xrdp/xrdp_wm.c +++ b/xrdp/xrdp_wm.c @@ -1361,7 +1361,7 @@ xrdp_wm_process_channel_data(struct xrdp_wm* self, rv = 1; if (self->mm->mod != 0) { - if (self->mm->sesman_controlled) + if (self->mm->usechansrv) { rv = xrdp_mm_process_channel_data(self->mm, param1, param2, param3, param4);