diff options
author | Jay Sorg <jay.sorg@gmail.com> | 2011-07-07 09:27:43 -0700 |
---|---|---|
committer | Jay Sorg <jay.sorg@gmail.com> | 2011-07-07 09:27:43 -0700 |
commit | 0e5e50925c4b0fc5c91388f064919d42a9530301 (patch) | |
tree | c611514b151e2a8bcc1bdee0485c02a259c918a7 /xrdp | |
parent | c5b1b0fe454f5f9ff797b6b68ae3abe6cda49404 (diff) | |
download | xrdp-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.c | 35 | ||||
-rw-r--r-- | xrdp/xrdp_types.h | 2 |
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 |