comparison src/channel.c @ 13746:260256caac38 v8.0.1745

patch 8.0.1745: build failure on MS-Windows commit https://github.com/vim/vim/commit/2060892028e05b1325dc0759259254180669eb5e Author: Bram Moolenaar <Bram@vim.org> Date: Sat Apr 21 22:30:08 2018 +0200 patch 8.0.1745: build failure on MS-Windows Problem: Build failure on MS-Windows. Solution: Build job arguments for MS-Windows. Fix allocating job twice.
author Christian Brabandt <cb@256bit.org>
date Sat, 21 Apr 2018 22:45:07 +0200
parents f309afff6f25
children e5244201fed6
comparison
equal deleted inserted replaced
13745:b8d9c3a2e7f9 13746:260256caac38
5019 5019
5020 vim_free(job->jv_tty_in); 5020 vim_free(job->jv_tty_in);
5021 vim_free(job->jv_tty_out); 5021 vim_free(job->jv_tty_out);
5022 vim_free(job->jv_stoponexit); 5022 vim_free(job->jv_stoponexit);
5023 free_callback(job->jv_exit_cb, job->jv_exit_partial); 5023 free_callback(job->jv_exit_cb, job->jv_exit_partial);
5024 if (job->argv != NULL) 5024 if (job->jv_argv != NULL)
5025 { 5025 {
5026 for (i = 0; job->argv[i] != NULL; i++) 5026 for (i = 0; job->jv_argv[i] != NULL; i++)
5027 vim_free(job->argv[i]); 5027 vim_free(job->jv_argv[i]);
5028 vim_free(job->argv); 5028 vim_free(job->jv_argv);
5029 } 5029 }
5030 } 5030 }
5031 5031
5032 static void 5032 static void
5033 job_free_job(job_T *job) 5033 job_free_job(job_T *job)
5460 job_T * 5460 job_T *
5461 job_start(typval_T *argvars, char **argv_arg, jobopt_T *opt_arg) 5461 job_start(typval_T *argvars, char **argv_arg, jobopt_T *opt_arg)
5462 { 5462 {
5463 job_T *job; 5463 job_T *job;
5464 char_u *cmd = NULL; 5464 char_u *cmd = NULL;
5465 char **argv = NULL;
5466 int argc = 0;
5465 #if defined(UNIX) 5467 #if defined(UNIX)
5466 # define USE_ARGV 5468 # define USE_ARGV
5467 char **argv = NULL;
5468 int argc = 0;
5469 #else 5469 #else
5470 garray_T ga; 5470 garray_T ga;
5471 #endif 5471 #endif
5472 jobopt_T opt; 5472 jobopt_T opt;
5473 ch_part_T part; 5473 ch_part_T part;
5474 int len;
5475 int i; 5474 int i;
5476 5475
5477 job = job_alloc(); 5476 job = job_alloc();
5478 if (job == NULL) 5477 if (job == NULL)
5479 return NULL; 5478 return NULL;
5548 job_set_options(job, &opt); 5547 job_set_options(job, &opt);
5549 5548
5550 #ifdef USE_ARGV 5549 #ifdef USE_ARGV
5551 if (argv_arg != NULL) 5550 if (argv_arg != NULL)
5552 { 5551 {
5553 argv = argv_arg; 5552 /* Make a copy of argv_arg for job->jv_argv. */
5553 for (i = 0; argv_arg[i] != NULL; i++)
5554 argc++;
5555 argv = (char **)alloc(sizeof(char_u *) * (argc + 1));
5556 if (argv == NULL)
5557 goto theend;
5558 for (i = 0; i < argc; i++)
5559 argv[i] = (char *)vim_strsave((char_u *)argv_arg[i]);
5560 argv[argc] = NULL;
5554 } 5561 }
5555 else 5562 else
5556 #endif 5563 #endif
5557 if (argvars[0].v_type == VAR_STRING) 5564 if (argvars[0].v_type == VAR_STRING)
5558 { 5565 {
5561 if (cmd == NULL || *cmd == NUL) 5568 if (cmd == NULL || *cmd == NUL)
5562 { 5569 {
5563 EMSG(_(e_invarg)); 5570 EMSG(_(e_invarg));
5564 goto theend; 5571 goto theend;
5565 } 5572 }
5566 #ifdef USE_ARGV
5567 /* This will modify "cmd". */ 5573 /* This will modify "cmd". */
5568 if (mch_parse_cmd(cmd, FALSE, &argv, &argc) == FAIL) 5574 if (mch_parse_cmd(cmd, FALSE, &argv, &argc) == FAIL)
5569 goto theend; 5575 goto theend;
5576 for (i = 0; i < argc; i++)
5577 argv[i] = (char *)vim_strsave((char_u *)argv[i]);
5570 argv[argc] = NULL; 5578 argv[argc] = NULL;
5571 #endif
5572 } 5579 }
5573 else if (argvars[0].v_type != VAR_LIST 5580 else if (argvars[0].v_type != VAR_LIST
5574 || argvars[0].vval.v_list == NULL 5581 || argvars[0].vval.v_list == NULL
5575 || argvars[0].vval.v_list->lv_len < 1) 5582 || argvars[0].vval.v_list->lv_len < 1)
5576 { 5583 {
5578 goto theend; 5585 goto theend;
5579 } 5586 }
5580 else 5587 else
5581 { 5588 {
5582 list_T *l = argvars[0].vval.v_list; 5589 list_T *l = argvars[0].vval.v_list;
5583 #ifdef USE_ARGV
5584 listitem_T *li; 5590 listitem_T *li;
5585 char_u *s; 5591 char_u *s;
5586 5592
5587 /* Pass argv[] to mch_call_shell(). */ 5593 /* Pass argv[] to mch_call_shell(). */
5588 argv = (char **)alloc(sizeof(char *) * (l->lv_len + 1)); 5594 argv = (char **)alloc(sizeof(char *) * (l->lv_len + 1));
5590 goto theend; 5596 goto theend;
5591 for (li = l->lv_first; li != NULL; li = li->li_next) 5597 for (li = l->lv_first; li != NULL; li = li->li_next)
5592 { 5598 {
5593 s = get_tv_string_chk(&li->li_tv); 5599 s = get_tv_string_chk(&li->li_tv);
5594 if (s == NULL) 5600 if (s == NULL)
5601 {
5602 for (i = 0; i < argc; ++i)
5603 vim_free(argv[i]);
5595 goto theend; 5604 goto theend;
5596 argv[argc++] = (char *)s; 5605 }
5606 argv[argc++] = (char *)vim_strsave(s);
5597 } 5607 }
5598 argv[argc] = NULL; 5608 argv[argc] = NULL;
5599 #else 5609
5610 #ifndef USE_ARGV
5600 if (win32_build_cmd(l, &ga) == FAIL) 5611 if (win32_build_cmd(l, &ga) == FAIL)
5601 goto theend; 5612 goto theend;
5602 cmd = ga.ga_data; 5613 cmd = ga.ga_data;
5603 #endif 5614 #endif
5604 } 5615 }
5605 5616
5606 /* Save the command used to start the job */ 5617 /* Save the command used to start the job. */
5607 len = 0; 5618 job->jv_argv = (char_u **)argv;
5608 for (i = 0; argv[i] != NULL; i++)
5609 len++;
5610 job->argv = (char_u **)alloc(sizeof(char_u *) * (len + 1));
5611 if (job->argv == NULL)
5612 goto theend;
5613 for (i = 0; argv[i] != NULL; i++)
5614 job->argv[i] = vim_strsave((char_u *)argv[i]);
5615 job->argv[i] = NULL;
5616 5619
5617 #ifdef USE_ARGV 5620 #ifdef USE_ARGV
5618 if (ch_log_active()) 5621 if (ch_log_active())
5619 { 5622 {
5620 garray_T ga; 5623 garray_T ga;
5638 /* If the channel is reading from a buffer, write lines now. */ 5641 /* If the channel is reading from a buffer, write lines now. */
5639 if (job->jv_channel != NULL) 5642 if (job->jv_channel != NULL)
5640 channel_write_in(job->jv_channel); 5643 channel_write_in(job->jv_channel);
5641 5644
5642 theend: 5645 theend:
5643 #ifdef USE_ARGV 5646 #ifndef USE_ARGV
5644 if (argv != argv_arg)
5645 vim_free(argv);
5646 #else
5647 vim_free(ga.ga_data); 5647 vim_free(ga.ga_data);
5648 #endif 5648 #endif
5649 if ((char_u **)argv != job->jv_argv)
5650 vim_free(argv);
5649 free_job_options(&opt); 5651 free_job_options(&opt);
5650 return job; 5652 return job;
5651 } 5653 }
5652 5654
5653 /* 5655 /*
5714 5716
5715 l = list_alloc(); 5717 l = list_alloc();
5716 if (l != NULL) 5718 if (l != NULL)
5717 { 5719 {
5718 dict_add_list(dict, "cmd", l); 5720 dict_add_list(dict, "cmd", l);
5719 for (i = 0; job->argv[i] != NULL; i++) 5721 if (job->jv_argv != NULL)
5720 list_append_string(l, job->argv[i], -1); 5722 for (i = 0; job->jv_argv[i] != NULL; i++)
5723 list_append_string(l, job->jv_argv[i], -1);
5721 } 5724 }
5722 } 5725 }
5723 5726
5724 /* 5727 /*
5725 * Implementation of job_info() to return info for all jobs. 5728 * Implementation of job_info() to return info for all jobs.