patch 7.4.1624
Problem: Can't get info about a channel.
Solution: Add ch_info().
diff --git a/src/channel.c b/src/channel.c
index 15c7c74..be0dc19 100644
--- a/src/channel.c
+++ b/src/channel.c
@@ -838,6 +838,8 @@
channel->CH_SOCK_FD = (sock_T)sd;
channel->ch_nb_close_cb = nb_close_cb;
+ channel->ch_hostname = (char *)vim_strsave((char_u *)hostname);
+ channel->ch_port = port_in;
#ifdef FEAT_GUI
channel_gui_register_one(channel, PART_SOCK);
@@ -1138,6 +1140,10 @@
ch_logs(channel, "writing err to buffer '%s'",
(char *)channel->ch_part[PART_ERR].ch_buffer->b_ffname);
}
+
+ channel->ch_part[PART_OUT].ch_io = opt->jo_io[PART_OUT];
+ channel->ch_part[PART_ERR].ch_io = opt->jo_io[PART_ERR];
+ channel->ch_part[PART_IN].ch_io = opt->jo_io[PART_IN];
}
/*
@@ -2088,6 +2094,69 @@
return "closed";
}
+ static void
+channel_part_info(channel_T *channel, dict_T *dict, char *name, int part)
+{
+ chanpart_T *chanpart = &channel->ch_part[part];
+ char namebuf[20];
+ int tail;
+ char *s;
+
+ STRCPY(namebuf, name);
+ STRCAT(namebuf, "_");
+ tail = STRLEN(namebuf);
+
+ STRCPY(namebuf + tail, "status");
+ dict_add_nr_str(dict, namebuf, 0,
+ (char_u *)(chanpart->ch_fd == INVALID_FD ? "closed" : "open"));
+
+ STRCPY(namebuf + tail, "mode");
+ switch (chanpart->ch_mode)
+ {
+ case MODE_NL: s = "NL"; break;
+ case MODE_RAW: s = "RAW"; break;
+ case MODE_JSON: s = "JSON"; break;
+ case MODE_JS: s = "JS"; break;
+ }
+ dict_add_nr_str(dict, namebuf, 0, (char_u *)s);
+
+ STRCPY(namebuf + tail, "io");
+ if (part == PART_SOCK)
+ s = "socket";
+ else switch (chanpart->ch_io)
+ {
+ case JIO_NULL: s = "null"; break;
+ case JIO_PIPE: s = "pipe"; break;
+ case JIO_FILE: s = "file"; break;
+ case JIO_BUFFER: s = "buffer"; break;
+ case JIO_OUT: s = "out"; break;
+ }
+ dict_add_nr_str(dict, namebuf, 0, (char_u *)s);
+
+ STRCPY(namebuf + tail, "timeout");
+ dict_add_nr_str(dict, namebuf, chanpart->ch_timeout, NULL);
+}
+
+ void
+channel_info(channel_T *channel, dict_T *dict)
+{
+ dict_add_nr_str(dict, "id", channel->ch_id, NULL);
+ dict_add_nr_str(dict, "status", 0, (char_u *)channel_status(channel));
+
+ if (channel->ch_hostname != NULL)
+ {
+ dict_add_nr_str(dict, "hostname", 0, (char_u *)channel->ch_hostname);
+ dict_add_nr_str(dict, "port", channel->ch_port, NULL);
+ channel_part_info(channel, dict, "sock", PART_SOCK);
+ }
+ else
+ {
+ channel_part_info(channel, dict, "out", PART_OUT);
+ channel_part_info(channel, dict, "err", PART_ERR);
+ channel_part_info(channel, dict, "in", PART_IN);
+ }
+}
+
/*
* Close channel "channel".
* Trigger the close callback if "invoke_close_cb" is TRUE.
@@ -2195,6 +2264,8 @@
channel_clear(channel_T *channel)
{
ch_log(channel, "Clearing channel");
+ vim_free(channel->ch_hostname);
+ channel->ch_hostname = NULL;
channel_clear_one(channel, PART_SOCK);
channel_clear_one(channel, PART_OUT);
channel_clear_one(channel, PART_ERR);
diff --git a/src/eval.c b/src/eval.c
index 22ddafa..b233833 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -501,6 +501,7 @@
static void f_ch_evalraw(typval_T *argvars, typval_T *rettv);
static void f_ch_getbufnr(typval_T *argvars, typval_T *rettv);
static void f_ch_getjob(typval_T *argvars, typval_T *rettv);
+static void f_ch_info(typval_T *argvars, typval_T *rettv);
static void f_ch_log(typval_T *argvars, typval_T *rettv);
static void f_ch_logfile(typval_T *argvars, typval_T *rettv);
static void f_ch_open(typval_T *argvars, typval_T *rettv);
@@ -8141,6 +8142,7 @@
{"ch_evalraw", 2, 3, f_ch_evalraw},
{"ch_getbufnr", 2, 2, f_ch_getbufnr},
{"ch_getjob", 1, 1, f_ch_getjob},
+ {"ch_info", 1, 1, f_ch_info},
{"ch_log", 1, 2, f_ch_log},
{"ch_logfile", 1, 2, f_ch_logfile},
{"ch_open", 1, 2, f_ch_open},
@@ -10029,6 +10031,18 @@
}
/*
+ * "ch_info()" function
+ */
+ static void
+f_ch_info(typval_T *argvars, typval_T *rettv UNUSED)
+{
+ channel_T *channel = get_channel_arg(&argvars[0], TRUE);
+
+ if (channel != NULL && rettv_dict_alloc(rettv) != FAIL)
+ channel_info(channel, rettv->vval.v_dict);
+}
+
+/*
* "ch_log()" function
*/
static void
diff --git a/src/proto/channel.pro b/src/proto/channel.pro
index b98fb58..e334908 100644
--- a/src/proto/channel.pro
+++ b/src/proto/channel.pro
@@ -20,6 +20,7 @@
int channel_can_write_to(channel_T *channel);
int channel_is_open(channel_T *channel);
char *channel_status(channel_T *channel);
+void channel_info(channel_T *channel, dict_T *dict);
void channel_close(channel_T *channel, int invoke_close_cb);
char_u *channel_peek(channel_T *channel, int part);
void channel_clear(channel_T *channel);
diff --git a/src/testdir/test_channel.vim b/src/testdir/test_channel.vim
index c4e23c9..0fd7de9 100644
--- a/src/testdir/test_channel.vim
+++ b/src/testdir/test_channel.vim
@@ -120,9 +120,16 @@
return
endif
if has('job')
- " check that no job is handled correctly
+ " check that getjob without a job is handled correctly
call assert_equal('no process', string(ch_getjob(handle)))
endif
+ let dict = ch_info(handle)
+ call assert_true(dict.id != 0)
+ call assert_equal('open', dict.status)
+ call assert_equal(a:port, string(dict.port))
+ call assert_equal('open', dict.sock_status)
+ call assert_equal('socket', dict.sock_io)
+
" Simple string request and reply.
call assert_equal('got it', ch_evalexpr(handle, 'hello!'))
diff --git a/src/version.c b/src/version.c
index d727703..d465d81 100644
--- a/src/version.c
+++ b/src/version.c
@@ -749,6 +749,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1624,
+/**/
1623,
/**/
1622,