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

Diff for /src/usr.bin/tmux/file.c between version 1.2 and 1.3

version 1.2, 2019/12/12 11:51:32 version 1.3, 2019/12/16 15:48:50
Line 17 
Line 17 
  */   */
   
 #include <sys/types.h>  #include <sys/types.h>
   #include <sys/queue.h>
   
 #include <errno.h>  #include <errno.h>
 #include <fcntl.h>  #include <fcntl.h>
   #include <imsg.h>
 #include <stdio.h>  #include <stdio.h>
 #include <stdlib.h>  #include <stdlib.h>
 #include <string.h>  #include <string.h>
Line 147 
Line 149 
                 msg.stream = 1;                  msg.stream = 1;
                 msg.fd = STDOUT_FILENO;                  msg.fd = STDOUT_FILENO;
                 msg.flags = 0;                  msg.flags = 0;
                 strlcpy(msg.path, "-", sizeof msg.path);  
                 proc_send(c->peer, MSG_WRITE_OPEN, -1, &msg, sizeof msg);                  proc_send(c->peer, MSG_WRITE_OPEN, -1, &msg, sizeof msg);
         } else {          } else {
                 evbuffer_add_vprintf(cf->buffer, fmt, ap);                  evbuffer_add_vprintf(cf->buffer, fmt, ap);
Line 174 
Line 175 
                 msg.stream = 1;                  msg.stream = 1;
                 msg.fd = STDOUT_FILENO;                  msg.fd = STDOUT_FILENO;
                 msg.flags = 0;                  msg.flags = 0;
                 strlcpy(msg.path, "-", sizeof msg.path);  
                 proc_send(c->peer, MSG_WRITE_OPEN, -1, &msg, sizeof msg);                  proc_send(c->peer, MSG_WRITE_OPEN, -1, &msg, sizeof msg);
         } else {          } else {
                 evbuffer_add(cf->buffer, data, size);                  evbuffer_add(cf->buffer, data, size);
Line 204 
Line 204 
                 msg.stream = 2;                  msg.stream = 2;
                 msg.fd = STDERR_FILENO;                  msg.fd = STDERR_FILENO;
                 msg.flags = 0;                  msg.flags = 0;
                 strlcpy(msg.path, "-", sizeof msg.path);  
                 proc_send(c->peer, MSG_WRITE_OPEN, -1, &msg, sizeof msg);                  proc_send(c->peer, MSG_WRITE_OPEN, -1, &msg, sizeof msg);
         } else {          } else {
                 evbuffer_add_vprintf(cf->buffer, fmt, ap);                  evbuffer_add_vprintf(cf->buffer, fmt, ap);
Line 220 
Line 219 
 {  {
         struct client_file      *cf;          struct client_file      *cf;
         FILE                    *f;          FILE                    *f;
         struct msg_write_open    msg;          struct msg_write_open   *msg;
           size_t                   msglen;
         int                      fd = -1;          int                      fd = -1;
         const char              *mode;          const char              *mode;
   
Line 261 
Line 261 
 skip:  skip:
         evbuffer_add(cf->buffer, bdata, bsize);          evbuffer_add(cf->buffer, bdata, bsize);
   
         msg.stream = cf->stream;          msglen = strlen(cf->path) + 1 + sizeof *msg;
         msg.fd = fd;          if (msglen > MAX_IMSGSIZE - IMSG_HEADER_SIZE) {
         msg.flags = flags;  
         if (strlcpy(msg.path, cf->path, sizeof msg.path) >= sizeof msg.path) {  
                 cf->error = E2BIG;                  cf->error = E2BIG;
                 goto done;                  goto done;
         }          }
         if (proc_send(c->peer, MSG_WRITE_OPEN, -1, &msg, sizeof msg) != 0) {          msg = xmalloc(msglen);
           msg->stream = cf->stream;
           msg->fd = fd;
           msg->flags = flags;
           memcpy(msg + 1, cf->path, msglen - sizeof *msg);
           if (proc_send(c->peer, MSG_WRITE_OPEN, -1, msg, msglen) != 0) {
                   free(msg);
                 cf->error = EINVAL;                  cf->error = EINVAL;
                 goto done;                  goto done;
         }          }
           free(msg);
         return;          return;
   
 done:  done:
Line 283 
Line 288 
 {  {
         struct client_file      *cf;          struct client_file      *cf;
         FILE                    *f;          FILE                    *f;
         struct msg_read_open     msg;          struct msg_read_open    *msg;
           size_t                   msglen, size;
         int                      fd = -1;          int                      fd = -1;
         char                     buffer[BUFSIZ];          char                     buffer[BUFSIZ];
         size_t                   size;  
   
         if (strcmp(path, "-") == 0) {          if (strcmp(path, "-") == 0) {
                 cf = file_create(c, file_next_stream++, cb, cbdata);                  cf = file_create(c, file_next_stream++, cb, cbdata);
Line 327 
Line 332 
         }          }
   
 skip:  skip:
         msg.stream = cf->stream;          msglen = strlen(cf->path) + 1 + sizeof *msg;
         msg.fd = fd;          if (msglen > MAX_IMSGSIZE - IMSG_HEADER_SIZE) {
         if (strlcpy(msg.path, cf->path, sizeof msg.path) >= sizeof msg.path) {  
                 cf->error = E2BIG;                  cf->error = E2BIG;
                 goto done;                  goto done;
         }          }
         if (proc_send(c->peer, MSG_READ_OPEN, -1, &msg, sizeof msg) != 0) {          msg = xmalloc(msglen);
           msg->stream = cf->stream;
           msg->fd = fd;
           memcpy(msg + 1, cf->path, msglen - sizeof *msg);
           if (proc_send(c->peer, MSG_READ_OPEN, -1, msg, msglen) != 0) {
                   free(msg);
                 cf->error = EINVAL;                  cf->error = EINVAL;
                 goto done;                  goto done;
         }          }
           free(msg);
         return;          return;
   
 done:  done:
Line 358 
Line 368 
 file_push(struct client_file *cf)  file_push(struct client_file *cf)
 {  {
         struct client           *c = cf->c;          struct client           *c = cf->c;
         struct msg_write_data    msg;          struct msg_write_data   *msg;
           size_t                   msglen, sent, left;
         struct msg_write_close   close;          struct msg_write_close   close;
         size_t                   sent, left;  
   
           msg = xmalloc(sizeof *msg);
         left = EVBUFFER_LENGTH(cf->buffer);          left = EVBUFFER_LENGTH(cf->buffer);
         while (left != 0) {          while (left != 0) {
                 sent = left;                  sent = left;
                 if (sent > sizeof msg.data)                  if (sent > MAX_IMSGSIZE - IMSG_HEADER_SIZE)
                         sent = sizeof msg.data;                          sent = MAX_IMSGSIZE - IMSG_HEADER_SIZE;
                 memcpy(msg.data, EVBUFFER_DATA(cf->buffer), sent);  
                 msg.size = sent;  
   
                 msg.stream = cf->stream;                  msglen = (sizeof *msg) + sent;
                 if (proc_send(c->peer, MSG_WRITE, -1, &msg, sizeof msg) != 0)                  msg = xrealloc(msg, msglen);
                   msg->stream = cf->stream;
                   memcpy(msg + 1, EVBUFFER_DATA(cf->buffer), sent);
                   if (proc_send(c->peer, MSG_WRITE, -1, msg, msglen) != 0)
                         break;                          break;
                 evbuffer_drain(cf->buffer, sent);                  evbuffer_drain(cf->buffer, sent);
   
Line 387 
Line 399 
                 proc_send(c->peer, MSG_WRITE_CLOSE, -1, &close, sizeof close);                  proc_send(c->peer, MSG_WRITE_CLOSE, -1, &close, sizeof close);
                 file_fire_done(cf);                  file_fire_done(cf);
         }          }
           free(msg);
 }  }

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.3