aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/eval.c
diff options
context:
space:
mode:
authorBjörn Linse <bjorn.linse@gmail.com>2017-05-29 20:33:00 +0200
committerGitHub <noreply@github.com>2017-05-29 20:33:00 +0200
commit1b7a9bf4d2028e75a140e3b314901e58684f2b1a (patch)
tree2860c9db4994bc363a8a1ee036dd9dc2ad73b83b /src/nvim/eval.c
parent9cc185dc6d9d665fe5ba3702a0a8af09151fe5c4 (diff)
parent5a151555c8dce70bbf235e7f6d5bd1ced5e7c46c (diff)
downloadrneovim-1b7a9bf4d2028e75a140e3b314901e58684f2b1a.tar.gz
rneovim-1b7a9bf4d2028e75a140e3b314901e58684f2b1a.tar.bz2
rneovim-1b7a9bf4d2028e75a140e3b314901e58684f2b1a.zip
Merge pull request #6594 from bfredl/sockopen
connect to socket (RPC only for the moment)
Diffstat (limited to 'src/nvim/eval.c')
-rw-r--r--src/nvim/eval.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index 7bfd638e86..4e303414a3 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -15058,6 +15058,54 @@ static void f_simplify(typval_T *argvars, typval_T *rettv, FunPtr fptr)
rettv->v_type = VAR_STRING;
}
+/// "sockconnect()" function
+static void f_sockconnect(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+{
+ if (argvars[0].v_type != VAR_STRING || argvars[1].v_type != VAR_STRING) {
+ EMSG(_(e_invarg));
+ return;
+ }
+ if (argvars[2].v_type != VAR_DICT && argvars[2].v_type != VAR_UNKNOWN) {
+ // Wrong argument types
+ EMSG2(_(e_invarg2), "expected dictionary");
+ return;
+ }
+
+ const char *mode = tv_get_string(&argvars[0]);
+ const char *address = tv_get_string(&argvars[1]);
+
+ bool tcp;
+ if (strcmp(mode, "tcp") == 0) {
+ tcp = true;
+ } else if (strcmp(mode, "pipe") == 0) {
+ tcp = false;
+ } else {
+ EMSG2(_(e_invarg2), "invalid mode");
+ return;
+ }
+
+ bool rpc = false;
+ if (argvars[2].v_type == VAR_DICT) {
+ dict_T *opts = argvars[2].vval.v_dict;
+ rpc = tv_dict_get_number(opts, "rpc") != 0;
+ }
+
+ if (!rpc) {
+ EMSG2(_(e_invarg2), "rpc option must be true");
+ return;
+ }
+
+ const char *error = NULL;
+ uint64_t id = channel_connect(tcp, address, 50, &error);
+
+ if (error) {
+ EMSG2(_("connection failed: %s"), error);
+ }
+
+ rettv->vval.v_number = (varnumber_T)id;
+ rettv->v_type = VAR_NUMBER;
+}
+
/// struct used in the array that's given to qsort()
typedef struct {
listitem_T *item;