summaryrefslogtreecommitdiff
path: root/session.c
diff options
context:
space:
mode:
authorDamien Miller <djm@mindrot.org>2001-10-12 11:35:04 +1000
committerDamien Miller <djm@mindrot.org>2001-10-12 11:35:04 +1000
commit3ec2759ad40f054c152c753db046ac55f9670d14 (patch)
tree3b26532eed14eaf485834a531a4d187cde1b1149 /session.c
parent4e088e4de02b6c813b498a1270df85e8136c4499 (diff)
- (djm) OpenBSD CVS Sync
- markus@cvs.openbsd.org 2001/10/10 22:18:47 [channels.c channels.h clientloop.c nchan.c serverloop.c] [session.c session.h] try to keep channels open until an exit-status message is sent. don't kill the login shells if the shells stdin/out/err is closed. this should now work: ssh -2n localhost 'exec > /dev/null 2>&1; sleep 10; exit 5'; echo ?
Diffstat (limited to 'session.c')
-rw-r--r--session.c29
1 files changed, 11 insertions, 18 deletions
diff --git a/session.c b/session.c
index 0d6ebdaea..6ba2e7c77 100644
--- a/session.c
+++ b/session.c
@@ -33,7 +33,7 @@
33 */ 33 */
34 34
35#include "includes.h" 35#include "includes.h"
36RCSID("$OpenBSD: session.c,v 1.106 2001/10/09 21:59:41 markus Exp $"); 36RCSID("$OpenBSD: session.c,v 1.107 2001/10/10 22:18:47 markus Exp $");
37 37
38#include "ssh.h" 38#include "ssh.h"
39#include "ssh1.h" 39#include "ssh1.h"
@@ -1958,36 +1958,29 @@ session_close_by_channel(int id, void *arg)
1958{ 1958{
1959 Session *s = session_by_channel(id); 1959 Session *s = session_by_channel(id);
1960 if (s == NULL) { 1960 if (s == NULL) {
1961 debug("session_close_by_channel: no session for channel %d", id); 1961 debug("session_close_by_channel: no session for id %d", id);
1962 return; 1962 return;
1963 } 1963 }
1964 /* disconnect channel */ 1964 debug("session_close_by_channel: channel %d child %d", id, s->pid);
1965 channel_cancel_cleanup(s->chanid);
1966 s->chanid = -1;
1967
1968 debug("session_close_by_channel: channel %d kill %d", id, s->pid);
1969 if (s->pid != 0) { 1965 if (s->pid != 0) {
1970 /* notify child */ 1966 /* delay detach */
1971 if (kill(s->pid, SIGHUP) < 0) 1967 debug("session_close_by_channel: channel %d: has child", id);
1972 error("session_close_by_channel: kill %d: %s", 1968 return;
1973 s->pid, strerror(errno));
1974 } 1969 }
1970 /* detach by removing callback */
1971 channel_cancel_cleanup(s->chanid);
1972 s->chanid = -1;
1975 session_close(s); 1973 session_close(s);
1976} 1974}
1977 1975
1978void 1976void
1979session_close_all(void) 1977session_destroy_all(void)
1980{ 1978{
1981 int i; 1979 int i;
1982 for(i = 0; i < MAX_SESSIONS; i++) { 1980 for(i = 0; i < MAX_SESSIONS; i++) {
1983 Session *s = &sessions[i]; 1981 Session *s = &sessions[i];
1984 if (s->used) { 1982 if (s->used)
1985 if (s->chanid != -1) {
1986 channel_cancel_cleanup(s->chanid);
1987 s->chanid = -1;
1988 }
1989 session_close(s); 1983 session_close(s);
1990 }
1991 } 1984 }
1992} 1985}
1993 1986