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

Diff for /src/usr.bin/tmux/cmd-run-shell.c between version 1.59 and 1.60

version 1.59, 2019/06/18 11:08:42 version 1.60, 2020/03/12 13:25:45
Line 31 
Line 31 
   
 static enum cmd_retval  cmd_run_shell_exec(struct cmd *, struct cmdq_item *);  static enum cmd_retval  cmd_run_shell_exec(struct cmd *, struct cmdq_item *);
   
   static void     cmd_run_shell_timer(int, short, void *);
 static void     cmd_run_shell_callback(struct job *);  static void     cmd_run_shell_callback(struct job *);
 static void     cmd_run_shell_free(void *);  static void     cmd_run_shell_free(void *);
 static void     cmd_run_shell_print(struct job *, const char *);  static void     cmd_run_shell_print(struct job *, const char *);
Line 39 
Line 40 
         .name = "run-shell",          .name = "run-shell",
         .alias = "run",          .alias = "run",
   
         .args = { "bt:", 1, 1 },          .args = { "bd:t:", 0, 1 },
         .usage = "[-b] " CMD_TARGET_PANE_USAGE " shell-command",          .usage = "[-b] [-d delay] " CMD_TARGET_PANE_USAGE " [shell-command]",
   
         .target = { 't', CMD_FIND_PANE, CMD_FIND_CANFAIL },          .target = { 't', CMD_FIND_PANE, CMD_FIND_CANFAIL },
   
Line 50 
Line 51 
   
 struct cmd_run_shell_data {  struct cmd_run_shell_data {
         char                    *cmd;          char                    *cmd;
           char                    *cwd;
         struct cmdq_item        *item;          struct cmdq_item        *item;
           struct session          *s;
         int                      wp_id;          int                      wp_id;
           struct event             timer;
 };  };
   
 static void  static void
Line 91 
Line 95 
         struct session                  *s = item->target.s;          struct session                  *s = item->target.s;
         struct winlink                  *wl = item->target.wl;          struct winlink                  *wl = item->target.wl;
         struct window_pane              *wp = item->target.wp;          struct window_pane              *wp = item->target.wp;
           const char                      *delay;
           double                           d;
           struct timeval                   tv;
           char                            *end;
   
         cdata = xcalloc(1, sizeof *cdata);          cdata = xcalloc(1, sizeof *cdata);
         cdata->cmd = format_single(item, args->argv[0], c, s, wl, wp);          if (args->argc != 0)
                   cdata->cmd = format_single(item, args->argv[0], c, s, wl, wp);
   
         if (args_has(args, 't') && wp != NULL)          if (args_has(args, 't') && wp != NULL)
                 cdata->wp_id = wp->id;                  cdata->wp_id = wp->id;
Line 103 
Line 112 
         if (!args_has(args, 'b'))          if (!args_has(args, 'b'))
                 cdata->item = item;                  cdata->item = item;
   
         if (job_run(cdata->cmd, s, server_client_get_cwd(item->client, s), NULL,          cdata->cwd = xstrdup(server_client_get_cwd(item->client, s));
             cmd_run_shell_callback, cmd_run_shell_free, cdata, 0) == NULL) {          cdata->s = s;
                 cmdq_error(item, "failed to run command: %s", cdata->cmd);          session_add_ref(s, __func__);
                 free(cdata);  
                 return (CMD_RETURN_ERROR);  
         }  
   
           evtimer_set(&cdata->timer, cmd_run_shell_timer, cdata);
   
           if ((delay = args_get(args, 'd')) != NULL) {
                   d = strtod(delay, &end);
                   if (*end != '\0') {
                           cmdq_error(item, "invalid delay time: %s", delay);
                           cmd_run_shell_free(cdata);
                           return (CMD_RETURN_ERROR);
                   }
                   timerclear(&tv);
                   tv.tv_sec = (time_t)d;
                   tv.tv_usec = (d - (double)tv.tv_sec) * 1000000U;
                   evtimer_add(&cdata->timer, &tv);
           } else
                   cmd_run_shell_timer(-1, 0, cdata);
   
         if (args_has(args, 'b'))          if (args_has(args, 'b'))
                 return (CMD_RETURN_NORMAL);                  return (CMD_RETURN_NORMAL);
         return (CMD_RETURN_WAIT);          return (CMD_RETURN_WAIT);
 }  }
   
 static void  static void
   cmd_run_shell_timer(__unused int fd, __unused short events, void* arg)
   {
           struct cmd_run_shell_data       *cdata = arg;
   
           if (cdata->cmd != NULL) {
                   if (job_run(cdata->cmd, cdata->s, cdata->cwd, NULL,
                       cmd_run_shell_callback, cmd_run_shell_free, cdata,
                       0) == NULL)
                           cmd_run_shell_free(cdata);
           } else {
                   if (cdata->item != NULL)
                           cmdq_continue(cdata->item);
                   cmd_run_shell_free(cdata);
           }
   }
   
   static void
 cmd_run_shell_callback(struct job *job)  cmd_run_shell_callback(struct job *job)
 {  {
         struct cmd_run_shell_data       *cdata = job_get_data(job);          struct cmd_run_shell_data       *cdata = job_get_data(job);
Line 163 
Line 202 
 {  {
         struct cmd_run_shell_data       *cdata = data;          struct cmd_run_shell_data       *cdata = data;
   
           evtimer_del(&cdata->timer);
           session_remove_ref(cdata->s, __func__);
           free(cdata->cwd);
         free(cdata->cmd);          free(cdata->cmd);
         free(cdata);          free(cdata);
 }  }

Legend:
Removed from v.1.59  
changed lines
  Added in v.1.60