char *rest;
int port;
jobopt_T opt;
- channel_T *channel;
+ channel_T *channel = NULL;
address = get_tv_string(&argvars[0]);
if (argvars[1].v_type != VAR_UNKNOWN
opt.jo_timeout = 2000;
if (get_job_options(&argvars[1], &opt,
JO_MODE_ALL + JO_CB_ALL + JO_WAITTIME + JO_TIMEOUT_ALL) == FAIL)
- return NULL;
+ goto theend;
if (opt.jo_timeout < 0)
{
EMSG(_(e_invarg));
- return NULL;
+ goto theend;
}
channel = channel_open((char *)address, port, opt.jo_waittime, NULL);
opt.jo_set = JO_ALL;
channel_set_options(channel, &opt);
}
+theend:
+ free_job_options(&opt);
return channel;
}
clear_job_options(&opt);
if (get_job_options(&argvars[1], &opt, JO_TIMEOUT + JO_PART + JO_ID)
== FAIL)
- return;
+ goto theend;
channel = get_channel_arg(&argvars[0], TRUE);
if (channel != NULL)
}
}
}
+
+theend:
+ free_job_options(&opt);
}
# if defined(WIN32) || defined(FEAT_GUI_X11) || defined(FEAT_GUI_GTK) \
channel_T *channel;
int part_send;
+ clear_job_options(opt);
channel = get_channel_arg(&argvars[0], TRUE);
if (channel == NULL)
return NULL;
part_send = channel_part_send(channel);
*part_read = channel_part_read(channel);
- clear_job_options(opt);
if (get_job_options(&argvars[2], opt, JO_CALLBACK + JO_TIMEOUT) == FAIL)
return NULL;
free_tv(listtv);
}
}
+ free_job_options(&opt);
}
/*
timeout = channel_get_timeout(channel, part_read);
rettv->vval.v_string = channel_read_block(channel, part_read, timeout);
}
+ free_job_options(&opt);
}
# if (defined(UNIX) && !defined(HAVE_SELECT)) || defined(PROTO)
return OK;
}
+/*
+ * Clear a jobopt_T before using it.
+ */
void
clear_job_options(jobopt_T *opt)
{
vim_memset(opt, 0, sizeof(jobopt_T));
}
+/*
+ * Free any members of a jobopt_T.
+ */
+ void
+free_job_options(jobopt_T *opt)
+{
+ if (opt->jo_partial != NULL)
+ partial_unref(opt->jo_partial);
+ if (opt->jo_out_partial != NULL)
+ partial_unref(opt->jo_out_partial);
+ if (opt->jo_err_partial != NULL)
+ partial_unref(opt->jo_err_partial);
+ if (opt->jo_close_partial != NULL)
+ partial_unref(opt->jo_close_partial);
+}
+
/*
* Get the PART_ number from the first character of an option name.
*/
return NULL;
job->jv_status = JOB_FAILED;
+#ifndef USE_ARGV
+ ga_init2(&ga, (int)sizeof(char*), 20);
+#endif
/* Default mode is NL. */
clear_job_options(&opt);
if (get_job_options(&argvars[1], &opt,
JO_MODE_ALL + JO_CB_ALL + JO_TIMEOUT_ALL + JO_STOPONEXIT
+ JO_EXIT_CB + JO_OUT_IO + JO_BLOCK_WRITE) == FAIL)
- return job;
+ goto theend;
/* Check that when io is "file" that there is a file name. */
for (part = PART_OUT; part <= PART_IN; ++part)
|| *opt.jo_io_name[part] == NUL))
{
EMSG(_("E920: _io file requires _name to be set"));
- return job;
+ goto theend;
}
if ((opt.jo_set & JO_IN_IO) && opt.jo_io[PART_IN] == JIO_BUFFER)
else
buf = buflist_find_by_name(opt.jo_io_name[PART_IN], FALSE);
if (buf == NULL)
- return job;
+ goto theend;
if (buf->b_ml.ml_mfp == NULL)
{
char_u numbuf[NUMBUFLEN];
else
s = opt.jo_io_name[PART_IN];
EMSG2(_("E918: buffer must be loaded: %s"), s);
- return job;
+ goto theend;
}
job->jv_in_buf = buf;
}
job_set_options(job, &opt);
-#ifndef USE_ARGV
- ga_init2(&ga, (int)sizeof(char*), 20);
-#endif
-
if (argvars[0].v_type == VAR_STRING)
{
/* Command is a string. */
if (cmd == NULL || *cmd == NUL)
{
EMSG(_(e_invarg));
- return job;
+ goto theend;
}
#ifdef USE_ARGV
if (mch_parse_cmd(cmd, FALSE, &argv, &argc) == FAIL)
- return job;
+ goto theend;
argv[argc] = NULL;
#endif
}
|| argvars[0].vval.v_list->lv_len < 1)
{
EMSG(_(e_invarg));
- return job;
+ goto theend;
}
else
{
/* Pass argv[] to mch_call_shell(). */
argv = (char **)alloc(sizeof(char *) * (l->lv_len + 1));
if (argv == NULL)
- return job;
+ goto theend;
#endif
for (li = l->lv_first; li != NULL; li = li->li_next)
{
#else
vim_free(ga.ga_data);
#endif
+ free_job_options(&opt);
return job;
}
return;
clear_job_options(&opt);
if (get_job_options(&argvars[1], &opt,
- JO_CB_ALL + JO_TIMEOUT_ALL + JO_MODE_ALL) == FAIL)
- return;
- channel_set_options(channel, &opt);
+ JO_CB_ALL + JO_TIMEOUT_ALL + JO_MODE_ALL) == OK)
+ channel_set_options(channel, &opt);
+ free_job_options(&opt);
}
/*
if (job == NULL)
return;
clear_job_options(&opt);
- if (get_job_options(&argvars[1], &opt, JO_STOPONEXIT + JO_EXIT_CB) == FAIL)
- return;
- job_set_options(job, &opt);
+ if (get_job_options(&argvars[1], &opt, JO_STOPONEXIT + JO_EXIT_CB) == OK)
+ job_set_options(job, &opt);
+ free_job_options(&opt);
}
/*