diff options
author | Björn Linse <bjorn.linse@gmail.com> | 2017-05-29 20:33:00 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-05-29 20:33:00 +0200 |
commit | 1b7a9bf4d2028e75a140e3b314901e58684f2b1a (patch) | |
tree | 2860c9db4994bc363a8a1ee036dd9dc2ad73b83b /src/nvim/eval.c | |
parent | 9cc185dc6d9d665fe5ba3702a0a8af09151fe5c4 (diff) | |
parent | 5a151555c8dce70bbf235e7f6d5bd1ced5e7c46c (diff) | |
download | rneovim-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.c | 48 |
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; |