From 0e5e50925c4b0fc5c91388f064919d42a9530301 Mon Sep 17 00:00:00 2001 From: Jay Sorg Date: Thu, 7 Jul 2011 09:27:43 -0700 Subject: [PATCH] added a way to disconnect a session from within a session --- xrdp/xrdp_mm.c | 35 +++++++++++++++++++++++++++++++++++ xrdp/xrdp_types.h | 2 ++ 2 files changed, 37 insertions(+) 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