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

Diff for /src/usr.bin/tmux/client.c between version 1.68 and 1.69

version 1.68, 2013/10/10 12:12:08 version 1.69, 2013/10/10 12:13:29
Line 479 
Line 479 
   
 /* Dispatch imsgs when in wait state (before MSG_READY). */  /* Dispatch imsgs when in wait state (before MSG_READY). */
 int  int
 client_dispatch_wait(void *data)  client_dispatch_wait(void *data0)
 {  {
         struct imsg             imsg;          struct imsg              imsg;
         ssize_t                 n, datalen;          char                    *data;
         struct msg_shell_data   shelldata;          ssize_t                  n, datalen;
         struct msg_exit_data    exitdata;          struct msg_stdout_data   stdoutdata;
         struct msg_stdout_data  stdoutdata;          struct msg_stderr_data   stderrdata;
         struct msg_stderr_data  stderrdata;          int                      retval;
         const char             *shellcmd = data;  
   
         for (;;) {          for (;;) {
                 if ((n = imsg_get(&client_ibuf, &imsg)) == -1)                  if ((n = imsg_get(&client_ibuf, &imsg)) == -1)
                         fatalx("imsg_get failed");                          fatalx("imsg_get failed");
                 if (n == 0)                  if (n == 0)
                         return (0);                          return (0);
   
                   data = imsg.data;
                 datalen = imsg.hdr.len - IMSG_HEADER_SIZE;                  datalen = imsg.hdr.len - IMSG_HEADER_SIZE;
   
                 log_debug("got %d from server", imsg.hdr.type);                  log_debug("got %d from server", imsg.hdr.type);
                 switch (imsg.hdr.type) {                  switch (imsg.hdr.type) {
                 case MSG_EXIT:                  case MSG_EXIT:
                 case MSG_SHUTDOWN:                  case MSG_SHUTDOWN:
                         if (datalen != sizeof exitdata) {                          if (datalen != sizeof retval && datalen != 0)
                                 if (datalen != 0)                                  fatalx("bad MSG_EXIT size");
                                         fatalx("bad MSG_EXIT size");                          if (datalen == sizeof retval) {
                         } else {                                  memcpy(&retval, data, sizeof retval);
                                 memcpy(&exitdata, imsg.data, sizeof exitdata);                                  client_exitval = retval;
                                 client_exitval = exitdata.retcode;  
                         }                          }
                         imsg_free(&imsg);                          imsg_free(&imsg);
                         return (-1);                          return (-1);
Line 525 
Line 525 
                         break;                          break;
                 case MSG_STDOUT:                  case MSG_STDOUT:
                         if (datalen != sizeof stdoutdata)                          if (datalen != sizeof stdoutdata)
                                 fatalx("bad MSG_STDOUT");                                  fatalx("bad MSG_STDOUT size");
                         memcpy(&stdoutdata, imsg.data, sizeof stdoutdata);                          memcpy(&stdoutdata, data, sizeof stdoutdata);
   
                         client_write(STDOUT_FILENO, stdoutdata.data, stdoutdata.size);                          client_write(STDOUT_FILENO, stdoutdata.data, stdoutdata.size);
                         break;                          break;
                 case MSG_STDERR:                  case MSG_STDERR:
                         if (datalen != sizeof stderrdata)                          if (datalen != sizeof stderrdata)
                                 fatalx("bad MSG_STDERR");                                  fatalx("bad MSG_STDERR size");
                         memcpy(&stderrdata, imsg.data, sizeof stderrdata);                          memcpy(&stderrdata, data, sizeof stderrdata);
   
                         client_write(STDERR_FILENO, stderrdata.data, stderrdata.size);                          client_write(STDERR_FILENO, stderrdata.data, stderrdata.size);
                         break;                          break;
Line 549 
Line 549 
                         imsg_free(&imsg);                          imsg_free(&imsg);
                         return (-1);                          return (-1);
                 case MSG_SHELL:                  case MSG_SHELL:
                         if (datalen != sizeof shelldata)                          if (data[datalen - 1] != '\0')
                                 fatalx("bad MSG_SHELL size");                                  fatalx("bad MSG_SHELL string");
                         memcpy(&shelldata, imsg.data, sizeof shelldata);  
                         shelldata.shell[(sizeof shelldata.shell) - 1] = '\0';  
   
                         clear_signals(0);                          clear_signals(0);
                           shell_exec(data, data0);
                         shell_exec(shelldata.shell, shellcmd);  
                         /* NOTREACHED */                          /* NOTREACHED */
                 case MSG_DETACH:                  case MSG_DETACH:
                         client_write_server(MSG_EXITING, NULL, 0);                          client_write_server(MSG_EXITING, NULL, 0);
Line 576 
Line 573 
 int  int
 client_dispatch_attached(void)  client_dispatch_attached(void)
 {  {
         struct imsg             imsg;          struct imsg              imsg;
         struct msg_lock_data    lockdata;          struct sigaction         sigact;
         struct sigaction        sigact;          char                    *data;
         ssize_t                 n, datalen;          ssize_t                  n, datalen;
   
         for (;;) {          for (;;) {
                 if ((n = imsg_get(&client_ibuf, &imsg)) == -1)                  if ((n = imsg_get(&client_ibuf, &imsg)) == -1)
                         fatalx("imsg_get failed");                          fatalx("imsg_get failed");
                 if (n == 0)                  if (n == 0)
                         return (0);                          return (0);
   
                   data = imsg.data;
                 datalen = imsg.hdr.len - IMSG_HEADER_SIZE;                  datalen = imsg.hdr.len - IMSG_HEADER_SIZE;
   
                 log_debug("got %d from server", imsg.hdr.type);                  log_debug("got %d from server", imsg.hdr.type);
Line 603 
Line 602 
                         client_write_server(MSG_EXITING, NULL, 0);                          client_write_server(MSG_EXITING, NULL, 0);
                         break;                          break;
                 case MSG_EXIT:                  case MSG_EXIT:
                         if (datalen != 0 &&                          if (datalen != 0 && datalen != sizeof (int))
                             datalen != sizeof (struct msg_exit_data))  
                                 fatalx("bad MSG_EXIT size");                                  fatalx("bad MSG_EXIT size");
   
                         client_write_server(MSG_EXITING, NULL, 0);                          client_write_server(MSG_EXITING, NULL, 0);
Line 637 
Line 635 
                         kill(getpid(), SIGTSTP);                          kill(getpid(), SIGTSTP);
                         break;                          break;
                 case MSG_LOCK:                  case MSG_LOCK:
                         if (datalen != sizeof lockdata)                          if (data[datalen - 1] != '\0')
                                 fatalx("bad MSG_LOCK size");                                  fatalx("bad MSG_LOCK string");
                         memcpy(&lockdata, imsg.data, sizeof lockdata);  
   
                         lockdata.cmd[(sizeof lockdata.cmd) - 1] = '\0';                          system(data);
                         system(lockdata.cmd);  
                         client_write_server(MSG_UNLOCK, NULL, 0);                          client_write_server(MSG_UNLOCK, NULL, 0);
                         break;                          break;
                 default:                  default:

Legend:
Removed from v.1.68  
changed lines
  Added in v.1.69