summaryrefslogtreecommitdiffstats
path: root/xrdp/xrdp_mm.c
diff options
context:
space:
mode:
Diffstat (limited to 'xrdp/xrdp_mm.c')
-rw-r--r--xrdp/xrdp_mm.c113
1 files changed, 73 insertions, 40 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
@@ -681,22 +681,73 @@ xrdp_mm_chan_send_init(struct xrdp_mm* self)
}
/*****************************************************************************/
+/* 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)
{
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;
}