[BACK]Return to ssh.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / ssh

Diff for /src/usr.bin/ssh/ssh.c between version 1.299 and 1.300

version 1.299, 2007/06/14 21:43:25 version 1.300, 2007/06/14 22:48:05
Line 1286 
Line 1286 
 control_client(const char *path)  control_client(const char *path)
 {  {
         struct sockaddr_un addr;          struct sockaddr_un addr;
         int i, r, fd, sock, exitval, num_env;          int i, r, fd, sock, exitval[2], num_env;
         Buffer m;          Buffer m;
         char *term;          char *term;
         extern char **environ;          extern char **environ;
Line 1435 
Line 1435 
         if (tty_flag)          if (tty_flag)
                 enter_raw_mode();                  enter_raw_mode();
   
         /* Stick around until the controlee closes the client_fd */          /*
         exitval = 0;           * Stick around until the controlee closes the client_fd.
            * Before it does, it is expected to write this process' exit
            * value (one int). This process must read the value and wait for
            * the closure of the client_fd; if this one closes early, the
            * multiplex master will terminate early too (possibly losing data).
            */
           exitval[0] = 0;
         for (i = 0; !control_client_terminate && i < (int)sizeof(exitval);) {          for (i = 0; !control_client_terminate && i < (int)sizeof(exitval);) {
                 r = read(sock, (char *)&exitval + i, sizeof(exitval) - i);                  r = read(sock, (char *)exitval + i, sizeof(exitval) - i);
                 if (r == 0) {                  if (r == 0) {
                         debug2("Received EOF from master");                          debug2("Received EOF from master");
                         break;                          break;
Line 1450 
Line 1456 
                 }                  }
                 i += r;                  i += r;
         }          }
   
         close(sock);          close(sock);
         leave_raw_mode();          leave_raw_mode();
           if (i > (int)sizeof(int))
                   fatal("%s: master returned too much data (%d > %lu)",
                       __func__, i, sizeof(int));
         if (control_client_terminate) {          if (control_client_terminate) {
                 debug2("Exiting on signal %d", control_client_terminate);                  debug2("Exiting on signal %d", control_client_terminate);
                 exitval = 255;                  exitval[0] = 255;
         } else if (i < (int)sizeof(exitval)) {          } else if (i < (int)sizeof(int)) {
                 debug2("Control master terminated unexpectedly");                  debug2("Control master terminated unexpectedly");
                 exitval = 255;                  exitval[0] = 255;
         } else          } else
                 debug2("Received exit status from master %d", exitval);                  debug2("Received exit status from master %d", exitval[0]);
   
         if (tty_flag && options.log_level != SYSLOG_LEVEL_QUIET)          if (tty_flag && options.log_level != SYSLOG_LEVEL_QUIET)
                 fprintf(stderr, "Shared connection to %s closed.\r\n",                  fprintf(stderr, "Shared connection to %s closed.\r\n", host);
                     host);  
   
         exit(exitval);          exit(exitval[0]);
 }  }

Legend:
Removed from v.1.299  
changed lines
  Added in v.1.300