[BACK]Return to cmd-load-buffer.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / tmux

Diff for /src/usr.bin/tmux/cmd-load-buffer.c between version 1.12 and 1.13

version 1.12, 2010/06/28 22:10:42 version 1.13, 2010/07/24 20:11:59
Line 31 
Line 31 
  */   */
   
 int     cmd_load_buffer_exec(struct cmd *, struct cmd_ctx *);  int     cmd_load_buffer_exec(struct cmd *, struct cmd_ctx *);
   void    cmd_load_buffer_callback(struct client *, void *);
   
 const struct cmd_entry cmd_load_buffer_entry = {  const struct cmd_entry cmd_load_buffer_entry = {
         "load-buffer", "loadb",          "load-buffer", "loadb",
Line 43 
Line 44 
         cmd_buffer_print          cmd_buffer_print
 };  };
   
   struct cmd_load_buffer_cdata {
           struct session  *session;
           int              buffer;
   };
   
 int  int
 cmd_load_buffer_exec(struct cmd *self, struct cmd_ctx *ctx)  cmd_load_buffer_exec(struct cmd *self, struct cmd_ctx *ctx)
 {  {
         struct cmd_buffer_data  *data = self->data;          struct cmd_buffer_data          *data = self->data;
         struct session          *s;          struct cmd_load_buffer_cdata    *cdata;
         FILE                    *f, *close_f;          struct session                  *s;
         char                    *pdata, *new_pdata;          struct client                   *c = ctx->cmdclient;
         size_t                   psize;          FILE                            *f;
         u_int                    limit;          char                            *pdata, *new_pdata;
         int                      ch;          size_t                           psize;
           u_int                            limit;
           int                              ch;
   
         if ((s = cmd_find_session(ctx, data->target)) == NULL)          if ((s = cmd_find_session(ctx, data->target)) == NULL)
                 return (-1);                  return (-1);
   
         if (strcmp(data->arg, "-") == 0 ) {          if (strcmp(data->arg, "-") == 0) {
                 if (ctx->cmdclient == NULL) {                  if (c == NULL) {
                         ctx->error(ctx, "%s: can't read from stdin", data->arg);                          ctx->error(ctx, "%s: can't read from stdin", data->arg);
                         return (-1);                          return (-1);
                 }                  }
                 f = ctx->cmdclient->stdin_file;                  if (c->flags & CLIENT_TERMINAL) {
                 if (isatty(fileno(ctx->cmdclient->stdin_file))) {  
                         ctx->error(ctx, "%s: stdin is a tty", data->arg);                          ctx->error(ctx, "%s: stdin is a tty", data->arg);
                         return (-1);                          return (-1);
                 }                  }
                 close_f = NULL;                  if (c->stdin_fd == -1) {
         } else {                          ctx->error(ctx, "%s: can't read from stdin", data->arg);
                 if ((f = fopen(data->arg, "rb")) == NULL) {  
                         ctx->error(ctx, "%s: %s", data->arg, strerror(errno));  
                         return (-1);                          return (-1);
                 }                  }
                 close_f = f;  
                   cdata = xmalloc(sizeof *cdata);
                   cdata->session = s;
                   cdata->buffer = data->buffer;
                   c->stdin_data = cdata;
                   c->stdin_callback = cmd_load_buffer_callback;
   
                   c->references++;
                   bufferevent_enable(c->stdin_event, EV_READ);
                   return (1);
         }          }
   
           if ((f = fopen(data->arg, "rb")) == NULL) {
                   ctx->error(ctx, "%s: %s", data->arg, strerror(errno));
                   return (-1);
           }
   
         pdata = NULL;          pdata = NULL;
         psize = 0;          psize = 0;
         while ((ch = getc(f)) != EOF) {          while ((ch = getc(f)) != EOF) {
Line 94 
Line 113 
         if (pdata != NULL)          if (pdata != NULL)
                 pdata[psize] = '\0';                  pdata[psize] = '\0';
   
         if (close_f != NULL)          fclose(f);
                 fclose(close_f);          f = NULL;
   
         limit = options_get_number(&s->options, "buffer-limit");          limit = options_get_number(&s->options, "buffer-limit");
         if (data->buffer == -1) {          if (data->buffer == -1) {
Line 104 
Line 123 
         }          }
         if (paste_replace(&s->buffers, data->buffer, pdata, psize) != 0) {          if (paste_replace(&s->buffers, data->buffer, pdata, psize) != 0) {
                 ctx->error(ctx, "no buffer %d", data->buffer);                  ctx->error(ctx, "no buffer %d", data->buffer);
                 goto error;                  return (-1);
         }          }
   
         return (0);          return (0);
Line 112 
Line 131 
 error:  error:
         if (pdata != NULL)          if (pdata != NULL)
                 xfree(pdata);                  xfree(pdata);
         if (close_f != NULL)          if (f != NULL)
                 fclose(close_f);                  fclose(f);
         return (-1);          return (-1);
   }
   
   void
   cmd_load_buffer_callback(struct client *c, void *data)
   {
           struct cmd_load_buffer_cdata    *cdata = data;
           struct session                  *s = cdata->session;
           char                            *pdata;
           size_t                           psize;
           u_int                            limit;
           int                              idx;
   
           /*
            * Event callback has already checked client is not dead and reduced
            * its reference count. But tell it to exit.
            */
           c->flags |= CLIENT_EXIT;
   
           /* Does the target session still exist? */
           if (session_index(s, &idx) != 0)
                   goto out;
   
           psize = EVBUFFER_LENGTH(c->stdin_event->input);
           if (psize == 0)
                   goto out;
   
           pdata = malloc(psize + 1);
           if (pdata == NULL)
                   goto out;
           bufferevent_read(c->stdin_event, pdata, psize);
           pdata[psize] = '\0';
   
           limit = options_get_number(&s->options, "buffer-limit");
           if (cdata->buffer == -1) {
                   paste_add(&s->buffers, pdata, psize, limit);
                   goto out;
           }
           if (paste_replace(&s->buffers, cdata->buffer, pdata, psize) != 0) {
                   /* No context so can't use server_client_msg_error. */
                   evbuffer_add_printf(
                       c->stderr_event->output, "no buffer %d\n", cdata->buffer);
                   bufferevent_enable(c->stderr_event, EV_WRITE);
                   goto out;
           }
   
   out:
           xfree(cdata);
 }  }

Legend:
Removed from v.1.12  
changed lines
  Added in v.1.13