Mercurial > vim
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. |