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

Diff for /src/usr.bin/ssh/session.c between version 1.6 and 1.7

version 1.6, 2000/04/27 15:23:02 version 1.7, 2000/04/28 08:10:20
Line 34 
Line 34 
 struct Session {  struct Session {
         int     used;          int     used;
         int     self;          int     self;
           int     extended;
         struct  passwd *pw;          struct  passwd *pw;
         pid_t   pid;          pid_t   pid;
         /* tty */          /* tty */
Line 46 
Line 47 
         int     screen;          int     screen;
         char    *auth_proto;          char    *auth_proto;
         char    *auth_data;          char    *auth_data;
           int     single_connection;
         /* proto 2 */          /* proto 2 */
         int     chanid;          int     chanid;
 };  };
Line 165 
Line 167 
                 channel_permit_all_opens();                  channel_permit_all_opens();
   
         s = session_new();          s = session_new();
           s->pw = pw;
   
         /*          /*
          * We stay in this loop until the client requests to execute a shell           * We stay in this loop until the client requests to execute a shell
Line 274 
Line 277 
                                     xauthfile, strerror(errno));                                      xauthfile, strerror(errno));
                                 xfree(xauthfile);                                  xfree(xauthfile);
                                 xauthfile = NULL;                                  xauthfile = NULL;
                                   /* XXXX remove listening channels */
                                 break;                                  break;
                         }                          }
                         strlcat(xauthfile, "/cookies", MAXPATHLEN);                          strlcat(xauthfile, "/cookies", MAXPATHLEN);
Line 453 
Line 457 
         close(perr[1]);          close(perr[1]);
   
         if (compat20) {          if (compat20) {
                 session_set_fds(s, pin[1], pout[0], perr[0]);                  session_set_fds(s, pin[1], pout[0], s->extended ? perr[0] : -1);
         } else {          } else {
                 /* Enter the interactive session. */                  /* Enter the interactive session. */
                 server_loop(pid, pin[1], pout[0], perr[0]);                  server_loop(pid, pin[1], pout[0], perr[0]);
Line 469 
Line 473 
          * handle the case that fdin and fdout are the same.           * handle the case that fdin and fdout are the same.
          */           */
         if (compat20) {          if (compat20) {
                 session_set_fds(s, inout[1], inout[1], err[1]);                  session_set_fds(s, inout[1], inout[1], s->extended ? err[1] : -1);
         } else {          } else {
                 server_loop(pid, inout[1], inout[1], err[1]);                  server_loop(pid, inout[1], inout[1], err[1]);
                 /* server_loop has closed inout[1] and err[1]. */                  /* server_loop has closed inout[1] and err[1]. */
Line 1046 
Line 1050 
                 Session *s = &sessions[i];                  Session *s = &sessions[i];
                 if (! s->used) {                  if (! s->used) {
                         s->pid = 0;                          s->pid = 0;
                           s->extended = 0;
                         s->chanid = -1;                          s->chanid = -1;
                         s->ptyfd = -1;                          s->ptyfd = -1;
                         s->ttyfd = -1;                          s->ttyfd = -1;
Line 1056 
Line 1061 
                         s->auth_data = NULL;                          s->auth_data = NULL;
                         s->auth_proto = NULL;                          s->auth_proto = NULL;
                         s->used = 1;                          s->used = 1;
                           s->pw = NULL;
                         debug("session_new: session %d", i);                          debug("session_new: session %d", i);
                         return s;                          return s;
                 }                  }
Line 1087 
Line 1093 
                 error("no more sessions");                  error("no more sessions");
                 return 0;                  return 0;
         }          }
         debug("session_open: session %d: link with channel %d", s->self, chanid);  
         s->chanid = chanid;  
         s->pw = auth_get_user();          s->pw = auth_get_user();
         if (s->pw == NULL)          if (s->pw == NULL)
                 fatal("no user for session %i channel %d",                  fatal("no user for session %i", s->self);
                     s->self, s->chanid);          debug("session_open: session %d: link with channel %d", s->self, chanid);
           s->chanid = chanid;
         return 1;          return 1;
 }  }
   
Line 1184 
Line 1189 
         return 1;          return 1;
 }  }
   
   int
   session_subsystem_req(Session *s)
   {
           unsigned int len;
           int success = 0;
           char *subsys = packet_get_string(&len);
   
           packet_done();
           log("subsystem request for %s", subsys);
   
           xfree(subsys);
           return success;
   }
   
   int
   session_x11_req(Session *s)
   {
           if (!options.x11_forwarding) {
                   debug("X11 forwarding disabled in server configuration file.");
                   return 0;
           }
           if (xauthfile != NULL) {
                   debug("X11 fwd already started.");
                   return 0;
           }
   
           debug("Received request for X11 forwarding with auth spoofing.");
           if (s->display != NULL)
                   packet_disconnect("Protocol error: X11 display already set.");
   
           s->single_connection = packet_get_char();
           s->auth_proto = packet_get_string(NULL);
           s->auth_data = packet_get_string(NULL);
           s->screen = packet_get_int();
           packet_done();
   
           s->display = x11_create_display_inet(s->screen, options.x11_display_offset);
           if (s->display == NULL) {
                   xfree(s->auth_proto);
                   xfree(s->auth_data);
                   return 0;
           }
           xauthfile = xmalloc(MAXPATHLEN);
           strlcpy(xauthfile, "/tmp/ssh-XXXXXXXX", MAXPATHLEN);
           temporarily_use_uid(s->pw->pw_uid);
           if (mkdtemp(xauthfile) == NULL) {
                   restore_uid();
                   error("private X11 dir: mkdtemp %s failed: %s",
                       xauthfile, strerror(errno));
                   xfree(xauthfile);
                   xauthfile = NULL;
                   xfree(s->auth_proto);
                   xfree(s->auth_data);
                   /* XXXX remove listening channels */
                   return 0;
           }
           strlcat(xauthfile, "/cookies", MAXPATHLEN);
           open(xauthfile, O_RDWR|O_CREAT|O_EXCL, 0600);
           restore_uid();
           fatal_add_cleanup(xauthfile_cleanup_proc, s);
           return 1;
   }
   
 void  void
 session_input_channel_req(int id, void *arg)  session_input_channel_req(int id, void *arg)
 {  {
Line 1214 
Line 1282 
         if (c->type == SSH_CHANNEL_LARVAL) {          if (c->type == SSH_CHANNEL_LARVAL) {
                 if (strcmp(rtype, "shell") == 0) {                  if (strcmp(rtype, "shell") == 0) {
                         packet_done();                          packet_done();
                           s->extended = 1;
                         if (s->ttyfd == -1)                          if (s->ttyfd == -1)
                                 do_exec_no_pty(s, NULL, s->pw);                                  do_exec_no_pty(s, NULL, s->pw);
                         else                          else
Line 1222 
Line 1291 
                 } else if (strcmp(rtype, "exec") == 0) {                  } else if (strcmp(rtype, "exec") == 0) {
                         char *command = packet_get_string(&len);                          char *command = packet_get_string(&len);
                         packet_done();                          packet_done();
                           s->extended = 1;
                         if (s->ttyfd == -1)                          if (s->ttyfd == -1)
                                 do_exec_no_pty(s, command, s->pw);                                  do_exec_no_pty(s, command, s->pw);
                         else                          else
Line 1230 
Line 1300 
                         success = 1;                          success = 1;
                 } else if (strcmp(rtype, "pty-req") == 0) {                  } else if (strcmp(rtype, "pty-req") == 0) {
                         success =  session_pty_req(s);                          success =  session_pty_req(s);
                   } else if (strcmp(rtype, "x11-req") == 0) {
                           success = session_x11_req(s);
                   } else if (strcmp(rtype, "subsystem") == 0) {
                           success = session_subsystem_req(s);
                 }                  }
         }          }
         if (strcmp(rtype, "window-change") == 0) {          if (strcmp(rtype, "window-change") == 0) {
Line 1403 
Line 1477 
          */           */
         alarm(0);          alarm(0);
         server_loop2();          server_loop2();
           if (xauthfile)
                   xauthfile_cleanup_proc(NULL);
 }  }

Legend:
Removed from v.1.6  
changed lines
  Added in v.1.7