]> git.ipfire.org Git - thirdparty/openssh-portable.git/commitdiff
- markus@cvs.openbsd.org 2001/10/24 19:57:40
authorDamien Miller <djm@mindrot.org>
Sun, 11 Nov 2001 23:52:25 +0000 (10:52 +1100)
committerDamien Miller <djm@mindrot.org>
Sun, 11 Nov 2001 23:52:25 +0000 (10:52 +1100)
     [clientloop.c]
     make ~& (backgrounding) work again for proto v1; add support ~& for v2, too

ChangeLog
clientloop.c

index b11fb7c9b21c6fcf6a44e1340090f8c945f848c6..29671088f93921a16fe66fb42b0fbe00737f1b8f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -11,6 +11,9 @@
    - markus@cvs.openbsd.org 2001/10/24 08:51:35
      [clientloop.c ssh.c]
      ignore SIGPIPE early, makes ssh work if agent dies, netbsd-pr via itojun@
+   - markus@cvs.openbsd.org 2001/10/24 19:57:40
+     [clientloop.c]
+     make ~& (backgrounding) work again for proto v1; add support ~& for v2, too
 
 20011109
  - (stevesk) auth-pam.c: use do_pam_authenticate(PAM_DISALLOW_NULL_AUTHTOK)
  - Wrote replacements for strlcpy and mkdtemp
  - Released 1.0pre1
 
-$Id: ChangeLog,v 1.1637 2001/11/11 23:52:03 djm Exp $
+$Id: ChangeLog,v 1.1638 2001/11/11 23:52:25 djm Exp $
index 7e6fe269ab106b024cd6b9ef3bae8e81edc3e0d7..e8cd49988f5315ab95ee5ebf9488a0aa69bfbf81 100644 (file)
@@ -59,7 +59,7 @@
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: clientloop.c,v 1.85 2001/10/24 08:51:35 markus Exp $");
+RCSID("$OpenBSD: clientloop.c,v 1.86 2001/10/24 19:57:40 markus Exp $");
 
 #include "ssh.h"
 #include "ssh1.h"
@@ -522,36 +522,19 @@ process_escapes(Buffer *bin, Buffer *bout, Buffer *berr, char *buf, int len)
                                continue;
 
                        case '&':
-                               /* XXX does not work yet with proto 2 */
-                               if (compat20)
-                                       continue;
                                /*
                                 * Detach the program (continue to serve connections,
                                 * but put in background and no more new connections).
                                 */
-                               if (!stdin_eof) {
-                                       /*
-                                        * Sending SSH_CMSG_EOF alone does not always appear
-                                        * to be enough.  So we try to send an EOF character
-                                        * first.
-                                        */
-                                       packet_start(SSH_CMSG_STDIN_DATA);
-                                       packet_put_string("\004", 1);
-                                       packet_send();
-                                       /* Close stdin. */
-                                       stdin_eof = 1;
-                                       if (buffer_len(bin) == 0) {
-                                               packet_start(SSH_CMSG_EOF);
-                                               packet_send();
-                                       }
-                               }
                                /* Restore tty modes. */
                                leave_raw_mode();
 
                                /* Stop listening for new connections. */
-                               channel_close_all();    /* proto1 only XXXX */
+                               channel_stop_listening();
 
-                               printf("%c& [backgrounded]\n", escape_char);
+                               snprintf(string, sizeof string,
+                                   "%c& [backgrounded]\n", escape_char);
+                               buffer_append(berr, string, strlen(string));
 
                                /* Fork into background. */
                                pid = fork();
@@ -564,7 +547,27 @@ process_escapes(Buffer *bin, Buffer *bout, Buffer *berr, char *buf, int len)
                                        exit(0);
                                }
                                /* The child continues serving connections. */
-                               continue; /*XXX ? */
+                               if (compat20) {
+                                       buffer_append(bin, "\004", 1);
+                                       /* fake EOF on stdin */
+                                       return -1;
+                               } else if (!stdin_eof) {
+                                       /*
+                                        * Sending SSH_CMSG_EOF alone does not always appear
+                                        * to be enough.  So we try to send an EOF character
+                                        * first.
+                                        */
+                                       packet_start(SSH_CMSG_STDIN_DATA);
+                                       packet_put_string("\004", 1);
+                                       packet_send();
+                                       /* Close stdin. */
+                                       stdin_eof = 1;
+                                       if (buffer_len(bin) == 0) {
+                                               packet_start(SSH_CMSG_EOF);
+                                               packet_send();
+                                       }
+                               }
+                               continue;
 
                        case '?':
                                snprintf(string, sizeof string,