summaryrefslogtreecommitdiffstats
path: root/xrdp
diff options
context:
space:
mode:
authorJay Sorg <jay.sorg@gmail.com>2011-07-07 09:27:43 -0700
committerJay Sorg <jay.sorg@gmail.com>2011-07-07 09:27:43 -0700
commit0e5e50925c4b0fc5c91388f064919d42a9530301 (patch)
treec611514b151e2a8bcc1bdee0485c02a259c918a7 /xrdp
parentc5b1b0fe454f5f9ff797b6b68ae3abe6cda49404 (diff)
downloadxrdp-proprietary-0e5e50925c4b0fc5c91388f064919d42a9530301.tar.gz
xrdp-proprietary-0e5e50925c4b0fc5c91388f064919d42a9530301.zip
added a way to disconnect a session from within a session
Diffstat (limited to 'xrdp')
-rw-r--r--xrdp/xrdp_mm.c35
-rw-r--r--xrdp/xrdp_types.h2
2 files changed, 37 insertions, 0 deletions
diff --git a/xrdp/xrdp_mm.c b/xrdp/xrdp_mm.c
index af7c0474..1e32663c 100644
--- a/xrdp/xrdp_mm.c
+++ b/xrdp/xrdp_mm.c
@@ -99,6 +99,10 @@ xrdp_mm_delete(struct xrdp_mm* self)
self->sesman_trans_up = 0;
list_delete(self->login_names);
list_delete(self->login_values);
+ if (self->dis_wo > 0)
+ {
+ g_delete_wait_obj(self->dis_wo);
+ }
g_free(self);
}
@@ -147,6 +151,10 @@ xrdp_mm_send_login(struct xrdp_mm* self)
xrdp_wm_log_msg(self->wm, "Error finding username and password");
return 1;
}
+ else
+ {
+ g_strncpy(self->username, username, 255);
+ }
s = trans_get_out_s(self->sesman_trans, 8192);
s_push_layer(s, channel_hdr, 8);
@@ -658,6 +666,8 @@ xrdp_mm_process_login_response(struct xrdp_mm* self, struct stream* s)
int display = 0;
int rv = 0;
int index = 0;
+ int uid;
+ int gid;
char text[256];
char ip[256];
char port[256];
@@ -724,6 +734,17 @@ xrdp_mm_process_login_response(struct xrdp_mm* self, struct stream* s)
}
}
}
+ g_snprintf(text, 255, "xrdp_disconnect_display_%d", self->display);
+ self->dis_wo = g_create_wait_obj(text);
+ if (self->dis_wo > 0)
+ {
+ g_snprintf(text, 255, "/tmp/xrdp_disconnect_display_%d",
+ self->display);
+ if (g_getuser_info(self->username, &uid, &gid, 0, 0, 0) == 0)
+ {
+ g_chown(text, uid, gid);
+ }
+ }
}
else
{
@@ -1009,6 +1030,11 @@ xrdp_mm_get_wait_objs(struct xrdp_mm* self,
{
trans_get_wait_objs(self->chan_trans, read_objs, rcount, timeout);
}
+ if (self->dis_wo > 0)
+ {
+ read_objs[*rcount] = self->dis_wo;
+ (*rcount)++;
+ }
if (self->mod != 0)
{
if (self->mod->mod_get_wait_objs != 0)
@@ -1046,6 +1072,15 @@ xrdp_mm_check_wait_objs(struct xrdp_mm* self)
self->delete_chan_trans = 1;
}
}
+ if (self->dis_wo > 0)
+ {
+ if (g_is_wait_obj_set(self->dis_wo))
+ {
+ g_writeln("xrdp_mm_check_wait_objs: disconnecting per user request");
+ g_reset_wait_obj(self->dis_wo);
+ return 1;
+ }
+ }
if (self->mod != 0)
{
if (self->mod->mod_check_wait_objs != 0)
diff --git a/xrdp/xrdp_types.h b/xrdp/xrdp_types.h
index eb4d0ad0..7c29872e 100644
--- a/xrdp/xrdp_types.h
+++ b/xrdp/xrdp_types.h
@@ -191,6 +191,8 @@ 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 */
+ tbus dis_wo;
+ char username[256];
};
struct xrdp_key_info