summaryrefslogtreecommitdiffhomepage
path: root/svr-chansession.c
diff options
context:
space:
mode:
Diffstat (limited to 'svr-chansession.c')
-rw-r--r--svr-chansession.c25
1 files changed, 21 insertions, 4 deletions
diff --git a/svr-chansession.c b/svr-chansession.c
index faf62e5..038a0f2 100644
--- a/svr-chansession.c
+++ b/svr-chansession.c
@@ -51,6 +51,7 @@ static void execchild(const void *user_data_chansess);
static void addchildpid(struct ChanSess *chansess, pid_t pid);
static void sesssigchild_handler(int val);
static void closechansess(const struct Channel *channel);
+static void cleanupchansess(const struct Channel *channel);
static int newchansess(struct Channel *channel);
static void chansessionrequest(struct Channel *channel);
static int sesscheckclose(const struct Channel *channel);
@@ -69,6 +70,7 @@ const struct ChanType svrchansess = {
sesscheckclose, /* checkclosehandler */
chansessionrequest, /* reqhandler */
closechansess, /* closehandler */
+ cleanupchansess /* cleanup */
};
/* required to clear environment */
@@ -91,7 +93,7 @@ void svr_chansess_checksignal(void) {
while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {
unsigned int i;
struct exitinfo *ex = NULL;
- TRACE(("sigchld handler: pid %d", pid))
+ TRACE(("svr_chansess_checksignal : pid %d", pid))
ex = NULL;
/* find the corresponding chansess */
@@ -285,8 +287,25 @@ chansess_login_alloc(const struct ChanSess *chansess) {
return li;
}
-/* clean a session channel */
+/* send exit status message before the channel is closed */
static void closechansess(const struct Channel *channel) {
+ struct ChanSess *chansess;
+
+ TRACE(("enter closechansess"))
+
+ chansess = (struct ChanSess*)channel->typedata;
+
+ if (chansess == NULL) {
+ TRACE(("leave closechansess: chansess == NULL"))
+ return;
+ }
+
+ send_exitsignalstatus(channel);
+ TRACE(("leave closechansess"))
+}
+
+/* clean a session channel */
+static void cleanupchansess(const struct Channel *channel) {
struct ChanSess *chansess;
unsigned int i;
@@ -301,8 +320,6 @@ static void closechansess(const struct Channel *channel) {
return;
}
- send_exitsignalstatus(channel);
-
m_free(chansess->cmd);
m_free(chansess->term);