annotate src/channel.c @ 11690:ce434212d682 v8.0.0728

patch 8.0.0728: the terminal structure is never freed commit https://github.com/vim/vim/commit/96ca27a0ee8ae738cab9fb386984c75c6821e31a Author: Bram Moolenaar <Bram@vim.org> Date: Mon Jul 17 23:20:24 2017 +0200 patch 8.0.0728: the terminal structure is never freed Problem: The terminal structure is never freed. Solution: Free the structure and unreference what it contains.
author Christian Brabandt <cb@256bit.org>
date Mon, 17 Jul 2017 23:30:03 +0200
parents 3c6cc2f24645
children 13ecb3e64399
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10042
4aead6a9b7a9 commit https://github.com/vim/vim/commit/edf3f97ae2af024708ebb4ac614227327033ca47
Christian Brabandt <cb@256bit.org>
parents: 10030
diff changeset
1 /* vi:set ts=8 sts=4 sw=4 noet:
7743
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
2 *
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3 * VIM - Vi IMproved by Bram Moolenaar
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
4 *
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
5 * Do ":help uganda" in Vim to read copying and usage conditions.
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
6 * Do ":help credits" in Vim to see a list of people who contributed.
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
7 */
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
8
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
9 /*
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
10 * Implements communication through a socket or any file handle.
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
11 */
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
12
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
13 #include "vim.h"
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
14
8493
caed4b2d305f commit https://github.com/vim/vim/commit/509ce2a558e7e0c03242e32e844255af52f1c821
Christian Brabandt <cb@256bit.org>
parents: 8491
diff changeset
15 #if defined(FEAT_JOB_CHANNEL) || defined(PROTO)
7743
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
16
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
17 /* TRUE when netbeans is running with a GUI. */
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
18 #ifdef FEAT_GUI
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
19 # define CH_HAS_GUI (gui.in_use || gui.starting)
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
20 #endif
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
21
10375
2055d3722c5b commit https://github.com/vim/vim/commit/3f7d0907269558cb3ea184a3083640f9e20bb21e
Christian Brabandt <cb@256bit.org>
parents: 10363
diff changeset
22 /* Note: when making changes here also adjust configure.ac. */
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
23 #ifdef WIN32
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
24 /* WinSock API is separated from C API, thus we can't use read(), write(),
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
25 * errno... */
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
26 # define SOCK_ERRNO errno = WSAGetLastError()
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
27 # undef ECONNREFUSED
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
28 # define ECONNREFUSED WSAECONNREFUSED
7935
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
29 # undef EWOULDBLOCK
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
30 # define EWOULDBLOCK WSAEWOULDBLOCK
8330
ec940c11f749 commit https://github.com/vim/vim/commit/d42119fff228434fe57e88d501c744de0a9fb1b1
Christian Brabandt <cb@256bit.org>
parents: 8320
diff changeset
31 # undef EINPROGRESS
ec940c11f749 commit https://github.com/vim/vim/commit/d42119fff228434fe57e88d501c744de0a9fb1b1
Christian Brabandt <cb@256bit.org>
parents: 8320
diff changeset
32 # define EINPROGRESS WSAEINPROGRESS
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
33 # ifdef EINTR
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
34 # undef EINTR
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
35 # endif
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
36 # define EINTR WSAEINTR
8059
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
37 # define sock_write(sd, buf, len) send((SOCKET)sd, buf, len, 0)
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
38 # define sock_read(sd, buf, len) recv((SOCKET)sd, buf, len, 0)
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
39 # define sock_close(sd) closesocket((SOCKET)sd)
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
40 #else
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
41 # include <netdb.h>
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
42 # include <netinet/in.h>
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
43
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
44 # include <sys/socket.h>
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
45 # ifdef HAVE_LIBGEN_H
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
46 # include <libgen.h>
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
47 # endif
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
48 # define SOCK_ERRNO
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
49 # define sock_write(sd, buf, len) write(sd, buf, len)
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
50 # define sock_read(sd, buf, len) read(sd, buf, len)
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
51 # define sock_close(sd) close(sd)
8072
38887bf423ba commit https://github.com/vim/vim/commit/0943a09db84b036ec550d7f2e5b832f621b400ca
Christian Brabandt <cb@256bit.org>
parents: 8070
diff changeset
52 # define fd_read(fd, buf, len) read(fd, buf, len)
8059
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
53 # define fd_write(sd, buf, len) write(sd, buf, len)
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
54 # define fd_close(sd) close(sd)
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
55 #endif
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
56
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
57 static void channel_read(channel_T *channel, ch_part_T part, char *func);
9003
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
58
8267
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
59 /* Whether a redraw is needed for appending a line to a buffer. */
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
60 static int channel_need_redraw = FALSE;
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
61
9085
d362e6df1deb commit https://github.com/vim/vim/commit/fb6ffc732e65dbc459c89247ff78134402f1a18b
Christian Brabandt <cb@256bit.org>
parents: 9083
diff changeset
62 /* Whether we are inside channel_parse_messages() or another situation where it
d362e6df1deb commit https://github.com/vim/vim/commit/fb6ffc732e65dbc459c89247ff78134402f1a18b
Christian Brabandt <cb@256bit.org>
parents: 9083
diff changeset
63 * is safe to invoke callbacks. */
d362e6df1deb commit https://github.com/vim/vim/commit/fb6ffc732e65dbc459c89247ff78134402f1a18b
Christian Brabandt <cb@256bit.org>
parents: 9083
diff changeset
64 static int safe_to_invoke_callback = 0;
8267
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
65
9089
6bc0a492e8ba commit https://github.com/vim/vim/commit/de7eb0a47b557eb4656c6b63d421c7e7bae1ef30
Christian Brabandt <cb@256bit.org>
parents: 9087
diff changeset
66 static char *part_names[] = {"sock", "out", "err", "in"};
6bc0a492e8ba commit https://github.com/vim/vim/commit/de7eb0a47b557eb4656c6b63d421c7e7bae1ef30
Christian Brabandt <cb@256bit.org>
parents: 9087
diff changeset
67
8059
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
68 #ifdef WIN32
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
69 static int
8080
b6cb94ad97a4 commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents: 8074
diff changeset
70 fd_read(sock_T fd, char *buf, size_t len)
8059
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
71 {
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
72 HANDLE h = (HANDLE)fd;
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
73 DWORD nread;
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
74
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
75 if (!ReadFile(h, buf, (DWORD)len, &nread, NULL))
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
76 return -1;
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
77 return (int)nread;
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
78 }
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
79
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
80 static int
8080
b6cb94ad97a4 commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents: 8074
diff changeset
81 fd_write(sock_T fd, char *buf, size_t len)
8059
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
82 {
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
83 HANDLE h = (HANDLE)fd;
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
84 DWORD nwrite;
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
85
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
86 if (!WriteFile(h, buf, (DWORD)len, &nwrite, NULL))
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
87 return -1;
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
88 return (int)nwrite;
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
89 }
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
90
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
91 static void
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
92 fd_close(sock_T fd)
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
93 {
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
94 HANDLE h = (HANDLE)fd;
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
95
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
96 CloseHandle(h);
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
97 }
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
98 #endif
7743
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
99
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
100 /* Log file opened with ch_logfile(). */
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
101 static FILE *log_fd = NULL;
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
102 #ifdef FEAT_RELTIME
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
103 static proftime_T log_start;
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
104 #endif
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
105
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
106 void
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
107 ch_logfile(char_u *fname, char_u *opt)
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
108 {
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
109 FILE *file = NULL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
110
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
111 if (log_fd != NULL)
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
112 fclose(log_fd);
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
113
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
114 if (*fname != NUL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
115 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
116 file = fopen((char *)fname, *opt == 'w' ? "w" : "a");
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
117 if (file == NULL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
118 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
119 EMSG2(_(e_notopen), fname);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
120 return;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
121 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
122 }
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
123 log_fd = file;
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
124
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
125 if (log_fd != NULL)
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
126 {
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
127 fprintf(log_fd, "==== start log session ====\n");
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
128 #ifdef FEAT_RELTIME
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
129 profile_start(&log_start);
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
130 #endif
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
131 }
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
132 }
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
133
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
134 int
9282
9f97a6290c63 commit https://github.com/vim/vim/commit/cf089463492fab53b2a5d81517829d22f882f82e
Christian Brabandt <cb@256bit.org>
parents: 9246
diff changeset
135 ch_log_active(void)
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
136 {
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
137 return log_fd != NULL;
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
138 }
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
139
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
140 static void
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
141 ch_log_lead(char *what, channel_T *ch)
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
142 {
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
143 if (log_fd != NULL)
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
144 {
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
145 #ifdef FEAT_RELTIME
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
146 proftime_T log_now;
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
147
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
148 profile_start(&log_now);
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
149 profile_sub(&log_now, &log_start);
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
150 fprintf(log_fd, "%s ", profile_msg(&log_now));
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
151 #endif
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
152 if (ch != NULL)
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
153 fprintf(log_fd, "%son %d: ", what, ch->ch_id);
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
154 else
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
155 fprintf(log_fd, "%s: ", what);
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
156 }
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
157 }
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
158
8428
4e22d0e7bfb1 commit https://github.com/vim/vim/commit/d0b6502a7ace39d6cd30874110a572371d10beae
Christian Brabandt <cb@256bit.org>
parents: 8422
diff changeset
159 static int did_log_msg = TRUE;
4e22d0e7bfb1 commit https://github.com/vim/vim/commit/d0b6502a7ace39d6cd30874110a572371d10beae
Christian Brabandt <cb@256bit.org>
parents: 8422
diff changeset
160
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
161 void
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
162 ch_log(channel_T *ch, char *msg)
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
163 {
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
164 if (log_fd != NULL)
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
165 {
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
166 ch_log_lead("", ch);
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
167 fputs(msg, log_fd);
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
168 fputc('\n', log_fd);
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
169 fflush(log_fd);
8428
4e22d0e7bfb1 commit https://github.com/vim/vim/commit/d0b6502a7ace39d6cd30874110a572371d10beae
Christian Brabandt <cb@256bit.org>
parents: 8422
diff changeset
170 did_log_msg = TRUE;
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
171 }
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
172 }
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
173
11670
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11666
diff changeset
174 void
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
175 ch_logn(channel_T *ch, char *msg, int nr)
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
176 {
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
177 if (log_fd != NULL)
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
178 {
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
179 ch_log_lead("", ch);
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
180 fprintf(log_fd, msg, nr);
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
181 fputc('\n', log_fd);
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
182 fflush(log_fd);
8428
4e22d0e7bfb1 commit https://github.com/vim/vim/commit/d0b6502a7ace39d6cd30874110a572371d10beae
Christian Brabandt <cb@256bit.org>
parents: 8422
diff changeset
183 did_log_msg = TRUE;
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
184 }
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
185 }
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
186
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
187 void
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
188 ch_logs(channel_T *ch, char *msg, char *name)
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
189 {
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
190 if (log_fd != NULL)
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
191 {
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
192 ch_log_lead("", ch);
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
193 fprintf(log_fd, msg, name);
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
194 fputc('\n', log_fd);
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
195 fflush(log_fd);
8428
4e22d0e7bfb1 commit https://github.com/vim/vim/commit/d0b6502a7ace39d6cd30874110a572371d10beae
Christian Brabandt <cb@256bit.org>
parents: 8422
diff changeset
196 did_log_msg = TRUE;
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
197 }
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
198 }
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
199
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
200 static void
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
201 ch_logsn(channel_T *ch, char *msg, char *name, int nr)
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
202 {
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
203 if (log_fd != NULL)
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
204 {
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
205 ch_log_lead("", ch);
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
206 fprintf(log_fd, msg, name, nr);
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
207 fputc('\n', log_fd);
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
208 fflush(log_fd);
8428
4e22d0e7bfb1 commit https://github.com/vim/vim/commit/d0b6502a7ace39d6cd30874110a572371d10beae
Christian Brabandt <cb@256bit.org>
parents: 8422
diff changeset
209 did_log_msg = TRUE;
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
210 }
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
211 }
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
212
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
213 static void
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
214 ch_error(channel_T *ch, char *msg)
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
215 {
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
216 if (log_fd != NULL)
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
217 {
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
218 ch_log_lead("ERR ", ch);
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
219 fputs(msg, log_fd);
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
220 fputc('\n', log_fd);
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
221 fflush(log_fd);
8428
4e22d0e7bfb1 commit https://github.com/vim/vim/commit/d0b6502a7ace39d6cd30874110a572371d10beae
Christian Brabandt <cb@256bit.org>
parents: 8422
diff changeset
222 did_log_msg = TRUE;
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
223 }
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
224 }
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
225
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
226 static void
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
227 ch_errorn(channel_T *ch, char *msg, int nr)
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
228 {
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
229 if (log_fd != NULL)
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
230 {
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
231 ch_log_lead("ERR ", ch);
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
232 fprintf(log_fd, msg, nr);
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
233 fputc('\n', log_fd);
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
234 fflush(log_fd);
8428
4e22d0e7bfb1 commit https://github.com/vim/vim/commit/d0b6502a7ace39d6cd30874110a572371d10beae
Christian Brabandt <cb@256bit.org>
parents: 8422
diff changeset
235 did_log_msg = TRUE;
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
236 }
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
237 }
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
238
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
239 static void
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
240 ch_errors(channel_T *ch, char *msg, char *arg)
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
241 {
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
242 if (log_fd != NULL)
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
243 {
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
244 ch_log_lead("ERR ", ch);
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
245 fprintf(log_fd, msg, arg);
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
246 fputc('\n', log_fd);
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
247 fflush(log_fd);
8428
4e22d0e7bfb1 commit https://github.com/vim/vim/commit/d0b6502a7ace39d6cd30874110a572371d10beae
Christian Brabandt <cb@256bit.org>
parents: 8422
diff changeset
248 did_log_msg = TRUE;
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
249 }
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
250 }
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
251
7935
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
252 #ifdef _WIN32
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
253 # undef PERROR
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
254 # define PERROR(msg) (void)emsg3((char_u *)"%s: %s", \
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
255 (char_u *)msg, (char_u *)strerror_win32(errno))
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
256
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
257 static char *
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
258 strerror_win32(int eno)
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
259 {
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
260 static LPVOID msgbuf = NULL;
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
261 char_u *ptr;
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
262
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
263 if (msgbuf)
9355
40c8a8b012b5 commit https://github.com/vim/vim/commit/aad30bbcde2b268e2fffb6fd1443f27ebda9d1ff
Christian Brabandt <cb@256bit.org>
parents: 9282
diff changeset
264 {
7935
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
265 LocalFree(msgbuf);
9355
40c8a8b012b5 commit https://github.com/vim/vim/commit/aad30bbcde2b268e2fffb6fd1443f27ebda9d1ff
Christian Brabandt <cb@256bit.org>
parents: 9282
diff changeset
266 msgbuf = NULL;
40c8a8b012b5 commit https://github.com/vim/vim/commit/aad30bbcde2b268e2fffb6fd1443f27ebda9d1ff
Christian Brabandt <cb@256bit.org>
parents: 9282
diff changeset
267 }
7935
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
268 FormatMessage(
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
269 FORMAT_MESSAGE_ALLOCATE_BUFFER |
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
270 FORMAT_MESSAGE_FROM_SYSTEM |
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
271 FORMAT_MESSAGE_IGNORE_INSERTS,
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
272 NULL,
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
273 eno,
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
274 MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT),
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
275 (LPTSTR) &msgbuf,
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
276 0,
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
277 NULL);
9355
40c8a8b012b5 commit https://github.com/vim/vim/commit/aad30bbcde2b268e2fffb6fd1443f27ebda9d1ff
Christian Brabandt <cb@256bit.org>
parents: 9282
diff changeset
278 if (msgbuf != NULL)
40c8a8b012b5 commit https://github.com/vim/vim/commit/aad30bbcde2b268e2fffb6fd1443f27ebda9d1ff
Christian Brabandt <cb@256bit.org>
parents: 9282
diff changeset
279 /* chomp \r or \n */
40c8a8b012b5 commit https://github.com/vim/vim/commit/aad30bbcde2b268e2fffb6fd1443f27ebda9d1ff
Christian Brabandt <cb@256bit.org>
parents: 9282
diff changeset
280 for (ptr = (char_u *)msgbuf; *ptr; ptr++)
40c8a8b012b5 commit https://github.com/vim/vim/commit/aad30bbcde2b268e2fffb6fd1443f27ebda9d1ff
Christian Brabandt <cb@256bit.org>
parents: 9282
diff changeset
281 switch (*ptr)
40c8a8b012b5 commit https://github.com/vim/vim/commit/aad30bbcde2b268e2fffb6fd1443f27ebda9d1ff
Christian Brabandt <cb@256bit.org>
parents: 9282
diff changeset
282 {
40c8a8b012b5 commit https://github.com/vim/vim/commit/aad30bbcde2b268e2fffb6fd1443f27ebda9d1ff
Christian Brabandt <cb@256bit.org>
parents: 9282
diff changeset
283 case '\r':
40c8a8b012b5 commit https://github.com/vim/vim/commit/aad30bbcde2b268e2fffb6fd1443f27ebda9d1ff
Christian Brabandt <cb@256bit.org>
parents: 9282
diff changeset
284 STRMOVE(ptr, ptr + 1);
40c8a8b012b5 commit https://github.com/vim/vim/commit/aad30bbcde2b268e2fffb6fd1443f27ebda9d1ff
Christian Brabandt <cb@256bit.org>
parents: 9282
diff changeset
285 ptr--;
40c8a8b012b5 commit https://github.com/vim/vim/commit/aad30bbcde2b268e2fffb6fd1443f27ebda9d1ff
Christian Brabandt <cb@256bit.org>
parents: 9282
diff changeset
286 break;
40c8a8b012b5 commit https://github.com/vim/vim/commit/aad30bbcde2b268e2fffb6fd1443f27ebda9d1ff
Christian Brabandt <cb@256bit.org>
parents: 9282
diff changeset
287 case '\n':
40c8a8b012b5 commit https://github.com/vim/vim/commit/aad30bbcde2b268e2fffb6fd1443f27ebda9d1ff
Christian Brabandt <cb@256bit.org>
parents: 9282
diff changeset
288 if (*(ptr + 1) == '\0')
40c8a8b012b5 commit https://github.com/vim/vim/commit/aad30bbcde2b268e2fffb6fd1443f27ebda9d1ff
Christian Brabandt <cb@256bit.org>
parents: 9282
diff changeset
289 *ptr = '\0';
40c8a8b012b5 commit https://github.com/vim/vim/commit/aad30bbcde2b268e2fffb6fd1443f27ebda9d1ff
Christian Brabandt <cb@256bit.org>
parents: 9282
diff changeset
290 else
40c8a8b012b5 commit https://github.com/vim/vim/commit/aad30bbcde2b268e2fffb6fd1443f27ebda9d1ff
Christian Brabandt <cb@256bit.org>
parents: 9282
diff changeset
291 *ptr = ' ';
40c8a8b012b5 commit https://github.com/vim/vim/commit/aad30bbcde2b268e2fffb6fd1443f27ebda9d1ff
Christian Brabandt <cb@256bit.org>
parents: 9282
diff changeset
292 break;
40c8a8b012b5 commit https://github.com/vim/vim/commit/aad30bbcde2b268e2fffb6fd1443f27ebda9d1ff
Christian Brabandt <cb@256bit.org>
parents: 9282
diff changeset
293 }
7935
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
294 return msgbuf;
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
295 }
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
296 #endif
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
297
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
298 /*
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
299 * The list of all allocated channels.
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
300 */
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
301 static channel_T *first_channel = NULL;
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
302 static int next_ch_id = 0;
7743
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
303
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
304 /*
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
305 * Allocate a new channel. The refcount is set to 1.
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
306 * The channel isn't actually used until it is opened.
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
307 * Returns NULL if out of memory.
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
308 */
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
309 channel_T *
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
310 add_channel(void)
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
311 {
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
312 ch_part_T part;
8047
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
313 channel_T *channel = (channel_T *)alloc_clear((int)sizeof(channel_T));
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
314
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
315 if (channel == NULL)
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
316 return NULL;
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
317
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
318 channel->ch_id = next_ch_id++;
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
319 ch_log(channel, "Created channel");
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
320
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
321 for (part = PART_SOCK; part < PART_COUNT; ++part)
8047
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
322 {
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
323 channel->ch_part[part].ch_fd = INVALID_FD;
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
324 #ifdef FEAT_GUI_X11
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
325 channel->ch_part[part].ch_inputHandler = (XtInputId)NULL;
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
326 #endif
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
327 #ifdef FEAT_GUI_GTK
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
328 channel->ch_part[part].ch_inputHandler = 0;
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
329 #endif
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
330 channel->ch_part[part].ch_timeout = 2000;
8047
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
331 }
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
332
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
333 if (first_channel != NULL)
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
334 {
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
335 first_channel->ch_prev = channel;
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
336 channel->ch_next = first_channel;
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
337 }
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
338 first_channel = channel;
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
339
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
340 channel->ch_refcount = 1;
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
341 return channel;
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
342 }
7935
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
343
10240
175b1116f96a commit https://github.com/vim/vim/commit/b9c31e71f5a4653a27e81c21226039bfa35b9131
Christian Brabandt <cb@256bit.org>
parents: 10233
diff changeset
344 int
175b1116f96a commit https://github.com/vim/vim/commit/b9c31e71f5a4653a27e81c21226039bfa35b9131
Christian Brabandt <cb@256bit.org>
parents: 10233
diff changeset
345 has_any_channel(void)
175b1116f96a commit https://github.com/vim/vim/commit/b9c31e71f5a4653a27e81c21226039bfa35b9131
Christian Brabandt <cb@256bit.org>
parents: 10233
diff changeset
346 {
175b1116f96a commit https://github.com/vim/vim/commit/b9c31e71f5a4653a27e81c21226039bfa35b9131
Christian Brabandt <cb@256bit.org>
parents: 10233
diff changeset
347 return first_channel != NULL;
175b1116f96a commit https://github.com/vim/vim/commit/b9c31e71f5a4653a27e81c21226039bfa35b9131
Christian Brabandt <cb@256bit.org>
parents: 10233
diff changeset
348 }
175b1116f96a commit https://github.com/vim/vim/commit/b9c31e71f5a4653a27e81c21226039bfa35b9131
Christian Brabandt <cb@256bit.org>
parents: 10233
diff changeset
349
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
350 /*
8310
aec8f8ce8e4c commit https://github.com/vim/vim/commit/d6051b5eb83687f60bb4a2f3d5cd23fe8b290eb4
Christian Brabandt <cb@256bit.org>
parents: 8297
diff changeset
351 * Called when the refcount of a channel is zero.
8259
99a70c3b902f commit https://github.com/vim/vim/commit/46c85439c966d7ed39fb3d711d4d6c61ac964647
Christian Brabandt <cb@256bit.org>
parents: 8257
diff changeset
352 * Return TRUE if "channel" has a callback and the associated job wasn't
99a70c3b902f commit https://github.com/vim/vim/commit/46c85439c966d7ed39fb3d711d4d6c61ac964647
Christian Brabandt <cb@256bit.org>
parents: 8257
diff changeset
353 * killed.
8257
c4ffdda8cdfd commit https://github.com/vim/vim/commit/c8dcbb12c5d7f3eb0c334daebb4475bb015b91e7
Christian Brabandt <cb@256bit.org>
parents: 8240
diff changeset
354 */
c4ffdda8cdfd commit https://github.com/vim/vim/commit/c8dcbb12c5d7f3eb0c334daebb4475bb015b91e7
Christian Brabandt <cb@256bit.org>
parents: 8240
diff changeset
355 static int
8259
99a70c3b902f commit https://github.com/vim/vim/commit/46c85439c966d7ed39fb3d711d4d6c61ac964647
Christian Brabandt <cb@256bit.org>
parents: 8257
diff changeset
356 channel_still_useful(channel_T *channel)
8257
c4ffdda8cdfd commit https://github.com/vim/vim/commit/c8dcbb12c5d7f3eb0c334daebb4475bb015b91e7
Christian Brabandt <cb@256bit.org>
parents: 8240
diff changeset
357 {
8332
07713b8243ac commit https://github.com/vim/vim/commit/fdd6ce4a2f922afac7bd719a00228dbd8539b9c4
Christian Brabandt <cb@256bit.org>
parents: 8330
diff changeset
358 int has_sock_msg;
07713b8243ac commit https://github.com/vim/vim/commit/fdd6ce4a2f922afac7bd719a00228dbd8539b9c4
Christian Brabandt <cb@256bit.org>
parents: 8330
diff changeset
359 int has_out_msg;
07713b8243ac commit https://github.com/vim/vim/commit/fdd6ce4a2f922afac7bd719a00228dbd8539b9c4
Christian Brabandt <cb@256bit.org>
parents: 8330
diff changeset
360 int has_err_msg;
07713b8243ac commit https://github.com/vim/vim/commit/fdd6ce4a2f922afac7bd719a00228dbd8539b9c4
Christian Brabandt <cb@256bit.org>
parents: 8330
diff changeset
361
07713b8243ac commit https://github.com/vim/vim/commit/fdd6ce4a2f922afac7bd719a00228dbd8539b9c4
Christian Brabandt <cb@256bit.org>
parents: 8330
diff changeset
362 /* If the job was killed the channel is not expected to work anymore. */
8259
99a70c3b902f commit https://github.com/vim/vim/commit/46c85439c966d7ed39fb3d711d4d6c61ac964647
Christian Brabandt <cb@256bit.org>
parents: 8257
diff changeset
363 if (channel->ch_job_killed && channel->ch_job == NULL)
99a70c3b902f commit https://github.com/vim/vim/commit/46c85439c966d7ed39fb3d711d4d6c61ac964647
Christian Brabandt <cb@256bit.org>
parents: 8257
diff changeset
364 return FALSE;
8332
07713b8243ac commit https://github.com/vim/vim/commit/fdd6ce4a2f922afac7bd719a00228dbd8539b9c4
Christian Brabandt <cb@256bit.org>
parents: 8330
diff changeset
365
07713b8243ac commit https://github.com/vim/vim/commit/fdd6ce4a2f922afac7bd719a00228dbd8539b9c4
Christian Brabandt <cb@256bit.org>
parents: 8330
diff changeset
366 /* If there is a close callback it may still need to be invoked. */
07713b8243ac commit https://github.com/vim/vim/commit/fdd6ce4a2f922afac7bd719a00228dbd8539b9c4
Christian Brabandt <cb@256bit.org>
parents: 8330
diff changeset
367 if (channel->ch_close_cb != NULL)
07713b8243ac commit https://github.com/vim/vim/commit/fdd6ce4a2f922afac7bd719a00228dbd8539b9c4
Christian Brabandt <cb@256bit.org>
parents: 8330
diff changeset
368 return TRUE;
07713b8243ac commit https://github.com/vim/vim/commit/fdd6ce4a2f922afac7bd719a00228dbd8539b9c4
Christian Brabandt <cb@256bit.org>
parents: 8330
diff changeset
369
9081
b2b915c1d311 commit https://github.com/vim/vim/commit/5d96e3ae534ade8ed09a5de9ff8fd7519537ec28
Christian Brabandt <cb@256bit.org>
parents: 9079
diff changeset
370 /* If reading from or a buffer it's still useful. */
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9434
diff changeset
371 if (channel->ch_part[PART_IN].ch_bufref.br_buf != NULL)
9081
b2b915c1d311 commit https://github.com/vim/vim/commit/5d96e3ae534ade8ed09a5de9ff8fd7519537ec28
Christian Brabandt <cb@256bit.org>
parents: 9079
diff changeset
372 return TRUE;
b2b915c1d311 commit https://github.com/vim/vim/commit/5d96e3ae534ade8ed09a5de9ff8fd7519537ec28
Christian Brabandt <cb@256bit.org>
parents: 9079
diff changeset
373
8332
07713b8243ac commit https://github.com/vim/vim/commit/fdd6ce4a2f922afac7bd719a00228dbd8539b9c4
Christian Brabandt <cb@256bit.org>
parents: 8330
diff changeset
374 /* If there is no callback then nobody can get readahead. If the fd is
07713b8243ac commit https://github.com/vim/vim/commit/fdd6ce4a2f922afac7bd719a00228dbd8539b9c4
Christian Brabandt <cb@256bit.org>
parents: 8330
diff changeset
375 * closed and there is no readahead then the callback won't be called. */
07713b8243ac commit https://github.com/vim/vim/commit/fdd6ce4a2f922afac7bd719a00228dbd8539b9c4
Christian Brabandt <cb@256bit.org>
parents: 8330
diff changeset
376 has_sock_msg = channel->ch_part[PART_SOCK].ch_fd != INVALID_FD
07713b8243ac commit https://github.com/vim/vim/commit/fdd6ce4a2f922afac7bd719a00228dbd8539b9c4
Christian Brabandt <cb@256bit.org>
parents: 8330
diff changeset
377 || channel->ch_part[PART_SOCK].ch_head.rq_next != NULL
07713b8243ac commit https://github.com/vim/vim/commit/fdd6ce4a2f922afac7bd719a00228dbd8539b9c4
Christian Brabandt <cb@256bit.org>
parents: 8330
diff changeset
378 || channel->ch_part[PART_SOCK].ch_json_head.jq_next != NULL;
07713b8243ac commit https://github.com/vim/vim/commit/fdd6ce4a2f922afac7bd719a00228dbd8539b9c4
Christian Brabandt <cb@256bit.org>
parents: 8330
diff changeset
379 has_out_msg = channel->ch_part[PART_OUT].ch_fd != INVALID_FD
07713b8243ac commit https://github.com/vim/vim/commit/fdd6ce4a2f922afac7bd719a00228dbd8539b9c4
Christian Brabandt <cb@256bit.org>
parents: 8330
diff changeset
380 || channel->ch_part[PART_OUT].ch_head.rq_next != NULL
07713b8243ac commit https://github.com/vim/vim/commit/fdd6ce4a2f922afac7bd719a00228dbd8539b9c4
Christian Brabandt <cb@256bit.org>
parents: 8330
diff changeset
381 || channel->ch_part[PART_OUT].ch_json_head.jq_next != NULL;
07713b8243ac commit https://github.com/vim/vim/commit/fdd6ce4a2f922afac7bd719a00228dbd8539b9c4
Christian Brabandt <cb@256bit.org>
parents: 8330
diff changeset
382 has_err_msg = channel->ch_part[PART_ERR].ch_fd != INVALID_FD
07713b8243ac commit https://github.com/vim/vim/commit/fdd6ce4a2f922afac7bd719a00228dbd8539b9c4
Christian Brabandt <cb@256bit.org>
parents: 8330
diff changeset
383 || channel->ch_part[PART_ERR].ch_head.rq_next != NULL
07713b8243ac commit https://github.com/vim/vim/commit/fdd6ce4a2f922afac7bd719a00228dbd8539b9c4
Christian Brabandt <cb@256bit.org>
parents: 8330
diff changeset
384 || channel->ch_part[PART_ERR].ch_json_head.jq_next != NULL;
07713b8243ac commit https://github.com/vim/vim/commit/fdd6ce4a2f922afac7bd719a00228dbd8539b9c4
Christian Brabandt <cb@256bit.org>
parents: 8330
diff changeset
385 return (channel->ch_callback != NULL && (has_sock_msg
8493
caed4b2d305f commit https://github.com/vim/vim/commit/509ce2a558e7e0c03242e32e844255af52f1c821
Christian Brabandt <cb@256bit.org>
parents: 8491
diff changeset
386 || has_out_msg || has_err_msg))
9081
b2b915c1d311 commit https://github.com/vim/vim/commit/5d96e3ae534ade8ed09a5de9ff8fd7519537ec28
Christian Brabandt <cb@256bit.org>
parents: 9079
diff changeset
387 || ((channel->ch_part[PART_OUT].ch_callback != NULL
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9434
diff changeset
388 || channel->ch_part[PART_OUT].ch_bufref.br_buf != NULL)
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9434
diff changeset
389 && has_out_msg)
9081
b2b915c1d311 commit https://github.com/vim/vim/commit/5d96e3ae534ade8ed09a5de9ff8fd7519537ec28
Christian Brabandt <cb@256bit.org>
parents: 9079
diff changeset
390 || ((channel->ch_part[PART_ERR].ch_callback != NULL
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9434
diff changeset
391 || channel->ch_part[PART_ERR].ch_bufref.br_buf != NULL)
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9434
diff changeset
392 && has_err_msg);
8257
c4ffdda8cdfd commit https://github.com/vim/vim/commit/c8dcbb12c5d7f3eb0c334daebb4475bb015b91e7
Christian Brabandt <cb@256bit.org>
parents: 8240
diff changeset
393 }
c4ffdda8cdfd commit https://github.com/vim/vim/commit/c8dcbb12c5d7f3eb0c334daebb4475bb015b91e7
Christian Brabandt <cb@256bit.org>
parents: 8240
diff changeset
394
c4ffdda8cdfd commit https://github.com/vim/vim/commit/c8dcbb12c5d7f3eb0c334daebb4475bb015b91e7
Christian Brabandt <cb@256bit.org>
parents: 8240
diff changeset
395 /*
8863
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
396 * Close a channel and free all its resources.
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
397 */
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
398 static void
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
399 channel_free_contents(channel_T *channel)
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
400 {
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
401 channel_close(channel, TRUE);
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
402 channel_clear(channel);
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
403 ch_log(channel, "Freeing channel");
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
404 }
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
405
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
406 static void
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
407 channel_free_channel(channel_T *channel)
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
408 {
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
409 if (channel->ch_next != NULL)
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
410 channel->ch_next->ch_prev = channel->ch_prev;
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
411 if (channel->ch_prev == NULL)
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
412 first_channel = channel->ch_next;
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
413 else
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
414 channel->ch_prev->ch_next = channel->ch_next;
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
415 vim_free(channel);
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
416 }
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
417
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
418 static void
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
419 channel_free(channel_T *channel)
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
420 {
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
421 if (!in_free_unref_items)
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
422 {
9085
d362e6df1deb commit https://github.com/vim/vim/commit/fb6ffc732e65dbc459c89247ff78134402f1a18b
Christian Brabandt <cb@256bit.org>
parents: 9083
diff changeset
423 if (safe_to_invoke_callback == 0)
d362e6df1deb commit https://github.com/vim/vim/commit/fb6ffc732e65dbc459c89247ff78134402f1a18b
Christian Brabandt <cb@256bit.org>
parents: 9083
diff changeset
424 channel->ch_to_be_freed = TRUE;
d362e6df1deb commit https://github.com/vim/vim/commit/fb6ffc732e65dbc459c89247ff78134402f1a18b
Christian Brabandt <cb@256bit.org>
parents: 9083
diff changeset
425 else
d362e6df1deb commit https://github.com/vim/vim/commit/fb6ffc732e65dbc459c89247ff78134402f1a18b
Christian Brabandt <cb@256bit.org>
parents: 9083
diff changeset
426 {
d362e6df1deb commit https://github.com/vim/vim/commit/fb6ffc732e65dbc459c89247ff78134402f1a18b
Christian Brabandt <cb@256bit.org>
parents: 9083
diff changeset
427 channel_free_contents(channel);
d362e6df1deb commit https://github.com/vim/vim/commit/fb6ffc732e65dbc459c89247ff78134402f1a18b
Christian Brabandt <cb@256bit.org>
parents: 9083
diff changeset
428 channel_free_channel(channel);
d362e6df1deb commit https://github.com/vim/vim/commit/fb6ffc732e65dbc459c89247ff78134402f1a18b
Christian Brabandt <cb@256bit.org>
parents: 9083
diff changeset
429 }
8863
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
430 }
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
431 }
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
432
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
433 /*
8257
c4ffdda8cdfd commit https://github.com/vim/vim/commit/c8dcbb12c5d7f3eb0c334daebb4475bb015b91e7
Christian Brabandt <cb@256bit.org>
parents: 8240
diff changeset
434 * Close a channel and free all its resources if there is no further action
8259
99a70c3b902f commit https://github.com/vim/vim/commit/46c85439c966d7ed39fb3d711d4d6c61ac964647
Christian Brabandt <cb@256bit.org>
parents: 8257
diff changeset
435 * possible, there is no callback to be invoked or the associated job was
99a70c3b902f commit https://github.com/vim/vim/commit/46c85439c966d7ed39fb3d711d4d6c61ac964647
Christian Brabandt <cb@256bit.org>
parents: 8257
diff changeset
436 * killed.
8318
190d8084cb3a commit https://github.com/vim/vim/commit/707659490d35e8d66e8bbdcfd93b12dc1387d86c
Christian Brabandt <cb@256bit.org>
parents: 8310
diff changeset
437 * Return TRUE if the channel was freed.
8257
c4ffdda8cdfd commit https://github.com/vim/vim/commit/c8dcbb12c5d7f3eb0c334daebb4475bb015b91e7
Christian Brabandt <cb@256bit.org>
parents: 8240
diff changeset
438 */
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
439 static int
8257
c4ffdda8cdfd commit https://github.com/vim/vim/commit/c8dcbb12c5d7f3eb0c334daebb4475bb015b91e7
Christian Brabandt <cb@256bit.org>
parents: 8240
diff changeset
440 channel_may_free(channel_T *channel)
c4ffdda8cdfd commit https://github.com/vim/vim/commit/c8dcbb12c5d7f3eb0c334daebb4475bb015b91e7
Christian Brabandt <cb@256bit.org>
parents: 8240
diff changeset
441 {
8259
99a70c3b902f commit https://github.com/vim/vim/commit/46c85439c966d7ed39fb3d711d4d6c61ac964647
Christian Brabandt <cb@256bit.org>
parents: 8257
diff changeset
442 if (!channel_still_useful(channel))
8318
190d8084cb3a commit https://github.com/vim/vim/commit/707659490d35e8d66e8bbdcfd93b12dc1387d86c
Christian Brabandt <cb@256bit.org>
parents: 8310
diff changeset
443 {
8257
c4ffdda8cdfd commit https://github.com/vim/vim/commit/c8dcbb12c5d7f3eb0c334daebb4475bb015b91e7
Christian Brabandt <cb@256bit.org>
parents: 8240
diff changeset
444 channel_free(channel);
8318
190d8084cb3a commit https://github.com/vim/vim/commit/707659490d35e8d66e8bbdcfd93b12dc1387d86c
Christian Brabandt <cb@256bit.org>
parents: 8310
diff changeset
445 return TRUE;
190d8084cb3a commit https://github.com/vim/vim/commit/707659490d35e8d66e8bbdcfd93b12dc1387d86c
Christian Brabandt <cb@256bit.org>
parents: 8310
diff changeset
446 }
190d8084cb3a commit https://github.com/vim/vim/commit/707659490d35e8d66e8bbdcfd93b12dc1387d86c
Christian Brabandt <cb@256bit.org>
parents: 8310
diff changeset
447 return FALSE;
8257
c4ffdda8cdfd commit https://github.com/vim/vim/commit/c8dcbb12c5d7f3eb0c334daebb4475bb015b91e7
Christian Brabandt <cb@256bit.org>
parents: 8240
diff changeset
448 }
c4ffdda8cdfd commit https://github.com/vim/vim/commit/c8dcbb12c5d7f3eb0c334daebb4475bb015b91e7
Christian Brabandt <cb@256bit.org>
parents: 8240
diff changeset
449
c4ffdda8cdfd commit https://github.com/vim/vim/commit/c8dcbb12c5d7f3eb0c334daebb4475bb015b91e7
Christian Brabandt <cb@256bit.org>
parents: 8240
diff changeset
450 /*
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
451 * Decrement the reference count on "channel" and maybe free it when it goes
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
452 * down to zero. Don't free it if there is a pending action.
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
453 * Returns TRUE when the channel is no longer referenced.
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
454 */
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
455 int
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
456 channel_unref(channel_T *channel)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
457 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
458 if (channel != NULL && --channel->ch_refcount <= 0)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
459 return channel_may_free(channel);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
460 return FALSE;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
461 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
462
8863
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
463 int
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
464 free_unused_channels_contents(int copyID, int mask)
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
465 {
8863
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
466 int did_free = FALSE;
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
467 channel_T *ch;
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
468
9085
d362e6df1deb commit https://github.com/vim/vim/commit/fb6ffc732e65dbc459c89247ff78134402f1a18b
Christian Brabandt <cb@256bit.org>
parents: 9083
diff changeset
469 /* This is invoked from the garbage collector, which only runs at a safe
d362e6df1deb commit https://github.com/vim/vim/commit/fb6ffc732e65dbc459c89247ff78134402f1a18b
Christian Brabandt <cb@256bit.org>
parents: 9083
diff changeset
470 * point. */
d362e6df1deb commit https://github.com/vim/vim/commit/fb6ffc732e65dbc459c89247ff78134402f1a18b
Christian Brabandt <cb@256bit.org>
parents: 9083
diff changeset
471 ++safe_to_invoke_callback;
d362e6df1deb commit https://github.com/vim/vim/commit/fb6ffc732e65dbc459c89247ff78134402f1a18b
Christian Brabandt <cb@256bit.org>
parents: 9083
diff changeset
472
8863
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
473 for (ch = first_channel; ch != NULL; ch = ch->ch_next)
9011
72a597e9e36d commit https://github.com/vim/vim/commit/674127e1801fd02ff07dddf0dc3bf0d8cce68997
Christian Brabandt <cb@256bit.org>
parents: 9007
diff changeset
474 if (!channel_still_useful(ch)
72a597e9e36d commit https://github.com/vim/vim/commit/674127e1801fd02ff07dddf0dc3bf0d8cce68997
Christian Brabandt <cb@256bit.org>
parents: 9007
diff changeset
475 && (ch->ch_copyID & mask) != (copyID & mask))
8863
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
476 {
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
477 /* Free the channel and ordinary items it contains, but don't
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
478 * recurse into Lists, Dictionaries etc. */
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
479 channel_free_contents(ch);
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
480 did_free = TRUE;
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
481 }
9085
d362e6df1deb commit https://github.com/vim/vim/commit/fb6ffc732e65dbc459c89247ff78134402f1a18b
Christian Brabandt <cb@256bit.org>
parents: 9083
diff changeset
482
d362e6df1deb commit https://github.com/vim/vim/commit/fb6ffc732e65dbc459c89247ff78134402f1a18b
Christian Brabandt <cb@256bit.org>
parents: 9083
diff changeset
483 --safe_to_invoke_callback;
8863
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
484 return did_free;
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
485 }
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
486
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
487 void
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
488 free_unused_channels(int copyID, int mask)
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
489 {
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
490 channel_T *ch;
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
491 channel_T *ch_next;
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
492
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
493 for (ch = first_channel; ch != NULL; ch = ch_next)
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
494 {
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
495 ch_next = ch->ch_next;
9011
72a597e9e36d commit https://github.com/vim/vim/commit/674127e1801fd02ff07dddf0dc3bf0d8cce68997
Christian Brabandt <cb@256bit.org>
parents: 9007
diff changeset
496 if (!channel_still_useful(ch)
72a597e9e36d commit https://github.com/vim/vim/commit/674127e1801fd02ff07dddf0dc3bf0d8cce68997
Christian Brabandt <cb@256bit.org>
parents: 9007
diff changeset
497 && (ch->ch_copyID & mask) != (copyID & mask))
8863
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
498 {
8881
ed0b39dd7fd6 commit https://github.com/vim/vim/commit/ebf7dfa6f121c82f97d2adca3d45fbaba9ad8f7e
Christian Brabandt <cb@256bit.org>
parents: 8863
diff changeset
499 /* Free the channel struct itself. */
8863
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
500 channel_free_channel(ch);
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
501 }
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
502 }
7743
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
503 }
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
504
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
505 #if defined(FEAT_GUI) || defined(PROTO)
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
506
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
507 #if defined(FEAT_GUI_X11) || defined(FEAT_GUI_GTK)
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
508 static void
8155
6ee6fb27dcea commit https://github.com/vim/vim/commit/fffd5560c6c8840be3233ef1c8da3c9e5dd424ea
Christian Brabandt <cb@256bit.org>
parents: 8151
diff changeset
509 channel_read_fd(int fd)
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
510 {
8155
6ee6fb27dcea commit https://github.com/vim/vim/commit/fffd5560c6c8840be3233ef1c8da3c9e5dd424ea
Christian Brabandt <cb@256bit.org>
parents: 8151
diff changeset
511 channel_T *channel;
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
512 ch_part_T part;
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
513
8155
6ee6fb27dcea commit https://github.com/vim/vim/commit/fffd5560c6c8840be3233ef1c8da3c9e5dd424ea
Christian Brabandt <cb@256bit.org>
parents: 8151
diff changeset
514 channel = channel_fd2channel(fd, &part);
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
515 if (channel == NULL)
8155
6ee6fb27dcea commit https://github.com/vim/vim/commit/fffd5560c6c8840be3233ef1c8da3c9e5dd424ea
Christian Brabandt <cb@256bit.org>
parents: 8151
diff changeset
516 ch_errorn(NULL, "Channel for fd %d not found", fd);
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
517 else
9123
b430d4f2aa79 commit https://github.com/vim/vim/commit/f8df45d84f1d17dced23e185d4835fc23406d73d
Christian Brabandt <cb@256bit.org>
parents: 9089
diff changeset
518 channel_read(channel, part, "channel_read_fd");
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
519 }
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
520 #endif
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
521
7743
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
522 /*
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
523 * Read a command from netbeans.
7743
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
524 */
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
525 #ifdef FEAT_GUI_X11
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
526 static void
9123
b430d4f2aa79 commit https://github.com/vim/vim/commit/f8df45d84f1d17dced23e185d4835fc23406d73d
Christian Brabandt <cb@256bit.org>
parents: 9089
diff changeset
527 messageFromServer(XtPointer clientData,
b430d4f2aa79 commit https://github.com/vim/vim/commit/f8df45d84f1d17dced23e185d4835fc23406d73d
Christian Brabandt <cb@256bit.org>
parents: 9089
diff changeset
528 int *unused1 UNUSED,
b430d4f2aa79 commit https://github.com/vim/vim/commit/f8df45d84f1d17dced23e185d4835fc23406d73d
Christian Brabandt <cb@256bit.org>
parents: 9089
diff changeset
529 XtInputId *unused2 UNUSED)
7743
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
530 {
8155
6ee6fb27dcea commit https://github.com/vim/vim/commit/fffd5560c6c8840be3233ef1c8da3c9e5dd424ea
Christian Brabandt <cb@256bit.org>
parents: 8151
diff changeset
531 channel_read_fd((int)(long)clientData);
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
532 }
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
533 #endif
7743
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
534
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
535 #ifdef FEAT_GUI_GTK
8218
3456e2ebebd4 commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents: 8210
diff changeset
536 # if GTK_CHECK_VERSION(3,0,0)
3456e2ebebd4 commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents: 8210
diff changeset
537 static gboolean
9123
b430d4f2aa79 commit https://github.com/vim/vim/commit/f8df45d84f1d17dced23e185d4835fc23406d73d
Christian Brabandt <cb@256bit.org>
parents: 9089
diff changeset
538 messageFromServer(GIOChannel *unused1 UNUSED,
b430d4f2aa79 commit https://github.com/vim/vim/commit/f8df45d84f1d17dced23e185d4835fc23406d73d
Christian Brabandt <cb@256bit.org>
parents: 9089
diff changeset
539 GIOCondition unused2 UNUSED,
b430d4f2aa79 commit https://github.com/vim/vim/commit/f8df45d84f1d17dced23e185d4835fc23406d73d
Christian Brabandt <cb@256bit.org>
parents: 9089
diff changeset
540 gpointer clientData)
8218
3456e2ebebd4 commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents: 8210
diff changeset
541 {
3456e2ebebd4 commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents: 8210
diff changeset
542 channel_read_fd(GPOINTER_TO_INT(clientData));
3456e2ebebd4 commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents: 8210
diff changeset
543 return TRUE; /* Return FALSE instead in case the event source is to
3456e2ebebd4 commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents: 8210
diff changeset
544 * be removed after this function returns. */
3456e2ebebd4 commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents: 8210
diff changeset
545 }
3456e2ebebd4 commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents: 8210
diff changeset
546 # else
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
547 static void
9123
b430d4f2aa79 commit https://github.com/vim/vim/commit/f8df45d84f1d17dced23e185d4835fc23406d73d
Christian Brabandt <cb@256bit.org>
parents: 9089
diff changeset
548 messageFromServer(gpointer clientData,
b430d4f2aa79 commit https://github.com/vim/vim/commit/f8df45d84f1d17dced23e185d4835fc23406d73d
Christian Brabandt <cb@256bit.org>
parents: 9089
diff changeset
549 gint unused1 UNUSED,
b430d4f2aa79 commit https://github.com/vim/vim/commit/f8df45d84f1d17dced23e185d4835fc23406d73d
Christian Brabandt <cb@256bit.org>
parents: 9089
diff changeset
550 GdkInputCondition unused2 UNUSED)
7743
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
551 {
8155
6ee6fb27dcea commit https://github.com/vim/vim/commit/fffd5560c6c8840be3233ef1c8da3c9e5dd424ea
Christian Brabandt <cb@256bit.org>
parents: 8151
diff changeset
552 channel_read_fd((int)(long)clientData);
7743
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
553 }
8218
3456e2ebebd4 commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents: 8210
diff changeset
554 # endif
7743
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
555 #endif
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
556
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
557 static void
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
558 channel_gui_register_one(channel_T *channel, ch_part_T part)
8047
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
559 {
8491
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
560 if (!CH_HAS_GUI)
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
561 return;
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
562
8047
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
563 # ifdef FEAT_GUI_X11
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
564 /* Tell notifier we are interested in being called
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
565 * when there is input on the editor connection socket. */
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
566 if (channel->ch_part[part].ch_inputHandler == (XtInputId)NULL)
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
567 channel->ch_part[part].ch_inputHandler = XtAppAddInput(
8047
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
568 (XtAppContext)app_context,
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
569 channel->ch_part[part].ch_fd,
8047
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
570 (XtPointer)(XtInputReadMask + XtInputExceptMask),
9123
b430d4f2aa79 commit https://github.com/vim/vim/commit/f8df45d84f1d17dced23e185d4835fc23406d73d
Christian Brabandt <cb@256bit.org>
parents: 9089
diff changeset
571 messageFromServer,
8155
6ee6fb27dcea commit https://github.com/vim/vim/commit/fffd5560c6c8840be3233ef1c8da3c9e5dd424ea
Christian Brabandt <cb@256bit.org>
parents: 8151
diff changeset
572 (XtPointer)(long)channel->ch_part[part].ch_fd);
8047
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
573 # else
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
574 # ifdef FEAT_GUI_GTK
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
575 /* Tell gdk we are interested in being called when there
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
576 * is input on the editor connection socket. */
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
577 if (channel->ch_part[part].ch_inputHandler == 0)
8218
3456e2ebebd4 commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents: 8210
diff changeset
578 # if GTK_CHECK_VERSION(3,0,0)
3456e2ebebd4 commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents: 8210
diff changeset
579 {
3456e2ebebd4 commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents: 8210
diff changeset
580 GIOChannel *chnnl = g_io_channel_unix_new(
3456e2ebebd4 commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents: 8210
diff changeset
581 (gint)channel->ch_part[part].ch_fd);
3456e2ebebd4 commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents: 8210
diff changeset
582
3456e2ebebd4 commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents: 8210
diff changeset
583 channel->ch_part[part].ch_inputHandler = g_io_add_watch(
3456e2ebebd4 commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents: 8210
diff changeset
584 chnnl,
3456e2ebebd4 commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents: 8210
diff changeset
585 G_IO_IN|G_IO_HUP|G_IO_ERR|G_IO_PRI,
9123
b430d4f2aa79 commit https://github.com/vim/vim/commit/f8df45d84f1d17dced23e185d4835fc23406d73d
Christian Brabandt <cb@256bit.org>
parents: 9089
diff changeset
586 messageFromServer,
8218
3456e2ebebd4 commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents: 8210
diff changeset
587 GINT_TO_POINTER(channel->ch_part[part].ch_fd));
3456e2ebebd4 commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents: 8210
diff changeset
588
3456e2ebebd4 commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents: 8210
diff changeset
589 g_io_channel_unref(chnnl);
3456e2ebebd4 commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents: 8210
diff changeset
590 }
3456e2ebebd4 commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents: 8210
diff changeset
591 # else
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
592 channel->ch_part[part].ch_inputHandler = gdk_input_add(
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
593 (gint)channel->ch_part[part].ch_fd,
8049
15253130abd8 commit https://github.com/vim/vim/commit/16eb4f88000cfdba68df6c421fe44e7e029ba53e
Christian Brabandt <cb@256bit.org>
parents: 8047
diff changeset
594 (GdkInputCondition)
15253130abd8 commit https://github.com/vim/vim/commit/16eb4f88000cfdba68df6c421fe44e7e029ba53e
Christian Brabandt <cb@256bit.org>
parents: 8047
diff changeset
595 ((int)GDK_INPUT_READ + (int)GDK_INPUT_EXCEPTION),
9123
b430d4f2aa79 commit https://github.com/vim/vim/commit/f8df45d84f1d17dced23e185d4835fc23406d73d
Christian Brabandt <cb@256bit.org>
parents: 9089
diff changeset
596 messageFromServer,
8155
6ee6fb27dcea commit https://github.com/vim/vim/commit/fffd5560c6c8840be3233ef1c8da3c9e5dd424ea
Christian Brabandt <cb@256bit.org>
parents: 8151
diff changeset
597 (gpointer)(long)channel->ch_part[part].ch_fd);
8218
3456e2ebebd4 commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents: 8210
diff changeset
598 # endif
8047
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
599 # endif
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
600 # endif
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
601 }
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
602
8491
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
603 static void
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
604 channel_gui_register(channel_T *channel)
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
605 {
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
606 if (channel->CH_SOCK_FD != INVALID_FD)
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
607 channel_gui_register_one(channel, PART_SOCK);
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
608 if (channel->CH_OUT_FD != INVALID_FD)
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
609 channel_gui_register_one(channel, PART_OUT);
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
610 if (channel->CH_ERR_FD != INVALID_FD)
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
611 channel_gui_register_one(channel, PART_ERR);
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
612 }
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
613
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
614 /*
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
615 * Register any of our file descriptors with the GUI event handling system.
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
616 * Called when the GUI has started.
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
617 */
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
618 void
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
619 channel_gui_register_all(void)
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
620 {
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
621 channel_T *channel;
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
622
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
623 for (channel = first_channel; channel != NULL; channel = channel->ch_next)
8047
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
624 channel_gui_register(channel);
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
625 }
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
626
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
627 static void
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
628 channel_gui_unregister_one(channel_T *channel, ch_part_T part)
8491
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
629 {
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
630 # ifdef FEAT_GUI_X11
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
631 if (channel->ch_part[part].ch_inputHandler != (XtInputId)NULL)
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
632 {
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
633 XtRemoveInput(channel->ch_part[part].ch_inputHandler);
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
634 channel->ch_part[part].ch_inputHandler = (XtInputId)NULL;
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
635 }
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
636 # else
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
637 # ifdef FEAT_GUI_GTK
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
638 if (channel->ch_part[part].ch_inputHandler != 0)
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
639 {
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
640 # if GTK_CHECK_VERSION(3,0,0)
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
641 g_source_remove(channel->ch_part[part].ch_inputHandler);
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
642 # else
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
643 gdk_input_remove(channel->ch_part[part].ch_inputHandler);
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
644 # endif
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
645 channel->ch_part[part].ch_inputHandler = 0;
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
646 }
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
647 # endif
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
648 # endif
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
649 }
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
650
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
651 static void
8049
15253130abd8 commit https://github.com/vim/vim/commit/16eb4f88000cfdba68df6c421fe44e7e029ba53e
Christian Brabandt <cb@256bit.org>
parents: 8047
diff changeset
652 channel_gui_unregister(channel_T *channel)
8047
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
653 {
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
654 ch_part_T part;
8049
15253130abd8 commit https://github.com/vim/vim/commit/16eb4f88000cfdba68df6c421fe44e7e029ba53e
Christian Brabandt <cb@256bit.org>
parents: 8047
diff changeset
655
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
656 for (part = PART_SOCK; part < PART_IN; ++part)
8491
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
657 channel_gui_unregister_one(channel, part);
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
658 }
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
659
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
660 #endif
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
661
8096
882ba5080c5c commit https://github.com/vim/vim/commit/e74e8e7d758e9312165a931f176185f07a64231a
Christian Brabandt <cb@256bit.org>
parents: 8094
diff changeset
662 static char *e_cannot_connect = N_("E902: Cannot connect to port");
882ba5080c5c commit https://github.com/vim/vim/commit/e74e8e7d758e9312165a931f176185f07a64231a
Christian Brabandt <cb@256bit.org>
parents: 8094
diff changeset
663
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
664 /*
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
665 * Open a socket channel to "hostname":"port".
8096
882ba5080c5c commit https://github.com/vim/vim/commit/e74e8e7d758e9312165a931f176185f07a64231a
Christian Brabandt <cb@256bit.org>
parents: 8094
diff changeset
666 * "waittime" is the time in msec to wait for the connection.
882ba5080c5c commit https://github.com/vim/vim/commit/e74e8e7d758e9312165a931f176185f07a64231a
Christian Brabandt <cb@256bit.org>
parents: 8094
diff changeset
667 * When negative wait forever.
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
668 * Returns the channel for success.
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
669 * Returns NULL for failure.
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
670 */
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
671 channel_T *
8210
b717dae2f26d commit https://github.com/vim/vim/commit/4e221c99e85ed40c98892068a01270b9e7492d98
Christian Brabandt <cb@256bit.org>
parents: 8204
diff changeset
672 channel_open(
b717dae2f26d commit https://github.com/vim/vim/commit/4e221c99e85ed40c98892068a01270b9e7492d98
Christian Brabandt <cb@256bit.org>
parents: 8204
diff changeset
673 char *hostname,
b717dae2f26d commit https://github.com/vim/vim/commit/4e221c99e85ed40c98892068a01270b9e7492d98
Christian Brabandt <cb@256bit.org>
parents: 8204
diff changeset
674 int port_in,
b717dae2f26d commit https://github.com/vim/vim/commit/4e221c99e85ed40c98892068a01270b9e7492d98
Christian Brabandt <cb@256bit.org>
parents: 8204
diff changeset
675 int waittime,
b717dae2f26d commit https://github.com/vim/vim/commit/4e221c99e85ed40c98892068a01270b9e7492d98
Christian Brabandt <cb@256bit.org>
parents: 8204
diff changeset
676 void (*nb_close_cb)(void))
7743
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
677 {
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
678 int sd = -1;
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
679 struct sockaddr_in server;
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
680 struct hostent *host;
7797
0d46cea25641 commit https://github.com/vim/vim/commit/f12d983deab06b0408781d7a6c2f8970d765b723
Christian Brabandt <cb@256bit.org>
parents: 7795
diff changeset
681 #ifdef WIN32
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
682 u_short port = port_in;
7935
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
683 u_long val = 1;
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
684 #else
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
685 int port = port_in;
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
686 #endif
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
687 channel_T *channel;
7935
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
688 int ret;
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
689
7797
0d46cea25641 commit https://github.com/vim/vim/commit/f12d983deab06b0408781d7a6c2f8970d765b723
Christian Brabandt <cb@256bit.org>
parents: 7795
diff changeset
690 #ifdef WIN32
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
691 channel_init_winsock();
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
692 #endif
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
693
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
694 channel = add_channel();
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
695 if (channel == NULL)
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
696 {
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
697 ch_error(NULL, "Cannot allocate channel.");
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
698 return NULL;
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
699 }
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
700
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
701 /* Get the server internet address and put into addr structure */
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
702 /* fill in the socket address structure and connect to server */
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
703 vim_memset((char *)&server, 0, sizeof(server));
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
704 server.sin_family = AF_INET;
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
705 server.sin_port = htons(port);
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
706 if ((host = gethostbyname(hostname)) == NULL)
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
707 {
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
708 ch_error(channel, "in gethostbyname() in channel_open()");
9953
9560a2eb7968 commit https://github.com/vim/vim/commit/5b30291785e6b9be1a607504c14bd03c601b59a6
Christian Brabandt <cb@256bit.org>
parents: 9723
diff changeset
709 PERROR(_("E901: gethostbyname() in channel_open()"));
8047
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
710 channel_free(channel);
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
711 return NULL;
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
712 }
10587
98ee4f22da6e patch 8.0.0183: ubsan warns for unaligned address
Christian Brabandt <cb@256bit.org>
parents: 10553
diff changeset
713 {
98ee4f22da6e patch 8.0.0183: ubsan warns for unaligned address
Christian Brabandt <cb@256bit.org>
parents: 10553
diff changeset
714 char *p;
98ee4f22da6e patch 8.0.0183: ubsan warns for unaligned address
Christian Brabandt <cb@256bit.org>
parents: 10553
diff changeset
715
98ee4f22da6e patch 8.0.0183: ubsan warns for unaligned address
Christian Brabandt <cb@256bit.org>
parents: 10553
diff changeset
716 /* When using host->h_addr directly ubsan warns for it to not be
98ee4f22da6e patch 8.0.0183: ubsan warns for unaligned address
Christian Brabandt <cb@256bit.org>
parents: 10553
diff changeset
717 * aligned. First copy the pointer to aviod that. */
98ee4f22da6e patch 8.0.0183: ubsan warns for unaligned address
Christian Brabandt <cb@256bit.org>
parents: 10553
diff changeset
718 memcpy(&p, &host->h_addr, sizeof(p));
98ee4f22da6e patch 8.0.0183: ubsan warns for unaligned address
Christian Brabandt <cb@256bit.org>
parents: 10553
diff changeset
719 memcpy((char *)&server.sin_addr, p, host->h_length);
98ee4f22da6e patch 8.0.0183: ubsan warns for unaligned address
Christian Brabandt <cb@256bit.org>
parents: 10553
diff changeset
720 }
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
721
8134
8abef552ece7 commit https://github.com/vim/vim/commit/254e00d71429aa4e71b93d3e8c6bb93bfebe4f26
Christian Brabandt <cb@256bit.org>
parents: 8132
diff changeset
722 /* On Mac and Solaris a zero timeout almost never works. At least wait
8abef552ece7 commit https://github.com/vim/vim/commit/254e00d71429aa4e71b93d3e8c6bb93bfebe4f26
Christian Brabandt <cb@256bit.org>
parents: 8132
diff changeset
723 * one millisecond. Let's do it for all systems, because we don't know why
8abef552ece7 commit https://github.com/vim/vim/commit/254e00d71429aa4e71b93d3e8c6bb93bfebe4f26
Christian Brabandt <cb@256bit.org>
parents: 8132
diff changeset
724 * this is needed. */
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
725 if (waittime == 0)
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
726 waittime = 1;
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
727
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
728 /*
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
729 * For Unix we need to call connect() again after connect() failed.
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
730 * On Win32 one time is sufficient.
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
731 */
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
732 while (TRUE)
7743
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
733 {
8473
ade1797aa6f4 commit https://github.com/vim/vim/commit/562ca7142845273bca656aa5aeeda90f001062e0
Christian Brabandt <cb@256bit.org>
parents: 8467
diff changeset
734 long elapsed_msec = 0;
ade1797aa6f4 commit https://github.com/vim/vim/commit/562ca7142845273bca656aa5aeeda90f001062e0
Christian Brabandt <cb@256bit.org>
parents: 8467
diff changeset
735 int waitnow;
8467
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
736
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
737 if (sd >= 0)
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
738 sock_close(sd);
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
739 sd = socket(AF_INET, SOCK_STREAM, 0);
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
740 if (sd == -1)
7935
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
741 {
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
742 ch_error(channel, "in socket() in channel_open().");
9953
9560a2eb7968 commit https://github.com/vim/vim/commit/5b30291785e6b9be1a607504c14bd03c601b59a6
Christian Brabandt <cb@256bit.org>
parents: 9723
diff changeset
743 PERROR(_("E898: socket() in channel_open()"));
8047
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
744 channel_free(channel);
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
745 return NULL;
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
746 }
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
747
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
748 if (waittime >= 0)
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
749 {
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
750 /* Make connect() non-blocking. */
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
751 if (
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
752 #ifdef _WIN32
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
753 ioctlsocket(sd, FIONBIO, &val) < 0
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
754 #else
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
755 fcntl(sd, F_SETFL, O_NONBLOCK) < 0
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
756 #endif
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
757 )
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
758 {
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
759 SOCK_ERRNO;
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
760 ch_errorn(channel,
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
761 "channel_open: Connect failed with errno %d", errno);
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
762 sock_close(sd);
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
763 channel_free(channel);
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
764 return NULL;
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
765 }
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
766 }
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
767
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
768 /* Try connecting to the server. */
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
769 ch_logsn(channel, "Connecting to %s port %d", hostname, port);
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
770 ret = connect(sd, (struct sockaddr *)&server, sizeof(server));
7935
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
771
8467
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
772 if (ret == 0)
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
773 /* The connection could be established. */
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
774 break;
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
775
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
776 SOCK_ERRNO;
8467
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
777 if (waittime < 0 || (errno != EWOULDBLOCK
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
778 && errno != ECONNREFUSED
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
779 #ifdef EINPROGRESS
8467
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
780 && errno != EINPROGRESS
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
781 #endif
8467
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
782 ))
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
783 {
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
784 ch_errorn(channel,
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
785 "channel_open: Connect failed with errno %d", errno);
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
786 PERROR(_(e_cannot_connect));
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
787 sock_close(sd);
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
788 channel_free(channel);
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
789 return NULL;
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
790 }
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
791
8481
8924d7adbc22 commit https://github.com/vim/vim/commit/40e8cb292c36f5057628e570591e8917ac1ca121
Christian Brabandt <cb@256bit.org>
parents: 8477
diff changeset
792 /* Limit the waittime to 50 msec. If it doesn't work within this
8924d7adbc22 commit https://github.com/vim/vim/commit/40e8cb292c36f5057628e570591e8917ac1ca121
Christian Brabandt <cb@256bit.org>
parents: 8477
diff changeset
793 * time we close the socket and try creating it again. */
8924d7adbc22 commit https://github.com/vim/vim/commit/40e8cb292c36f5057628e570591e8917ac1ca121
Christian Brabandt <cb@256bit.org>
parents: 8477
diff changeset
794 waitnow = waittime > 50 ? 50 : waittime;
8924d7adbc22 commit https://github.com/vim/vim/commit/40e8cb292c36f5057628e570591e8917ac1ca121
Christian Brabandt <cb@256bit.org>
parents: 8477
diff changeset
795
8467
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
796 /* If connect() didn't finish then try using select() to wait for the
8473
ade1797aa6f4 commit https://github.com/vim/vim/commit/562ca7142845273bca656aa5aeeda90f001062e0
Christian Brabandt <cb@256bit.org>
parents: 8467
diff changeset
797 * connection to be made. For Win32 always use select() to wait. */
8467
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
798 #ifndef WIN32
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
799 if (errno != ECONNREFUSED)
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
800 #endif
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
801 {
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
802 struct timeval tv;
8330
ec940c11f749 commit https://github.com/vim/vim/commit/d42119fff228434fe57e88d501c744de0a9fb1b1
Christian Brabandt <cb@256bit.org>
parents: 8320
diff changeset
803 fd_set rfds;
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
804 fd_set wfds;
8334
ad4b00bf2984 commit https://github.com/vim/vim/commit/e081e21f760bffc24ca98d5f9bbdb5f02e6aea79
Christian Brabandt <cb@256bit.org>
parents: 8332
diff changeset
805 #ifndef WIN32
8330
ec940c11f749 commit https://github.com/vim/vim/commit/d42119fff228434fe57e88d501c744de0a9fb1b1
Christian Brabandt <cb@256bit.org>
parents: 8320
diff changeset
806 int so_error = 0;
ec940c11f749 commit https://github.com/vim/vim/commit/d42119fff228434fe57e88d501c744de0a9fb1b1
Christian Brabandt <cb@256bit.org>
parents: 8320
diff changeset
807 socklen_t so_error_len = sizeof(so_error);
8467
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
808 struct timeval start_tv;
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
809 struct timeval end_tv;
8334
ad4b00bf2984 commit https://github.com/vim/vim/commit/e081e21f760bffc24ca98d5f9bbdb5f02e6aea79
Christian Brabandt <cb@256bit.org>
parents: 8332
diff changeset
810 #endif
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
811 FD_ZERO(&rfds);
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
812 FD_SET(sd, &rfds);
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
813 FD_ZERO(&wfds);
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
814 FD_SET(sd, &wfds);
8096
882ba5080c5c commit https://github.com/vim/vim/commit/e74e8e7d758e9312165a931f176185f07a64231a
Christian Brabandt <cb@256bit.org>
parents: 8094
diff changeset
815
8473
ade1797aa6f4 commit https://github.com/vim/vim/commit/562ca7142845273bca656aa5aeeda90f001062e0
Christian Brabandt <cb@256bit.org>
parents: 8467
diff changeset
816 tv.tv_sec = waitnow / 1000;
ade1797aa6f4 commit https://github.com/vim/vim/commit/562ca7142845273bca656aa5aeeda90f001062e0
Christian Brabandt <cb@256bit.org>
parents: 8467
diff changeset
817 tv.tv_usec = (waitnow % 1000) * 1000;
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
818 #ifndef WIN32
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
819 gettimeofday(&start_tv, NULL);
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
820 #endif
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
821 ch_logn(channel,
8473
ade1797aa6f4 commit https://github.com/vim/vim/commit/562ca7142845273bca656aa5aeeda90f001062e0
Christian Brabandt <cb@256bit.org>
parents: 8467
diff changeset
822 "Waiting for connection (waiting %d msec)...", waitnow);
8330
ec940c11f749 commit https://github.com/vim/vim/commit/d42119fff228434fe57e88d501c744de0a9fb1b1
Christian Brabandt <cb@256bit.org>
parents: 8320
diff changeset
823 ret = select((int)sd + 1, &rfds, &wfds, NULL, &tv);
8096
882ba5080c5c commit https://github.com/vim/vim/commit/e74e8e7d758e9312165a931f176185f07a64231a
Christian Brabandt <cb@256bit.org>
parents: 8094
diff changeset
824
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
825 if (ret < 0)
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
826 {
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
827 SOCK_ERRNO;
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
828 ch_errorn(channel,
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
829 "channel_open: Connect failed with errno %d", errno);
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
830 PERROR(_(e_cannot_connect));
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
831 sock_close(sd);
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
832 channel_free(channel);
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
833 return NULL;
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
834 }
8330
ec940c11f749 commit https://github.com/vim/vim/commit/d42119fff228434fe57e88d501c744de0a9fb1b1
Christian Brabandt <cb@256bit.org>
parents: 8320
diff changeset
835
8334
ad4b00bf2984 commit https://github.com/vim/vim/commit/e081e21f760bffc24ca98d5f9bbdb5f02e6aea79
Christian Brabandt <cb@256bit.org>
parents: 8332
diff changeset
836 #ifdef WIN32
8473
ade1797aa6f4 commit https://github.com/vim/vim/commit/562ca7142845273bca656aa5aeeda90f001062e0
Christian Brabandt <cb@256bit.org>
parents: 8467
diff changeset
837 /* On Win32: select() is expected to work and wait for up to
ade1797aa6f4 commit https://github.com/vim/vim/commit/562ca7142845273bca656aa5aeeda90f001062e0
Christian Brabandt <cb@256bit.org>
parents: 8467
diff changeset
838 * "waitnow" msec for the socket to be open. */
8467
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
839 if (FD_ISSET(sd, &wfds))
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
840 break;
8473
ade1797aa6f4 commit https://github.com/vim/vim/commit/562ca7142845273bca656aa5aeeda90f001062e0
Christian Brabandt <cb@256bit.org>
parents: 8467
diff changeset
841 elapsed_msec = waitnow;
ade1797aa6f4 commit https://github.com/vim/vim/commit/562ca7142845273bca656aa5aeeda90f001062e0
Christian Brabandt <cb@256bit.org>
parents: 8467
diff changeset
842 if (waittime > 1 && elapsed_msec < waittime)
ade1797aa6f4 commit https://github.com/vim/vim/commit/562ca7142845273bca656aa5aeeda90f001062e0
Christian Brabandt <cb@256bit.org>
parents: 8467
diff changeset
843 {
ade1797aa6f4 commit https://github.com/vim/vim/commit/562ca7142845273bca656aa5aeeda90f001062e0
Christian Brabandt <cb@256bit.org>
parents: 8467
diff changeset
844 waittime -= elapsed_msec;
ade1797aa6f4 commit https://github.com/vim/vim/commit/562ca7142845273bca656aa5aeeda90f001062e0
Christian Brabandt <cb@256bit.org>
parents: 8467
diff changeset
845 continue;
ade1797aa6f4 commit https://github.com/vim/vim/commit/562ca7142845273bca656aa5aeeda90f001062e0
Christian Brabandt <cb@256bit.org>
parents: 8467
diff changeset
846 }
8334
ad4b00bf2984 commit https://github.com/vim/vim/commit/e081e21f760bffc24ca98d5f9bbdb5f02e6aea79
Christian Brabandt <cb@256bit.org>
parents: 8332
diff changeset
847 #else
ad4b00bf2984 commit https://github.com/vim/vim/commit/e081e21f760bffc24ca98d5f9bbdb5f02e6aea79
Christian Brabandt <cb@256bit.org>
parents: 8332
diff changeset
848 /* On Linux-like systems: See socket(7) for the behavior
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
849 * After putting the socket in non-blocking mode, connect() will
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
850 * return EINPROGRESS, select() will not wait (as if writing is
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
851 * possible), need to use getsockopt() to check if the socket is
8354
b151c3f9be72 commit https://github.com/vim/vim/commit/42bc6dde46f1b52476cc84ee89277f981b4116c4
Christian Brabandt <cb@256bit.org>
parents: 8348
diff changeset
852 * actually able to connect.
8467
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
853 * We detect a failure to connect when either read and write fds
8330
ec940c11f749 commit https://github.com/vim/vim/commit/d42119fff228434fe57e88d501c744de0a9fb1b1
Christian Brabandt <cb@256bit.org>
parents: 8320
diff changeset
854 * are set. Use getsockopt() to find out what kind of failure. */
8354
b151c3f9be72 commit https://github.com/vim/vim/commit/42bc6dde46f1b52476cc84ee89277f981b4116c4
Christian Brabandt <cb@256bit.org>
parents: 8348
diff changeset
855 if (FD_ISSET(sd, &rfds) || FD_ISSET(sd, &wfds))
8330
ec940c11f749 commit https://github.com/vim/vim/commit/d42119fff228434fe57e88d501c744de0a9fb1b1
Christian Brabandt <cb@256bit.org>
parents: 8320
diff changeset
856 {
ec940c11f749 commit https://github.com/vim/vim/commit/d42119fff228434fe57e88d501c744de0a9fb1b1
Christian Brabandt <cb@256bit.org>
parents: 8320
diff changeset
857 ret = getsockopt(sd,
8467
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
858 SOL_SOCKET, SO_ERROR, &so_error, &so_error_len);
8330
ec940c11f749 commit https://github.com/vim/vim/commit/d42119fff228434fe57e88d501c744de0a9fb1b1
Christian Brabandt <cb@256bit.org>
parents: 8320
diff changeset
859 if (ret < 0 || (so_error != 0
ec940c11f749 commit https://github.com/vim/vim/commit/d42119fff228434fe57e88d501c744de0a9fb1b1
Christian Brabandt <cb@256bit.org>
parents: 8320
diff changeset
860 && so_error != EWOULDBLOCK
ec940c11f749 commit https://github.com/vim/vim/commit/d42119fff228434fe57e88d501c744de0a9fb1b1
Christian Brabandt <cb@256bit.org>
parents: 8320
diff changeset
861 && so_error != ECONNREFUSED
8334
ad4b00bf2984 commit https://github.com/vim/vim/commit/e081e21f760bffc24ca98d5f9bbdb5f02e6aea79
Christian Brabandt <cb@256bit.org>
parents: 8332
diff changeset
862 # ifdef EINPROGRESS
8330
ec940c11f749 commit https://github.com/vim/vim/commit/d42119fff228434fe57e88d501c744de0a9fb1b1
Christian Brabandt <cb@256bit.org>
parents: 8320
diff changeset
863 && so_error != EINPROGRESS
8334
ad4b00bf2984 commit https://github.com/vim/vim/commit/e081e21f760bffc24ca98d5f9bbdb5f02e6aea79
Christian Brabandt <cb@256bit.org>
parents: 8332
diff changeset
864 # endif
8330
ec940c11f749 commit https://github.com/vim/vim/commit/d42119fff228434fe57e88d501c744de0a9fb1b1
Christian Brabandt <cb@256bit.org>
parents: 8320
diff changeset
865 ))
ec940c11f749 commit https://github.com/vim/vim/commit/d42119fff228434fe57e88d501c744de0a9fb1b1
Christian Brabandt <cb@256bit.org>
parents: 8320
diff changeset
866 {
ec940c11f749 commit https://github.com/vim/vim/commit/d42119fff228434fe57e88d501c744de0a9fb1b1
Christian Brabandt <cb@256bit.org>
parents: 8320
diff changeset
867 ch_errorn(channel,
ec940c11f749 commit https://github.com/vim/vim/commit/d42119fff228434fe57e88d501c744de0a9fb1b1
Christian Brabandt <cb@256bit.org>
parents: 8320
diff changeset
868 "channel_open: Connect failed with errno %d",
ec940c11f749 commit https://github.com/vim/vim/commit/d42119fff228434fe57e88d501c744de0a9fb1b1
Christian Brabandt <cb@256bit.org>
parents: 8320
diff changeset
869 so_error);
ec940c11f749 commit https://github.com/vim/vim/commit/d42119fff228434fe57e88d501c744de0a9fb1b1
Christian Brabandt <cb@256bit.org>
parents: 8320
diff changeset
870 PERROR(_(e_cannot_connect));
ec940c11f749 commit https://github.com/vim/vim/commit/d42119fff228434fe57e88d501c744de0a9fb1b1
Christian Brabandt <cb@256bit.org>
parents: 8320
diff changeset
871 sock_close(sd);
ec940c11f749 commit https://github.com/vim/vim/commit/d42119fff228434fe57e88d501c744de0a9fb1b1
Christian Brabandt <cb@256bit.org>
parents: 8320
diff changeset
872 channel_free(channel);
ec940c11f749 commit https://github.com/vim/vim/commit/d42119fff228434fe57e88d501c744de0a9fb1b1
Christian Brabandt <cb@256bit.org>
parents: 8320
diff changeset
873 return NULL;
ec940c11f749 commit https://github.com/vim/vim/commit/d42119fff228434fe57e88d501c744de0a9fb1b1
Christian Brabandt <cb@256bit.org>
parents: 8320
diff changeset
874 }
ec940c11f749 commit https://github.com/vim/vim/commit/d42119fff228434fe57e88d501c744de0a9fb1b1
Christian Brabandt <cb@256bit.org>
parents: 8320
diff changeset
875 }
ec940c11f749 commit https://github.com/vim/vim/commit/d42119fff228434fe57e88d501c744de0a9fb1b1
Christian Brabandt <cb@256bit.org>
parents: 8320
diff changeset
876
8467
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
877 if (FD_ISSET(sd, &wfds) && so_error == 0)
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
878 /* Did not detect an error, connection is established. */
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
879 break;
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
880
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
881 gettimeofday(&end_tv, NULL);
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
882 elapsed_msec = (end_tv.tv_sec - start_tv.tv_sec) * 1000
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
883 + (end_tv.tv_usec - start_tv.tv_usec) / 1000;
8334
ad4b00bf2984 commit https://github.com/vim/vim/commit/e081e21f760bffc24ca98d5f9bbdb5f02e6aea79
Christian Brabandt <cb@256bit.org>
parents: 8332
diff changeset
884 #endif
8467
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
885 }
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
886
8467
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
887 #ifndef WIN32
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
888 if (waittime > 1 && elapsed_msec < waittime)
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
889 {
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
890 /* The port isn't ready but we also didn't get an error.
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
891 * This happens when the server didn't open the socket
8473
ade1797aa6f4 commit https://github.com/vim/vim/commit/562ca7142845273bca656aa5aeeda90f001062e0
Christian Brabandt <cb@256bit.org>
parents: 8467
diff changeset
892 * yet. Select() may return early, wait until the remaining
ade1797aa6f4 commit https://github.com/vim/vim/commit/562ca7142845273bca656aa5aeeda90f001062e0
Christian Brabandt <cb@256bit.org>
parents: 8467
diff changeset
893 * "waitnow" and try again. */
ade1797aa6f4 commit https://github.com/vim/vim/commit/562ca7142845273bca656aa5aeeda90f001062e0
Christian Brabandt <cb@256bit.org>
parents: 8467
diff changeset
894 waitnow -= elapsed_msec;
ade1797aa6f4 commit https://github.com/vim/vim/commit/562ca7142845273bca656aa5aeeda90f001062e0
Christian Brabandt <cb@256bit.org>
parents: 8467
diff changeset
895 waittime -= elapsed_msec;
ade1797aa6f4 commit https://github.com/vim/vim/commit/562ca7142845273bca656aa5aeeda90f001062e0
Christian Brabandt <cb@256bit.org>
parents: 8467
diff changeset
896 if (waitnow > 0)
ade1797aa6f4 commit https://github.com/vim/vim/commit/562ca7142845273bca656aa5aeeda90f001062e0
Christian Brabandt <cb@256bit.org>
parents: 8467
diff changeset
897 {
ade1797aa6f4 commit https://github.com/vim/vim/commit/562ca7142845273bca656aa5aeeda90f001062e0
Christian Brabandt <cb@256bit.org>
parents: 8467
diff changeset
898 mch_delay((long)waitnow, TRUE);
ade1797aa6f4 commit https://github.com/vim/vim/commit/562ca7142845273bca656aa5aeeda90f001062e0
Christian Brabandt <cb@256bit.org>
parents: 8467
diff changeset
899 ui_breakcheck();
ade1797aa6f4 commit https://github.com/vim/vim/commit/562ca7142845273bca656aa5aeeda90f001062e0
Christian Brabandt <cb@256bit.org>
parents: 8467
diff changeset
900 waittime -= waitnow;
ade1797aa6f4 commit https://github.com/vim/vim/commit/562ca7142845273bca656aa5aeeda90f001062e0
Christian Brabandt <cb@256bit.org>
parents: 8467
diff changeset
901 }
8467
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
902 if (!got_int)
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
903 {
8473
ade1797aa6f4 commit https://github.com/vim/vim/commit/562ca7142845273bca656aa5aeeda90f001062e0
Christian Brabandt <cb@256bit.org>
parents: 8467
diff changeset
904 if (waittime <= 0)
ade1797aa6f4 commit https://github.com/vim/vim/commit/562ca7142845273bca656aa5aeeda90f001062e0
Christian Brabandt <cb@256bit.org>
parents: 8467
diff changeset
905 /* give it one more try */
8467
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
906 waittime = 1;
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
907 continue;
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
908 }
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
909 /* we were interrupted, behave as if timed out */
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
910 }
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
911 #endif
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
912
8467
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
913 /* We timed out. */
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
914 ch_error(channel, "Connection timed out");
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
915 sock_close(sd);
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
916 channel_free(channel);
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
917 return NULL;
7982
5c30ba57aaea commit https://github.com/vim/vim/commit/7a84dbe6be0ef0e1ffbb7148cfe4ab50b9ba8f41
Christian Brabandt <cb@256bit.org>
parents: 7967
diff changeset
918 }
7935
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
919
8467
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
920 ch_log(channel, "Connection made");
86a327403fb0 commit https://github.com/vim/vim/commit/045a284a83c2a85113de233d5233eae34724a4b6
Christian Brabandt <cb@256bit.org>
parents: 8463
diff changeset
921
7982
5c30ba57aaea commit https://github.com/vim/vim/commit/7a84dbe6be0ef0e1ffbb7148cfe4ab50b9ba8f41
Christian Brabandt <cb@256bit.org>
parents: 7967
diff changeset
922 if (waittime >= 0)
5c30ba57aaea commit https://github.com/vim/vim/commit/7a84dbe6be0ef0e1ffbb7148cfe4ab50b9ba8f41
Christian Brabandt <cb@256bit.org>
parents: 7967
diff changeset
923 {
7935
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
924 #ifdef _WIN32
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
925 val = 0;
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
926 ioctlsocket(sd, FIONBIO, &val);
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
927 #else
7961
a7e58c6e4e9a commit https://github.com/vim/vim/commit/fbc4b4db3a9690906a96e16724350a6241cf32a5
Christian Brabandt <cb@256bit.org>
parents: 7945
diff changeset
928 (void)fcntl(sd, F_SETFL, 0);
7935
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
929 #endif
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
930 }
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
931
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
932 channel->CH_SOCK_FD = (sock_T)sd;
8210
b717dae2f26d commit https://github.com/vim/vim/commit/4e221c99e85ed40c98892068a01270b9e7492d98
Christian Brabandt <cb@256bit.org>
parents: 8204
diff changeset
933 channel->ch_nb_close_cb = nb_close_cb;
8669
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
934 channel->ch_hostname = (char *)vim_strsave((char_u *)hostname);
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
935 channel->ch_port = port_in;
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
936 channel->ch_to_be_closed |= (1 << PART_SOCK);
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
937
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
938 #ifdef FEAT_GUI
8491
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
939 channel_gui_register_one(channel, PART_SOCK);
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
940 #endif
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
941
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
942 return channel;
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
943 }
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
944
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
945 /*
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
946 * Implements ch_open().
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
947 */
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
948 channel_T *
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
949 channel_open_func(typval_T *argvars)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
950 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
951 char_u *address;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
952 char_u *p;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
953 char *rest;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
954 int port;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
955 jobopt_T opt;
8859
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
956 channel_T *channel = NULL;
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
957
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
958 address = get_tv_string(&argvars[0]);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
959 if (argvars[1].v_type != VAR_UNKNOWN
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
960 && (argvars[1].v_type != VAR_DICT || argvars[1].vval.v_dict == NULL))
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
961 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
962 EMSG(_(e_invarg));
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
963 return NULL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
964 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
965
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
966 /* parse address */
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
967 p = vim_strchr(address, ':');
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
968 if (p == NULL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
969 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
970 EMSG2(_(e_invarg2), address);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
971 return NULL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
972 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
973 *p++ = NUL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
974 port = strtol((char *)p, &rest, 10);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
975 if (*address == NUL || port <= 0 || *rest != NUL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
976 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
977 p[-1] = ':';
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
978 EMSG2(_(e_invarg2), address);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
979 return NULL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
980 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
981
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
982 /* parse options */
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
983 clear_job_options(&opt);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
984 opt.jo_mode = MODE_JSON;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
985 opt.jo_timeout = 2000;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
986 if (get_job_options(&argvars[1], &opt,
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
987 JO_MODE_ALL + JO_CB_ALL + JO_WAITTIME + JO_TIMEOUT_ALL) == FAIL)
8859
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
988 goto theend;
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
989 if (opt.jo_timeout < 0)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
990 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
991 EMSG(_(e_invarg));
8859
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
992 goto theend;
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
993 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
994
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
995 channel = channel_open((char *)address, port, opt.jo_waittime, NULL);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
996 if (channel != NULL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
997 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
998 opt.jo_set = JO_ALL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
999 channel_set_options(channel, &opt);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
1000 }
8859
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
1001 theend:
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
1002 free_job_options(&opt);
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
1003 return channel;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
1004 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
1005
8491
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
1006 static void
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
1007 ch_close_part(channel_T *channel, ch_part_T part)
8491
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
1008 {
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
1009 sock_T *fd = &channel->ch_part[part].ch_fd;
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
1010
8491
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
1011 if (*fd != INVALID_FD)
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
1012 {
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
1013 if (part == PART_SOCK)
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
1014 sock_close(*fd);
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
1015 else
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
1016 fd_close(*fd);
8491
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
1017 *fd = INVALID_FD;
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
1018
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
1019 channel->ch_to_be_closed &= ~(1 << part);
8491
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
1020 }
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
1021 }
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
1022
7788
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
1023 void
8059
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
1024 channel_set_pipes(channel_T *channel, sock_T in, sock_T out, sock_T err)
7788
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
1025 {
8491
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
1026 if (in != INVALID_FD)
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
1027 {
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
1028 ch_close_part(channel, PART_IN);
8491
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
1029 channel->CH_IN_FD = in;
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
1030 }
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
1031 if (out != INVALID_FD)
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
1032 {
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
1033 # if defined(FEAT_GUI)
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
1034 channel_gui_unregister_one(channel, PART_OUT);
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
1035 # endif
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
1036 ch_close_part(channel, PART_OUT);
8491
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
1037 channel->CH_OUT_FD = out;
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
1038 channel->ch_to_be_closed |= (1 << PART_OUT);
8491
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
1039 # if defined(FEAT_GUI)
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
1040 channel_gui_register_one(channel, PART_OUT);
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
1041 # endif
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
1042 }
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
1043 if (err != INVALID_FD)
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
1044 {
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
1045 # if defined(FEAT_GUI)
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
1046 channel_gui_unregister_one(channel, PART_ERR);
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
1047 # endif
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
1048 ch_close_part(channel, PART_ERR);
8491
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
1049 channel->CH_ERR_FD = err;
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
1050 channel->ch_to_be_closed |= (1 << PART_ERR);
8491
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
1051 # if defined(FEAT_GUI)
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
1052 channel_gui_register_one(channel, PART_ERR);
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
1053 # endif
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8481
diff changeset
1054 }
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
1055 }
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
1056
8310
aec8f8ce8e4c commit https://github.com/vim/vim/commit/d6051b5eb83687f60bb4a2f3d5cd23fe8b290eb4
Christian Brabandt <cb@256bit.org>
parents: 8297
diff changeset
1057 /*
8386
3b9a306724ec commit https://github.com/vim/vim/commit/014069a7ac51557e531eb3c8b94e36f2193f6c21
Christian Brabandt <cb@256bit.org>
parents: 8382
diff changeset
1058 * Sets the job the channel is associated with and associated options.
8310
aec8f8ce8e4c commit https://github.com/vim/vim/commit/d6051b5eb83687f60bb4a2f3d5cd23fe8b290eb4
Christian Brabandt <cb@256bit.org>
parents: 8297
diff changeset
1059 * This does not keep a refcount, when the job is freed ch_job is cleared.
aec8f8ce8e4c commit https://github.com/vim/vim/commit/d6051b5eb83687f60bb4a2f3d5cd23fe8b290eb4
Christian Brabandt <cb@256bit.org>
parents: 8297
diff changeset
1060 */
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
1061 void
8386
3b9a306724ec commit https://github.com/vim/vim/commit/014069a7ac51557e531eb3c8b94e36f2193f6c21
Christian Brabandt <cb@256bit.org>
parents: 8382
diff changeset
1062 channel_set_job(channel_T *channel, job_T *job, jobopt_T *options)
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
1063 {
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
1064 channel->ch_job = job;
8386
3b9a306724ec commit https://github.com/vim/vim/commit/014069a7ac51557e531eb3c8b94e36f2193f6c21
Christian Brabandt <cb@256bit.org>
parents: 8382
diff changeset
1065
3b9a306724ec commit https://github.com/vim/vim/commit/014069a7ac51557e531eb3c8b94e36f2193f6c21
Christian Brabandt <cb@256bit.org>
parents: 8382
diff changeset
1066 channel_set_options(channel, options);
3b9a306724ec commit https://github.com/vim/vim/commit/014069a7ac51557e531eb3c8b94e36f2193f6c21
Christian Brabandt <cb@256bit.org>
parents: 8382
diff changeset
1067
3b9a306724ec commit https://github.com/vim/vim/commit/014069a7ac51557e531eb3c8b94e36f2193f6c21
Christian Brabandt <cb@256bit.org>
parents: 8382
diff changeset
1068 if (job->jv_in_buf != NULL)
3b9a306724ec commit https://github.com/vim/vim/commit/014069a7ac51557e531eb3c8b94e36f2193f6c21
Christian Brabandt <cb@256bit.org>
parents: 8382
diff changeset
1069 {
3b9a306724ec commit https://github.com/vim/vim/commit/014069a7ac51557e531eb3c8b94e36f2193f6c21
Christian Brabandt <cb@256bit.org>
parents: 8382
diff changeset
1070 chanpart_T *in_part = &channel->ch_part[PART_IN];
3b9a306724ec commit https://github.com/vim/vim/commit/014069a7ac51557e531eb3c8b94e36f2193f6c21
Christian Brabandt <cb@256bit.org>
parents: 8382
diff changeset
1071
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9434
diff changeset
1072 set_bufref(&in_part->ch_bufref, job->jv_in_buf);
8386
3b9a306724ec commit https://github.com/vim/vim/commit/014069a7ac51557e531eb3c8b94e36f2193f6c21
Christian Brabandt <cb@256bit.org>
parents: 8382
diff changeset
1073 ch_logs(channel, "reading from buffer '%s'",
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9434
diff changeset
1074 (char *)in_part->ch_bufref.br_buf->b_ffname);
8386
3b9a306724ec commit https://github.com/vim/vim/commit/014069a7ac51557e531eb3c8b94e36f2193f6c21
Christian Brabandt <cb@256bit.org>
parents: 8382
diff changeset
1075 if (options->jo_set & JO_IN_TOP)
8422
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1076 {
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1077 if (options->jo_in_top == 0 && !(options->jo_set & JO_IN_BOT))
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1078 {
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1079 /* Special mode: send last-but-one line when appending a line
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1080 * to the buffer. */
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9434
diff changeset
1081 in_part->ch_bufref.br_buf->b_write_to_channel = TRUE;
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1082 in_part->ch_buf_append = TRUE;
8422
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1083 in_part->ch_buf_top =
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9434
diff changeset
1084 in_part->ch_bufref.br_buf->b_ml.ml_line_count + 1;
8422
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1085 }
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1086 else
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1087 in_part->ch_buf_top = options->jo_in_top;
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1088 }
8386
3b9a306724ec commit https://github.com/vim/vim/commit/014069a7ac51557e531eb3c8b94e36f2193f6c21
Christian Brabandt <cb@256bit.org>
parents: 8382
diff changeset
1089 else
3b9a306724ec commit https://github.com/vim/vim/commit/014069a7ac51557e531eb3c8b94e36f2193f6c21
Christian Brabandt <cb@256bit.org>
parents: 8382
diff changeset
1090 in_part->ch_buf_top = 1;
3b9a306724ec commit https://github.com/vim/vim/commit/014069a7ac51557e531eb3c8b94e36f2193f6c21
Christian Brabandt <cb@256bit.org>
parents: 8382
diff changeset
1091 if (options->jo_set & JO_IN_BOT)
3b9a306724ec commit https://github.com/vim/vim/commit/014069a7ac51557e531eb3c8b94e36f2193f6c21
Christian Brabandt <cb@256bit.org>
parents: 8382
diff changeset
1092 in_part->ch_buf_bot = options->jo_in_bot;
3b9a306724ec commit https://github.com/vim/vim/commit/014069a7ac51557e531eb3c8b94e36f2193f6c21
Christian Brabandt <cb@256bit.org>
parents: 8382
diff changeset
1093 else
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9434
diff changeset
1094 in_part->ch_buf_bot = in_part->ch_bufref.br_buf->b_ml.ml_line_count;
8386
3b9a306724ec commit https://github.com/vim/vim/commit/014069a7ac51557e531eb3c8b94e36f2193f6c21
Christian Brabandt <cb@256bit.org>
parents: 8382
diff changeset
1095 }
7788
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
1096 }
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
1097
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
1098 /*
8267
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
1099 * Find a buffer matching "name" or create a new one.
9087
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1100 * Returns NULL if there is something very wrong (error already reported).
8267
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
1101 */
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
1102 static buf_T *
10147
65afd399ffa7 commit https://github.com/vim/vim/commit/169ebb080454357279ad5ad21ac532deaec605e8
Christian Brabandt <cb@256bit.org>
parents: 10112
diff changeset
1103 find_buffer(char_u *name, int err, int msg)
8267
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
1104 {
8291
ac0c43e7af20 commit https://github.com/vim/vim/commit/c7f0ebc6d1e1cdaed816b88a0d6092c5ace615eb
Christian Brabandt <cb@256bit.org>
parents: 8267
diff changeset
1105 buf_T *buf = NULL;
8267
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
1106 buf_T *save_curbuf = curbuf;
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
1107
8291
ac0c43e7af20 commit https://github.com/vim/vim/commit/c7f0ebc6d1e1cdaed816b88a0d6092c5ace615eb
Christian Brabandt <cb@256bit.org>
parents: 8267
diff changeset
1108 if (name != NULL && *name != NUL)
9149
18bbf31015c2 commit https://github.com/vim/vim/commit/b127cfd75f59e82580df395b6e2c009774644b16
Christian Brabandt <cb@256bit.org>
parents: 9147
diff changeset
1109 {
8291
ac0c43e7af20 commit https://github.com/vim/vim/commit/c7f0ebc6d1e1cdaed816b88a0d6092c5ace615eb
Christian Brabandt <cb@256bit.org>
parents: 8267
diff changeset
1110 buf = buflist_findname(name);
9149
18bbf31015c2 commit https://github.com/vim/vim/commit/b127cfd75f59e82580df395b6e2c009774644b16
Christian Brabandt <cb@256bit.org>
parents: 9147
diff changeset
1111 if (buf == NULL)
18bbf31015c2 commit https://github.com/vim/vim/commit/b127cfd75f59e82580df395b6e2c009774644b16
Christian Brabandt <cb@256bit.org>
parents: 9147
diff changeset
1112 buf = buflist_findname_exp(name);
18bbf31015c2 commit https://github.com/vim/vim/commit/b127cfd75f59e82580df395b6e2c009774644b16
Christian Brabandt <cb@256bit.org>
parents: 9147
diff changeset
1113 }
8267
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
1114 if (buf == NULL)
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
1115 {
8297
4929eca308b7 commit https://github.com/vim/vim/commit/e26643e6bcd6c6c42f5eae78cee2e7950cd3f629
Christian Brabandt <cb@256bit.org>
parents: 8291
diff changeset
1116 buf = buflist_new(name == NULL || *name == NUL ? NULL : name,
9149
18bbf31015c2 commit https://github.com/vim/vim/commit/b127cfd75f59e82580df395b6e2c009774644b16
Christian Brabandt <cb@256bit.org>
parents: 9147
diff changeset
1117 NULL, (linenr_T)0, BLN_LISTED | BLN_NEW);
9087
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1118 if (buf == NULL)
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1119 return NULL;
8267
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
1120 buf_copy_options(buf, BCO_ENTER);
8657
c70eea7a7677 commit https://github.com/vim/vim/commit/a4f6ca717b4483eb82c6c71f71a5a5cf70e55d80
Christian Brabandt <cb@256bit.org>
parents: 8655
diff changeset
1121 curbuf = buf;
8267
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
1122 #ifdef FEAT_QUICKFIX
8422
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1123 set_option_value((char_u *)"bt", 0L, (char_u *)"nofile", OPT_LOCAL);
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1124 set_option_value((char_u *)"bh", 0L, (char_u *)"hide", OPT_LOCAL);
8267
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
1125 #endif
8422
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1126 if (curbuf->b_ml.ml_mfp == NULL)
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1127 ml_open(curbuf);
10147
65afd399ffa7 commit https://github.com/vim/vim/commit/169ebb080454357279ad5ad21ac532deaec605e8
Christian Brabandt <cb@256bit.org>
parents: 10112
diff changeset
1128 if (msg)
65afd399ffa7 commit https://github.com/vim/vim/commit/169ebb080454357279ad5ad21ac532deaec605e8
Christian Brabandt <cb@256bit.org>
parents: 10112
diff changeset
1129 ml_replace(1, (char_u *)(err ? "Reading from channel error..."
8463
508504ca52ac commit https://github.com/vim/vim/commit/6ff02c96519946716069f05c62849986a706033b
Christian Brabandt <cb@256bit.org>
parents: 8453
diff changeset
1130 : "Reading from channel output..."), TRUE);
8267
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
1131 changed_bytes(1, 0);
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
1132 curbuf = save_curbuf;
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
1133 }
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
1134
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
1135 return buf;
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
1136 }
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
1137
9491
404de131cff9 commit https://github.com/vim/vim/commit/1436d8d51cce114be56209924fc71376407e5bad
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
1138 static void
404de131cff9 commit https://github.com/vim/vim/commit/1436d8d51cce114be56209924fc71376407e5bad
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
1139 set_callback(
404de131cff9 commit https://github.com/vim/vim/commit/1436d8d51cce114be56209924fc71376407e5bad
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
1140 char_u **cbp,
404de131cff9 commit https://github.com/vim/vim/commit/1436d8d51cce114be56209924fc71376407e5bad
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
1141 partial_T **pp,
404de131cff9 commit https://github.com/vim/vim/commit/1436d8d51cce114be56209924fc71376407e5bad
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
1142 char_u *callback,
404de131cff9 commit https://github.com/vim/vim/commit/1436d8d51cce114be56209924fc71376407e5bad
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
1143 partial_T *partial)
404de131cff9 commit https://github.com/vim/vim/commit/1436d8d51cce114be56209924fc71376407e5bad
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
1144 {
404de131cff9 commit https://github.com/vim/vim/commit/1436d8d51cce114be56209924fc71376407e5bad
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
1145 free_callback(*cbp, *pp);
404de131cff9 commit https://github.com/vim/vim/commit/1436d8d51cce114be56209924fc71376407e5bad
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
1146 if (callback != NULL && *callback != NUL)
9529
581d5131629f commit https://github.com/vim/vim/commit/5ef2e762844e0eb1f5b213bd58e6bc38bdb69dac
Christian Brabandt <cb@256bit.org>
parents: 9491
diff changeset
1147 {
581d5131629f commit https://github.com/vim/vim/commit/5ef2e762844e0eb1f5b213bd58e6bc38bdb69dac
Christian Brabandt <cb@256bit.org>
parents: 9491
diff changeset
1148 if (partial != NULL)
9723
80ac9cf77c9b commit https://github.com/vim/vim/commit/437bafe4c8a83ed71ee006eda7f54b65a90f0d4c
Christian Brabandt <cb@256bit.org>
parents: 9711
diff changeset
1149 *cbp = partial_name(partial);
9529
581d5131629f commit https://github.com/vim/vim/commit/5ef2e762844e0eb1f5b213bd58e6bc38bdb69dac
Christian Brabandt <cb@256bit.org>
parents: 9491
diff changeset
1150 else
9723
80ac9cf77c9b commit https://github.com/vim/vim/commit/437bafe4c8a83ed71ee006eda7f54b65a90f0d4c
Christian Brabandt <cb@256bit.org>
parents: 9711
diff changeset
1151 {
9529
581d5131629f commit https://github.com/vim/vim/commit/5ef2e762844e0eb1f5b213bd58e6bc38bdb69dac
Christian Brabandt <cb@256bit.org>
parents: 9491
diff changeset
1152 *cbp = vim_strsave(callback);
9723
80ac9cf77c9b commit https://github.com/vim/vim/commit/437bafe4c8a83ed71ee006eda7f54b65a90f0d4c
Christian Brabandt <cb@256bit.org>
parents: 9711
diff changeset
1153 func_ref(*cbp);
80ac9cf77c9b commit https://github.com/vim/vim/commit/437bafe4c8a83ed71ee006eda7f54b65a90f0d4c
Christian Brabandt <cb@256bit.org>
parents: 9711
diff changeset
1154 }
9529
581d5131629f commit https://github.com/vim/vim/commit/5ef2e762844e0eb1f5b213bd58e6bc38bdb69dac
Christian Brabandt <cb@256bit.org>
parents: 9491
diff changeset
1155 }
9491
404de131cff9 commit https://github.com/vim/vim/commit/1436d8d51cce114be56209924fc71376407e5bad
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
1156 else
404de131cff9 commit https://github.com/vim/vim/commit/1436d8d51cce114be56209924fc71376407e5bad
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
1157 *cbp = NULL;
404de131cff9 commit https://github.com/vim/vim/commit/1436d8d51cce114be56209924fc71376407e5bad
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
1158 *pp = partial;
9723
80ac9cf77c9b commit https://github.com/vim/vim/commit/437bafe4c8a83ed71ee006eda7f54b65a90f0d4c
Christian Brabandt <cb@256bit.org>
parents: 9711
diff changeset
1159 if (partial != NULL)
80ac9cf77c9b commit https://github.com/vim/vim/commit/437bafe4c8a83ed71ee006eda7f54b65a90f0d4c
Christian Brabandt <cb@256bit.org>
parents: 9711
diff changeset
1160 ++partial->pt_refcount;
9491
404de131cff9 commit https://github.com/vim/vim/commit/1436d8d51cce114be56209924fc71376407e5bad
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
1161 }
404de131cff9 commit https://github.com/vim/vim/commit/1436d8d51cce114be56209924fc71376407e5bad
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
1162
8267
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
1163 /*
8165
973686665238 commit https://github.com/vim/vim/commit/b6b5252bcde68b296858bc090cb424493635dfec
Christian Brabandt <cb@256bit.org>
parents: 8159
diff changeset
1164 * Set various properties from an "opt" argument.
8094
18a3f0f05244 commit https://github.com/vim/vim/commit/910b8aac5dc4693c4508b7acd2cef0bbfac04242
Christian Brabandt <cb@256bit.org>
parents: 8084
diff changeset
1165 */
18a3f0f05244 commit https://github.com/vim/vim/commit/910b8aac5dc4693c4508b7acd2cef0bbfac04242
Christian Brabandt <cb@256bit.org>
parents: 8084
diff changeset
1166 void
8165
973686665238 commit https://github.com/vim/vim/commit/b6b5252bcde68b296858bc090cb424493635dfec
Christian Brabandt <cb@256bit.org>
parents: 8159
diff changeset
1167 channel_set_options(channel_T *channel, jobopt_T *opt)
8094
18a3f0f05244 commit https://github.com/vim/vim/commit/910b8aac5dc4693c4508b7acd2cef0bbfac04242
Christian Brabandt <cb@256bit.org>
parents: 8084
diff changeset
1168 {
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
1169 ch_part_T part;
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1170
8165
973686665238 commit https://github.com/vim/vim/commit/b6b5252bcde68b296858bc090cb424493635dfec
Christian Brabandt <cb@256bit.org>
parents: 8159
diff changeset
1171 if (opt->jo_set & JO_MODE)
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
1172 for (part = PART_SOCK; part < PART_COUNT; ++part)
8165
973686665238 commit https://github.com/vim/vim/commit/b6b5252bcde68b296858bc090cb424493635dfec
Christian Brabandt <cb@256bit.org>
parents: 8159
diff changeset
1173 channel->ch_part[part].ch_mode = opt->jo_mode;
973686665238 commit https://github.com/vim/vim/commit/b6b5252bcde68b296858bc090cb424493635dfec
Christian Brabandt <cb@256bit.org>
parents: 8159
diff changeset
1174 if (opt->jo_set & JO_IN_MODE)
973686665238 commit https://github.com/vim/vim/commit/b6b5252bcde68b296858bc090cb424493635dfec
Christian Brabandt <cb@256bit.org>
parents: 8159
diff changeset
1175 channel->ch_part[PART_IN].ch_mode = opt->jo_in_mode;
973686665238 commit https://github.com/vim/vim/commit/b6b5252bcde68b296858bc090cb424493635dfec
Christian Brabandt <cb@256bit.org>
parents: 8159
diff changeset
1176 if (opt->jo_set & JO_OUT_MODE)
973686665238 commit https://github.com/vim/vim/commit/b6b5252bcde68b296858bc090cb424493635dfec
Christian Brabandt <cb@256bit.org>
parents: 8159
diff changeset
1177 channel->ch_part[PART_OUT].ch_mode = opt->jo_out_mode;
973686665238 commit https://github.com/vim/vim/commit/b6b5252bcde68b296858bc090cb424493635dfec
Christian Brabandt <cb@256bit.org>
parents: 8159
diff changeset
1178 if (opt->jo_set & JO_ERR_MODE)
973686665238 commit https://github.com/vim/vim/commit/b6b5252bcde68b296858bc090cb424493635dfec
Christian Brabandt <cb@256bit.org>
parents: 8159
diff changeset
1179 channel->ch_part[PART_ERR].ch_mode = opt->jo_err_mode;
973686665238 commit https://github.com/vim/vim/commit/b6b5252bcde68b296858bc090cb424493635dfec
Christian Brabandt <cb@256bit.org>
parents: 8159
diff changeset
1180
973686665238 commit https://github.com/vim/vim/commit/b6b5252bcde68b296858bc090cb424493635dfec
Christian Brabandt <cb@256bit.org>
parents: 8159
diff changeset
1181 if (opt->jo_set & JO_TIMEOUT)
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
1182 for (part = PART_SOCK; part < PART_COUNT; ++part)
8165
973686665238 commit https://github.com/vim/vim/commit/b6b5252bcde68b296858bc090cb424493635dfec
Christian Brabandt <cb@256bit.org>
parents: 8159
diff changeset
1183 channel->ch_part[part].ch_timeout = opt->jo_timeout;
973686665238 commit https://github.com/vim/vim/commit/b6b5252bcde68b296858bc090cb424493635dfec
Christian Brabandt <cb@256bit.org>
parents: 8159
diff changeset
1184 if (opt->jo_set & JO_OUT_TIMEOUT)
973686665238 commit https://github.com/vim/vim/commit/b6b5252bcde68b296858bc090cb424493635dfec
Christian Brabandt <cb@256bit.org>
parents: 8159
diff changeset
1185 channel->ch_part[PART_OUT].ch_timeout = opt->jo_out_timeout;
973686665238 commit https://github.com/vim/vim/commit/b6b5252bcde68b296858bc090cb424493635dfec
Christian Brabandt <cb@256bit.org>
parents: 8159
diff changeset
1186 if (opt->jo_set & JO_ERR_TIMEOUT)
973686665238 commit https://github.com/vim/vim/commit/b6b5252bcde68b296858bc090cb424493635dfec
Christian Brabandt <cb@256bit.org>
parents: 8159
diff changeset
1187 channel->ch_part[PART_ERR].ch_timeout = opt->jo_err_timeout;
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1188 if (opt->jo_set & JO_BLOCK_WRITE)
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1189 channel->ch_part[PART_IN].ch_block_write = 1;
8094
18a3f0f05244 commit https://github.com/vim/vim/commit/910b8aac5dc4693c4508b7acd2cef0bbfac04242
Christian Brabandt <cb@256bit.org>
parents: 8084
diff changeset
1190
8165
973686665238 commit https://github.com/vim/vim/commit/b6b5252bcde68b296858bc090cb424493635dfec
Christian Brabandt <cb@256bit.org>
parents: 8159
diff changeset
1191 if (opt->jo_set & JO_CALLBACK)
9491
404de131cff9 commit https://github.com/vim/vim/commit/1436d8d51cce114be56209924fc71376407e5bad
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
1192 set_callback(&channel->ch_callback, &channel->ch_partial,
404de131cff9 commit https://github.com/vim/vim/commit/1436d8d51cce114be56209924fc71376407e5bad
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
1193 opt->jo_callback, opt->jo_partial);
8165
973686665238 commit https://github.com/vim/vim/commit/b6b5252bcde68b296858bc090cb424493635dfec
Christian Brabandt <cb@256bit.org>
parents: 8159
diff changeset
1194 if (opt->jo_set & JO_OUT_CALLBACK)
9491
404de131cff9 commit https://github.com/vim/vim/commit/1436d8d51cce114be56209924fc71376407e5bad
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
1195 set_callback(&channel->ch_part[PART_OUT].ch_callback,
404de131cff9 commit https://github.com/vim/vim/commit/1436d8d51cce114be56209924fc71376407e5bad
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
1196 &channel->ch_part[PART_OUT].ch_partial,
404de131cff9 commit https://github.com/vim/vim/commit/1436d8d51cce114be56209924fc71376407e5bad
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
1197 opt->jo_out_cb, opt->jo_out_partial);
8165
973686665238 commit https://github.com/vim/vim/commit/b6b5252bcde68b296858bc090cb424493635dfec
Christian Brabandt <cb@256bit.org>
parents: 8159
diff changeset
1198 if (opt->jo_set & JO_ERR_CALLBACK)
9491
404de131cff9 commit https://github.com/vim/vim/commit/1436d8d51cce114be56209924fc71376407e5bad
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
1199 set_callback(&channel->ch_part[PART_ERR].ch_callback,
404de131cff9 commit https://github.com/vim/vim/commit/1436d8d51cce114be56209924fc71376407e5bad
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
1200 &channel->ch_part[PART_ERR].ch_partial,
404de131cff9 commit https://github.com/vim/vim/commit/1436d8d51cce114be56209924fc71376407e5bad
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
1201 opt->jo_err_cb, opt->jo_err_partial);
8210
b717dae2f26d commit https://github.com/vim/vim/commit/4e221c99e85ed40c98892068a01270b9e7492d98
Christian Brabandt <cb@256bit.org>
parents: 8204
diff changeset
1202 if (opt->jo_set & JO_CLOSE_CALLBACK)
9491
404de131cff9 commit https://github.com/vim/vim/commit/1436d8d51cce114be56209924fc71376407e5bad
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
1203 set_callback(&channel->ch_close_cb, &channel->ch_close_partial,
404de131cff9 commit https://github.com/vim/vim/commit/1436d8d51cce114be56209924fc71376407e5bad
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
1204 opt->jo_close_cb, opt->jo_close_partial);
10426
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
1205 channel->ch_drop_never = opt->jo_drop_never;
8267
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
1206
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
1207 if ((opt->jo_set & JO_OUT_IO) && opt->jo_io[PART_OUT] == JIO_BUFFER)
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
1208 {
9087
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1209 buf_T *buf;
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1210
8346
8fa75a4c39bd commit https://github.com/vim/vim/commit/cc7f8be3e0e6c4d902b02052a862e21c3a3fbe22
Christian Brabandt <cb@256bit.org>
parents: 8334
diff changeset
1211 /* writing output to a buffer. Default mode is NL. */
8fa75a4c39bd commit https://github.com/vim/vim/commit/cc7f8be3e0e6c4d902b02052a862e21c3a3fbe22
Christian Brabandt <cb@256bit.org>
parents: 8334
diff changeset
1212 if (!(opt->jo_set & JO_OUT_MODE))
8fa75a4c39bd commit https://github.com/vim/vim/commit/cc7f8be3e0e6c4d902b02052a862e21c3a3fbe22
Christian Brabandt <cb@256bit.org>
parents: 8334
diff changeset
1213 channel->ch_part[PART_OUT].ch_mode = MODE_NL;
8477
c08c6d19db4d commit https://github.com/vim/vim/commit/29fd03878c41526a586d77b3f3cd7938d26297af
Christian Brabandt <cb@256bit.org>
parents: 8473
diff changeset
1214 if (opt->jo_set & JO_OUT_BUF)
9087
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1215 {
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1216 buf = buflist_findnr(opt->jo_io_buf[PART_OUT]);
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1217 if (buf == NULL)
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1218 EMSGN(_(e_nobufnr), (long)opt->jo_io_buf[PART_OUT]);
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1219 }
8477
c08c6d19db4d commit https://github.com/vim/vim/commit/29fd03878c41526a586d77b3f3cd7938d26297af
Christian Brabandt <cb@256bit.org>
parents: 8473
diff changeset
1220 else
9087
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1221 {
10147
65afd399ffa7 commit https://github.com/vim/vim/commit/169ebb080454357279ad5ad21ac532deaec605e8
Christian Brabandt <cb@256bit.org>
parents: 10112
diff changeset
1222 int msg = TRUE;
65afd399ffa7 commit https://github.com/vim/vim/commit/169ebb080454357279ad5ad21ac532deaec605e8
Christian Brabandt <cb@256bit.org>
parents: 10112
diff changeset
1223
65afd399ffa7 commit https://github.com/vim/vim/commit/169ebb080454357279ad5ad21ac532deaec605e8
Christian Brabandt <cb@256bit.org>
parents: 10112
diff changeset
1224 if (opt->jo_set2 & JO2_OUT_MSG)
65afd399ffa7 commit https://github.com/vim/vim/commit/169ebb080454357279ad5ad21ac532deaec605e8
Christian Brabandt <cb@256bit.org>
parents: 10112
diff changeset
1225 msg = opt->jo_message[PART_OUT];
65afd399ffa7 commit https://github.com/vim/vim/commit/169ebb080454357279ad5ad21ac532deaec605e8
Christian Brabandt <cb@256bit.org>
parents: 10112
diff changeset
1226 buf = find_buffer(opt->jo_io_name[PART_OUT], FALSE, msg);
9087
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1227 }
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1228 if (buf != NULL)
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1229 {
9147
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
1230 if (opt->jo_set & JO_OUT_MODIFIABLE)
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
1231 channel->ch_part[PART_OUT].ch_nomodifiable =
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
1232 !opt->jo_modifiable[PART_OUT];
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
1233
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
1234 if (!buf->b_p_ma && !channel->ch_part[PART_OUT].ch_nomodifiable)
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
1235 {
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
1236 EMSG(_(e_modifiable));
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
1237 }
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
1238 else
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
1239 {
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
1240 ch_logs(channel, "writing out to buffer '%s'",
9087
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1241 (char *)buf->b_ffname);
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9434
diff changeset
1242 set_bufref(&channel->ch_part[PART_OUT].ch_bufref, buf);
9147
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
1243 }
9087
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1244 }
8267
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
1245 }
8463
508504ca52ac commit https://github.com/vim/vim/commit/6ff02c96519946716069f05c62849986a706033b
Christian Brabandt <cb@256bit.org>
parents: 8453
diff changeset
1246
508504ca52ac commit https://github.com/vim/vim/commit/6ff02c96519946716069f05c62849986a706033b
Christian Brabandt <cb@256bit.org>
parents: 8453
diff changeset
1247 if ((opt->jo_set & JO_ERR_IO) && (opt->jo_io[PART_ERR] == JIO_BUFFER
508504ca52ac commit https://github.com/vim/vim/commit/6ff02c96519946716069f05c62849986a706033b
Christian Brabandt <cb@256bit.org>
parents: 8453
diff changeset
1248 || (opt->jo_io[PART_ERR] == JIO_OUT && (opt->jo_set & JO_OUT_IO)
508504ca52ac commit https://github.com/vim/vim/commit/6ff02c96519946716069f05c62849986a706033b
Christian Brabandt <cb@256bit.org>
parents: 8453
diff changeset
1249 && opt->jo_io[PART_OUT] == JIO_BUFFER)))
508504ca52ac commit https://github.com/vim/vim/commit/6ff02c96519946716069f05c62849986a706033b
Christian Brabandt <cb@256bit.org>
parents: 8453
diff changeset
1250 {
9087
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1251 buf_T *buf;
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1252
8463
508504ca52ac commit https://github.com/vim/vim/commit/6ff02c96519946716069f05c62849986a706033b
Christian Brabandt <cb@256bit.org>
parents: 8453
diff changeset
1253 /* writing err to a buffer. Default mode is NL. */
508504ca52ac commit https://github.com/vim/vim/commit/6ff02c96519946716069f05c62849986a706033b
Christian Brabandt <cb@256bit.org>
parents: 8453
diff changeset
1254 if (!(opt->jo_set & JO_ERR_MODE))
508504ca52ac commit https://github.com/vim/vim/commit/6ff02c96519946716069f05c62849986a706033b
Christian Brabandt <cb@256bit.org>
parents: 8453
diff changeset
1255 channel->ch_part[PART_ERR].ch_mode = MODE_NL;
508504ca52ac commit https://github.com/vim/vim/commit/6ff02c96519946716069f05c62849986a706033b
Christian Brabandt <cb@256bit.org>
parents: 8453
diff changeset
1256 if (opt->jo_io[PART_ERR] == JIO_OUT)
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9434
diff changeset
1257 buf = channel->ch_part[PART_OUT].ch_bufref.br_buf;
8477
c08c6d19db4d commit https://github.com/vim/vim/commit/29fd03878c41526a586d77b3f3cd7938d26297af
Christian Brabandt <cb@256bit.org>
parents: 8473
diff changeset
1258 else if (opt->jo_set & JO_ERR_BUF)
9087
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1259 {
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1260 buf = buflist_findnr(opt->jo_io_buf[PART_ERR]);
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1261 if (buf == NULL)
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1262 EMSGN(_(e_nobufnr), (long)opt->jo_io_buf[PART_ERR]);
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1263 }
8463
508504ca52ac commit https://github.com/vim/vim/commit/6ff02c96519946716069f05c62849986a706033b
Christian Brabandt <cb@256bit.org>
parents: 8453
diff changeset
1264 else
10147
65afd399ffa7 commit https://github.com/vim/vim/commit/169ebb080454357279ad5ad21ac532deaec605e8
Christian Brabandt <cb@256bit.org>
parents: 10112
diff changeset
1265 {
65afd399ffa7 commit https://github.com/vim/vim/commit/169ebb080454357279ad5ad21ac532deaec605e8
Christian Brabandt <cb@256bit.org>
parents: 10112
diff changeset
1266 int msg = TRUE;
65afd399ffa7 commit https://github.com/vim/vim/commit/169ebb080454357279ad5ad21ac532deaec605e8
Christian Brabandt <cb@256bit.org>
parents: 10112
diff changeset
1267
65afd399ffa7 commit https://github.com/vim/vim/commit/169ebb080454357279ad5ad21ac532deaec605e8
Christian Brabandt <cb@256bit.org>
parents: 10112
diff changeset
1268 if (opt->jo_set2 & JO2_ERR_MSG)
65afd399ffa7 commit https://github.com/vim/vim/commit/169ebb080454357279ad5ad21ac532deaec605e8
Christian Brabandt <cb@256bit.org>
parents: 10112
diff changeset
1269 msg = opt->jo_message[PART_ERR];
65afd399ffa7 commit https://github.com/vim/vim/commit/169ebb080454357279ad5ad21ac532deaec605e8
Christian Brabandt <cb@256bit.org>
parents: 10112
diff changeset
1270 buf = find_buffer(opt->jo_io_name[PART_ERR], TRUE, msg);
65afd399ffa7 commit https://github.com/vim/vim/commit/169ebb080454357279ad5ad21ac532deaec605e8
Christian Brabandt <cb@256bit.org>
parents: 10112
diff changeset
1271 }
9087
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1272 if (buf != NULL)
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1273 {
9147
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
1274 if (opt->jo_set & JO_ERR_MODIFIABLE)
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
1275 channel->ch_part[PART_ERR].ch_nomodifiable =
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
1276 !opt->jo_modifiable[PART_ERR];
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
1277 if (!buf->b_p_ma && !channel->ch_part[PART_ERR].ch_nomodifiable)
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
1278 {
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
1279 EMSG(_(e_modifiable));
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
1280 }
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
1281 else
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
1282 {
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
1283 ch_logs(channel, "writing err to buffer '%s'",
9087
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1284 (char *)buf->b_ffname);
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9434
diff changeset
1285 set_bufref(&channel->ch_part[PART_ERR].ch_bufref, buf);
9147
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
1286 }
9087
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1287 }
8463
508504ca52ac commit https://github.com/vim/vim/commit/6ff02c96519946716069f05c62849986a706033b
Christian Brabandt <cb@256bit.org>
parents: 8453
diff changeset
1288 }
8669
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
1289
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
1290 channel->ch_part[PART_OUT].ch_io = opt->jo_io[PART_OUT];
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
1291 channel->ch_part[PART_ERR].ch_io = opt->jo_io[PART_ERR];
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
1292 channel->ch_part[PART_IN].ch_io = opt->jo_io[PART_IN];
8094
18a3f0f05244 commit https://github.com/vim/vim/commit/910b8aac5dc4693c4508b7acd2cef0bbfac04242
Christian Brabandt <cb@256bit.org>
parents: 8084
diff changeset
1293 }
18a3f0f05244 commit https://github.com/vim/vim/commit/910b8aac5dc4693c4508b7acd2cef0bbfac04242
Christian Brabandt <cb@256bit.org>
parents: 8084
diff changeset
1294
18a3f0f05244 commit https://github.com/vim/vim/commit/910b8aac5dc4693c4508b7acd2cef0bbfac04242
Christian Brabandt <cb@256bit.org>
parents: 8084
diff changeset
1295 /*
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1296 * Set the callback for "channel"/"part" for the response with "id".
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
1297 */
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
1298 void
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1299 channel_set_req_callback(
8538
c337c813c64d commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents: 8508
diff changeset
1300 channel_T *channel,
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
1301 ch_part_T part,
8538
c337c813c64d commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents: 8508
diff changeset
1302 char_u *callback,
c337c813c64d commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents: 8508
diff changeset
1303 partial_T *partial,
c337c813c64d commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents: 8508
diff changeset
1304 int id)
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
1305 {
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1306 cbq_T *head = &channel->ch_part[part].ch_cb_head;
7933
1f0743f4f88f commit https://github.com/vim/vim/commit/a07fec9c85d062acd9dd433a2e681770f459ba47
Christian Brabandt <cb@256bit.org>
parents: 7931
diff changeset
1307 cbq_T *item = (cbq_T *)alloc((int)sizeof(cbq_T));
1f0743f4f88f commit https://github.com/vim/vim/commit/a07fec9c85d062acd9dd433a2e681770f459ba47
Christian Brabandt <cb@256bit.org>
parents: 7931
diff changeset
1308
1f0743f4f88f commit https://github.com/vim/vim/commit/a07fec9c85d062acd9dd433a2e681770f459ba47
Christian Brabandt <cb@256bit.org>
parents: 7931
diff changeset
1309 if (item != NULL)
1f0743f4f88f commit https://github.com/vim/vim/commit/a07fec9c85d062acd9dd433a2e681770f459ba47
Christian Brabandt <cb@256bit.org>
parents: 7931
diff changeset
1310 {
8538
c337c813c64d commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents: 8508
diff changeset
1311 item->cq_partial = partial;
c337c813c64d commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents: 8508
diff changeset
1312 if (partial != NULL)
9711
b74515b8f3d4 commit https://github.com/vim/vim/commit/57e69ff2cca9edee3546373d04e0dde6810309e5
Christian Brabandt <cb@256bit.org>
parents: 9626
diff changeset
1313 {
8538
c337c813c64d commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents: 8508
diff changeset
1314 ++partial->pt_refcount;
9711
b74515b8f3d4 commit https://github.com/vim/vim/commit/57e69ff2cca9edee3546373d04e0dde6810309e5
Christian Brabandt <cb@256bit.org>
parents: 9626
diff changeset
1315 item->cq_callback = callback;
b74515b8f3d4 commit https://github.com/vim/vim/commit/57e69ff2cca9edee3546373d04e0dde6810309e5
Christian Brabandt <cb@256bit.org>
parents: 9626
diff changeset
1316 }
b74515b8f3d4 commit https://github.com/vim/vim/commit/57e69ff2cca9edee3546373d04e0dde6810309e5
Christian Brabandt <cb@256bit.org>
parents: 9626
diff changeset
1317 else
9723
80ac9cf77c9b commit https://github.com/vim/vim/commit/437bafe4c8a83ed71ee006eda7f54b65a90f0d4c
Christian Brabandt <cb@256bit.org>
parents: 9711
diff changeset
1318 {
9711
b74515b8f3d4 commit https://github.com/vim/vim/commit/57e69ff2cca9edee3546373d04e0dde6810309e5
Christian Brabandt <cb@256bit.org>
parents: 9626
diff changeset
1319 item->cq_callback = vim_strsave(callback);
9723
80ac9cf77c9b commit https://github.com/vim/vim/commit/437bafe4c8a83ed71ee006eda7f54b65a90f0d4c
Christian Brabandt <cb@256bit.org>
parents: 9711
diff changeset
1320 func_ref(item->cq_callback);
80ac9cf77c9b commit https://github.com/vim/vim/commit/437bafe4c8a83ed71ee006eda7f54b65a90f0d4c
Christian Brabandt <cb@256bit.org>
parents: 9711
diff changeset
1321 }
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
1322 item->cq_seq_nr = id;
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
1323 item->cq_prev = head->cq_prev;
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
1324 head->cq_prev = item;
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
1325 item->cq_next = NULL;
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
1326 if (item->cq_prev == NULL)
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
1327 head->cq_next = item;
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
1328 else
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
1329 item->cq_prev->cq_next = item;
7933
1f0743f4f88f commit https://github.com/vim/vim/commit/a07fec9c85d062acd9dd433a2e681770f459ba47
Christian Brabandt <cb@256bit.org>
parents: 7931
diff changeset
1330 }
7788
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
1331 }
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
1332
8422
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1333 static void
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1334 write_buf_line(buf_T *buf, linenr_T lnum, channel_T *channel)
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1335 {
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1336 char_u *line = ml_get_buf(buf, lnum, FALSE);
8453
fed4e19bd884 commit https://github.com/vim/vim/commit/367aabdbf76f7df00fd18e39d9378d1360a526ab
Christian Brabandt <cb@256bit.org>
parents: 8428
diff changeset
1337 int len = (int)STRLEN(line);
8422
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1338 char_u *p;
9434
8f904a323b3f commit https://github.com/vim/vim/commit/bf2cc5f36d5ffd5de445e6970602000c7869b65a
Christian Brabandt <cb@256bit.org>
parents: 9367
diff changeset
1339 int i;
8422
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1340
9143
b9c1a397a8a6 commit https://github.com/vim/vim/commit/655da31a18ef3f888acf10e68b438e2a851f7b14
Christian Brabandt <cb@256bit.org>
parents: 9139
diff changeset
1341 /* Need to make a copy to be able to append a NL. */
8422
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1342 if ((p = alloc(len + 2)) == NULL)
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1343 return;
9367
2465b6cda394 commit https://github.com/vim/vim/commit/adb78a77ebb47627bcf73bd16ac1119d970e17c8
Christian Brabandt <cb@256bit.org>
parents: 9355
diff changeset
1344 memcpy((char *)p, (char *)line, len);
9434
8f904a323b3f commit https://github.com/vim/vim/commit/bf2cc5f36d5ffd5de445e6970602000c7869b65a
Christian Brabandt <cb@256bit.org>
parents: 9367
diff changeset
1345
8f904a323b3f commit https://github.com/vim/vim/commit/bf2cc5f36d5ffd5de445e6970602000c7869b65a
Christian Brabandt <cb@256bit.org>
parents: 9367
diff changeset
1346 for (i = 0; i < len; ++i)
8f904a323b3f commit https://github.com/vim/vim/commit/bf2cc5f36d5ffd5de445e6970602000c7869b65a
Christian Brabandt <cb@256bit.org>
parents: 9367
diff changeset
1347 if (p[i] == NL)
8f904a323b3f commit https://github.com/vim/vim/commit/bf2cc5f36d5ffd5de445e6970602000c7869b65a
Christian Brabandt <cb@256bit.org>
parents: 9367
diff changeset
1348 p[i] = NUL;
8f904a323b3f commit https://github.com/vim/vim/commit/bf2cc5f36d5ffd5de445e6970602000c7869b65a
Christian Brabandt <cb@256bit.org>
parents: 9367
diff changeset
1349
8422
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1350 p[len] = NL;
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1351 p[len + 1] = NUL;
10363
471b87c3b67d commit https://github.com/vim/vim/commit/79cbdcb1eeead00bad6fc64ab4a53e5860d5a663
Christian Brabandt <cb@256bit.org>
parents: 10309
diff changeset
1352 channel_send(channel, PART_IN, p, len + 1, "write_buf_line");
8422
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1353 vim_free(p);
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1354 }
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1355
7788
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
1356 /*
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1357 * Return TRUE if "channel" can be written to.
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1358 * Returns FALSE if the input is closed or the write would block.
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1359 */
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1360 static int
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1361 can_write_buf_line(channel_T *channel)
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1362 {
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1363 chanpart_T *in_part = &channel->ch_part[PART_IN];
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1364
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1365 if (in_part->ch_fd == INVALID_FD)
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1366 return FALSE; /* pipe was closed */
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1367
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1368 /* for testing: block every other attempt to write */
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1369 if (in_part->ch_block_write == 1)
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1370 in_part->ch_block_write = -1;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1371 else if (in_part->ch_block_write == -1)
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1372 in_part->ch_block_write = 1;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1373
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1374 /* TODO: Win32 implementation, probably using WaitForMultipleObjects() */
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1375 #ifndef WIN32
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1376 {
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1377 # if defined(HAVE_SELECT)
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1378 struct timeval tval;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1379 fd_set wfds;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1380 int ret;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1381
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1382 FD_ZERO(&wfds);
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1383 FD_SET((int)in_part->ch_fd, &wfds);
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1384 tval.tv_sec = 0;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1385 tval.tv_usec = 0;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1386 for (;;)
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1387 {
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1388 ret = select((int)in_part->ch_fd + 1, NULL, &wfds, NULL, &tval);
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1389 # ifdef EINTR
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1390 SOCK_ERRNO;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1391 if (ret == -1 && errno == EINTR)
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1392 continue;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1393 # endif
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1394 if (ret <= 0 || in_part->ch_block_write == 1)
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1395 {
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1396 if (ret > 0)
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1397 ch_log(channel, "FAKED Input not ready for writing");
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1398 else
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1399 ch_log(channel, "Input not ready for writing");
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1400 return FALSE;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1401 }
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1402 break;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1403 }
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1404 # else
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1405 struct pollfd fds;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1406
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1407 fds.fd = in_part->ch_fd;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1408 fds.events = POLLOUT;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1409 if (poll(&fds, 1, 0) <= 0)
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1410 {
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1411 ch_log(channel, "Input not ready for writing");
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1412 return FALSE;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1413 }
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1414 if (in_part->ch_block_write == 1)
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1415 {
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1416 ch_log(channel, "FAKED Input not ready for writing");
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1417 return FALSE;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1418 }
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1419 # endif
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1420 }
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1421 #endif
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1422 return TRUE;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1423 }
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1424
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1425 /*
8422
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1426 * Write any lines to the input channel.
8386
3b9a306724ec commit https://github.com/vim/vim/commit/014069a7ac51557e531eb3c8b94e36f2193f6c21
Christian Brabandt <cb@256bit.org>
parents: 8382
diff changeset
1427 */
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1428 static void
8386
3b9a306724ec commit https://github.com/vim/vim/commit/014069a7ac51557e531eb3c8b94e36f2193f6c21
Christian Brabandt <cb@256bit.org>
parents: 8382
diff changeset
1429 channel_write_in(channel_T *channel)
3b9a306724ec commit https://github.com/vim/vim/commit/014069a7ac51557e531eb3c8b94e36f2193f6c21
Christian Brabandt <cb@256bit.org>
parents: 8382
diff changeset
1430 {
3b9a306724ec commit https://github.com/vim/vim/commit/014069a7ac51557e531eb3c8b94e36f2193f6c21
Christian Brabandt <cb@256bit.org>
parents: 8382
diff changeset
1431 chanpart_T *in_part = &channel->ch_part[PART_IN];
3b9a306724ec commit https://github.com/vim/vim/commit/014069a7ac51557e531eb3c8b94e36f2193f6c21
Christian Brabandt <cb@256bit.org>
parents: 8382
diff changeset
1432 linenr_T lnum;
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9434
diff changeset
1433 buf_T *buf = in_part->ch_bufref.br_buf;
8422
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1434 int written = 0;
8386
3b9a306724ec commit https://github.com/vim/vim/commit/014069a7ac51557e531eb3c8b94e36f2193f6c21
Christian Brabandt <cb@256bit.org>
parents: 8382
diff changeset
1435
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1436 if (buf == NULL || in_part->ch_buf_append)
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1437 return; /* no buffer or using appending */
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9434
diff changeset
1438 if (!bufref_valid(&in_part->ch_bufref) || buf->b_ml.ml_mfp == NULL)
8386
3b9a306724ec commit https://github.com/vim/vim/commit/014069a7ac51557e531eb3c8b94e36f2193f6c21
Christian Brabandt <cb@256bit.org>
parents: 8382
diff changeset
1439 {
3b9a306724ec commit https://github.com/vim/vim/commit/014069a7ac51557e531eb3c8b94e36f2193f6c21
Christian Brabandt <cb@256bit.org>
parents: 8382
diff changeset
1440 /* buffer was wiped out or unloaded */
11666
5cd9ba96561d patch 8.0.0716: not easy to start Vim cleanly
Christian Brabandt <cb@256bit.org>
parents: 11416
diff changeset
1441 ch_log(channel, "input buffer has been wiped out");
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9434
diff changeset
1442 in_part->ch_bufref.br_buf = NULL;
8386
3b9a306724ec commit https://github.com/vim/vim/commit/014069a7ac51557e531eb3c8b94e36f2193f6c21
Christian Brabandt <cb@256bit.org>
parents: 8382
diff changeset
1443 return;
3b9a306724ec commit https://github.com/vim/vim/commit/014069a7ac51557e531eb3c8b94e36f2193f6c21
Christian Brabandt <cb@256bit.org>
parents: 8382
diff changeset
1444 }
3b9a306724ec commit https://github.com/vim/vim/commit/014069a7ac51557e531eb3c8b94e36f2193f6c21
Christian Brabandt <cb@256bit.org>
parents: 8382
diff changeset
1445
3b9a306724ec commit https://github.com/vim/vim/commit/014069a7ac51557e531eb3c8b94e36f2193f6c21
Christian Brabandt <cb@256bit.org>
parents: 8382
diff changeset
1446 for (lnum = in_part->ch_buf_top; lnum <= in_part->ch_buf_bot
3b9a306724ec commit https://github.com/vim/vim/commit/014069a7ac51557e531eb3c8b94e36f2193f6c21
Christian Brabandt <cb@256bit.org>
parents: 8382
diff changeset
1447 && lnum <= buf->b_ml.ml_line_count; ++lnum)
3b9a306724ec commit https://github.com/vim/vim/commit/014069a7ac51557e531eb3c8b94e36f2193f6c21
Christian Brabandt <cb@256bit.org>
parents: 8382
diff changeset
1448 {
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1449 if (!can_write_buf_line(channel))
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1450 break;
8422
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1451 write_buf_line(buf, lnum, channel);
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1452 ++written;
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1453 }
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1454
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1455 if (written == 1)
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1456 ch_logn(channel, "written line %d to channel", (int)lnum - 1);
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1457 else if (written > 1)
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1458 ch_logn(channel, "written %d lines to channel", written);
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1459
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1460 in_part->ch_buf_top = lnum;
10052
c1ba49441c90 commit https://github.com/vim/vim/commit/d8b554904d18fe19bd9fa79dbda880845cb017d2
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
1461 if (lnum > buf->b_ml.ml_line_count || lnum > in_part->ch_buf_bot)
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1462 {
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1463 /* Writing is done, no longer need the buffer. */
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9434
diff changeset
1464 in_part->ch_bufref.br_buf = NULL;
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1465 ch_log(channel, "Finished writing all lines to channel");
10052
c1ba49441c90 commit https://github.com/vim/vim/commit/d8b554904d18fe19bd9fa79dbda880845cb017d2
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
1466
c1ba49441c90 commit https://github.com/vim/vim/commit/d8b554904d18fe19bd9fa79dbda880845cb017d2
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
1467 /* Close the pipe/socket, so that the other side gets EOF. */
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
1468 ch_close_part(channel, PART_IN);
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1469 }
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1470 else
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1471 ch_logn(channel, "Still %d more lines to write",
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1472 buf->b_ml.ml_line_count - lnum + 1);
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1473 }
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1474
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1475 /*
9355
40c8a8b012b5 commit https://github.com/vim/vim/commit/aad30bbcde2b268e2fffb6fd1443f27ebda9d1ff
Christian Brabandt <cb@256bit.org>
parents: 9282
diff changeset
1476 * Handle buffer "buf" being freed, remove it from any channels.
9087
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1477 */
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1478 void
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1479 channel_buffer_free(buf_T *buf)
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1480 {
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1481 channel_T *channel;
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
1482 ch_part_T part;
9087
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1483
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1484 for (channel = first_channel; channel != NULL; channel = channel->ch_next)
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
1485 for (part = PART_SOCK; part < PART_COUNT; ++part)
9087
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1486 {
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1487 chanpart_T *ch_part = &channel->ch_part[part];
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1488
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9434
diff changeset
1489 if (ch_part->ch_bufref.br_buf == buf)
9089
6bc0a492e8ba commit https://github.com/vim/vim/commit/de7eb0a47b557eb4656c6b63d421c7e7bae1ef30
Christian Brabandt <cb@256bit.org>
parents: 9087
diff changeset
1490 {
6bc0a492e8ba commit https://github.com/vim/vim/commit/de7eb0a47b557eb4656c6b63d421c7e7bae1ef30
Christian Brabandt <cb@256bit.org>
parents: 9087
diff changeset
1491 ch_logs(channel, "%s buffer has been wiped out",
6bc0a492e8ba commit https://github.com/vim/vim/commit/de7eb0a47b557eb4656c6b63d421c7e7bae1ef30
Christian Brabandt <cb@256bit.org>
parents: 9087
diff changeset
1492 part_names[part]);
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9434
diff changeset
1493 ch_part->ch_bufref.br_buf = NULL;
9089
6bc0a492e8ba commit https://github.com/vim/vim/commit/de7eb0a47b557eb4656c6b63d421c7e7bae1ef30
Christian Brabandt <cb@256bit.org>
parents: 9087
diff changeset
1494 }
9087
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1495 }
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1496 }
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1497
d4606ae170aa commit https://github.com/vim/vim/commit/e0f76d00979c972329f6c371463a20da61ccad65
Christian Brabandt <cb@256bit.org>
parents: 9085
diff changeset
1498 /*
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1499 * Write any lines waiting to be written to a channel.
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1500 */
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1501 void
9282
9f97a6290c63 commit https://github.com/vim/vim/commit/cf089463492fab53b2a5d81517829d22f882f82e
Christian Brabandt <cb@256bit.org>
parents: 9246
diff changeset
1502 channel_write_any_lines(void)
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1503 {
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1504 channel_T *channel;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1505
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1506 for (channel = first_channel; channel != NULL; channel = channel->ch_next)
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1507 {
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1508 chanpart_T *in_part = &channel->ch_part[PART_IN];
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1509
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9434
diff changeset
1510 if (in_part->ch_bufref.br_buf != NULL)
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1511 {
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1512 if (in_part->ch_buf_append)
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9434
diff changeset
1513 channel_write_new_lines(in_part->ch_bufref.br_buf);
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1514 else
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1515 channel_write_in(channel);
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1516 }
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1517 }
8422
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1518 }
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1519
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1520 /*
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1521 * Write appended lines above the last one in "buf" to the channel.
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1522 */
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1523 void
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1524 channel_write_new_lines(buf_T *buf)
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1525 {
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1526 channel_T *channel;
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1527 int found_one = FALSE;
8386
3b9a306724ec commit https://github.com/vim/vim/commit/014069a7ac51557e531eb3c8b94e36f2193f6c21
Christian Brabandt <cb@256bit.org>
parents: 8382
diff changeset
1528
8422
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1529 /* There could be more than one channel for the buffer, loop over all of
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1530 * them. */
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1531 for (channel = first_channel; channel != NULL; channel = channel->ch_next)
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1532 {
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1533 chanpart_T *in_part = &channel->ch_part[PART_IN];
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1534 linenr_T lnum;
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1535 int written = 0;
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1536
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9434
diff changeset
1537 if (in_part->ch_bufref.br_buf == buf && in_part->ch_buf_append)
8422
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1538 {
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1539 if (in_part->ch_fd == INVALID_FD)
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1540 continue; /* pipe was closed */
8422
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1541 found_one = TRUE;
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1542 for (lnum = in_part->ch_buf_bot; lnum < buf->b_ml.ml_line_count;
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1543 ++lnum)
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1544 {
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1545 if (!can_write_buf_line(channel))
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1546 break;
8422
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1547 write_buf_line(buf, lnum, channel);
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1548 ++written;
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1549 }
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1550
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1551 if (written == 1)
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1552 ch_logn(channel, "written line %d to channel", (int)lnum - 1);
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1553 else if (written > 1)
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1554 ch_logn(channel, "written %d lines to channel", written);
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1555 if (lnum < buf->b_ml.ml_line_count)
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1556 ch_logn(channel, "Still %d more lines to write",
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
1557 buf->b_ml.ml_line_count - lnum);
8422
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1558
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1559 in_part->ch_buf_bot = lnum;
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1560 }
8386
3b9a306724ec commit https://github.com/vim/vim/commit/014069a7ac51557e531eb3c8b94e36f2193f6c21
Christian Brabandt <cb@256bit.org>
parents: 8382
diff changeset
1561 }
8422
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1562 if (!found_one)
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
1563 buf->b_write_to_channel = FALSE;
8386
3b9a306724ec commit https://github.com/vim/vim/commit/014069a7ac51557e531eb3c8b94e36f2193f6c21
Christian Brabandt <cb@256bit.org>
parents: 8382
diff changeset
1564 }
3b9a306724ec commit https://github.com/vim/vim/commit/014069a7ac51557e531eb3c8b94e36f2193f6c21
Christian Brabandt <cb@256bit.org>
parents: 8382
diff changeset
1565
3b9a306724ec commit https://github.com/vim/vim/commit/014069a7ac51557e531eb3c8b94e36f2193f6c21
Christian Brabandt <cb@256bit.org>
parents: 8382
diff changeset
1566 /*
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
1567 * Invoke the "callback" on channel "channel".
8928
e6916e1683bb commit https://github.com/vim/vim/commit/7f7c3325d3f1baba32263a3457cfc4d90ecd5ff1
Christian Brabandt <cb@256bit.org>
parents: 8881
diff changeset
1568 * This does not redraw but sets channel_need_redraw;
7788
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
1569 */
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
1570 static void
8538
c337c813c64d commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents: 8508
diff changeset
1571 invoke_callback(channel_T *channel, char_u *callback, partial_T *partial,
c337c813c64d commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents: 8508
diff changeset
1572 typval_T *argv)
7788
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
1573 {
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
1574 typval_T rettv;
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
1575 int dummy;
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
1576
9085
d362e6df1deb commit https://github.com/vim/vim/commit/fb6ffc732e65dbc459c89247ff78134402f1a18b
Christian Brabandt <cb@256bit.org>
parents: 9083
diff changeset
1577 if (safe_to_invoke_callback == 0)
10540
ea7fbae33285 patch 8.0.0160: EMSG() is sometimes used where it should be IEMSG()
Christian Brabandt <cb@256bit.org>
parents: 10426
diff changeset
1578 IEMSG("INTERNAL: Invoking callback when it is not safe");
9085
d362e6df1deb commit https://github.com/vim/vim/commit/fb6ffc732e65dbc459c89247ff78134402f1a18b
Christian Brabandt <cb@256bit.org>
parents: 9083
diff changeset
1579
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
1580 argv[0].v_type = VAR_CHANNEL;
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
1581 argv[0].vval.v_channel = channel;
7788
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
1582
9626
172131507c85 commit https://github.com/vim/vim/commit/df48fb456fb6bf63d94cad9b302ff01d8ee8d311
Christian Brabandt <cb@256bit.org>
parents: 9529
diff changeset
1583 call_func(callback, (int)STRLEN(callback), &rettv, 2, argv, NULL,
172131507c85 commit https://github.com/vim/vim/commit/df48fb456fb6bf63d94cad9b302ff01d8ee8d311
Christian Brabandt <cb@256bit.org>
parents: 9529
diff changeset
1584 0L, 0L, &dummy, TRUE, partial, NULL);
8174
f2286ff0c102 commit https://github.com/vim/vim/commit/ee1cffc07a42441924c5353af7fd7ab6e97e5aae
Christian Brabandt <cb@256bit.org>
parents: 8172
diff changeset
1585 clear_tv(&rettv);
8928
e6916e1683bb commit https://github.com/vim/vim/commit/7f7c3325d3f1baba32263a3457cfc4d90ecd5ff1
Christian Brabandt <cb@256bit.org>
parents: 8881
diff changeset
1586 channel_need_redraw = TRUE;
7840
28f569c7dab9 commit https://github.com/vim/vim/commit/20fb9f346497daca4d19402fdfa5de7958642477
Christian Brabandt <cb@256bit.org>
parents: 7817
diff changeset
1587 }
28f569c7dab9 commit https://github.com/vim/vim/commit/20fb9f346497daca4d19402fdfa5de7958642477
Christian Brabandt <cb@256bit.org>
parents: 7817
diff changeset
1588
7864
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
1589 /*
9246
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1590 * Return the first node from "channel"/"part" without removing it.
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1591 * Returns NULL if there is nothing.
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1592 */
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1593 readq_T *
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
1594 channel_peek(channel_T *channel, ch_part_T part)
9246
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1595 {
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1596 readq_T *head = &channel->ch_part[part].ch_head;
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1597
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1598 return head->rq_next;
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1599 }
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1600
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1601 /*
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1602 * Return a pointer to the first NL in "node".
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1603 * Skips over NUL characters.
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1604 * Returns NULL if there is no NL.
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1605 */
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1606 char_u *
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1607 channel_first_nl(readq_T *node)
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1608 {
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1609 char_u *buffer = node->rq_buffer;
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1610 long_u i;
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1611
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1612 for (i = 0; i < node->rq_buflen; ++i)
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1613 if (buffer[i] == NL)
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1614 return buffer + i;
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1615 return NULL;
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1616 }
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1617
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1618 /*
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1619 * Return the first buffer from channel "channel"/"part" and remove it.
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1620 * The caller must free it.
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1621 * Returns NULL if there is nothing.
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1622 */
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1623 char_u *
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
1624 channel_get(channel_T *channel, ch_part_T part)
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1625 {
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1626 readq_T *head = &channel->ch_part[part].ch_head;
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
1627 readq_T *node = head->rq_next;
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1628 char_u *p;
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1629
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
1630 if (node == NULL)
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1631 return NULL;
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1632 /* dispose of the node but keep the buffer */
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
1633 p = node->rq_buffer;
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
1634 head->rq_next = node->rq_next;
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
1635 if (node->rq_next == NULL)
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
1636 head->rq_prev = NULL;
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
1637 else
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
1638 node->rq_next->rq_prev = NULL;
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1639 vim_free(node);
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1640 return p;
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1641 }
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1642
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1643 /*
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1644 * Returns the whole buffer contents concatenated for "channel"/"part".
9246
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1645 * Replaces NUL bytes with NL.
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1646 */
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1647 static char_u *
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
1648 channel_get_all(channel_T *channel, ch_part_T part)
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1649 {
8759
cc2ef7367643 commit https://github.com/vim/vim/commit/ee1f7b3cb71684aaa9bf457e2caf9d02187e6b7c
Christian Brabandt <cb@256bit.org>
parents: 8757
diff changeset
1650 readq_T *head = &channel->ch_part[part].ch_head;
cc2ef7367643 commit https://github.com/vim/vim/commit/ee1f7b3cb71684aaa9bf457e2caf9d02187e6b7c
Christian Brabandt <cb@256bit.org>
parents: 8757
diff changeset
1651 readq_T *node = head->rq_next;
9367
2465b6cda394 commit https://github.com/vim/vim/commit/adb78a77ebb47627bcf73bd16ac1119d970e17c8
Christian Brabandt <cb@256bit.org>
parents: 9355
diff changeset
1652 long_u len = 0;
8759
cc2ef7367643 commit https://github.com/vim/vim/commit/ee1f7b3cb71684aaa9bf457e2caf9d02187e6b7c
Christian Brabandt <cb@256bit.org>
parents: 8757
diff changeset
1653 char_u *res;
cc2ef7367643 commit https://github.com/vim/vim/commit/ee1f7b3cb71684aaa9bf457e2caf9d02187e6b7c
Christian Brabandt <cb@256bit.org>
parents: 8757
diff changeset
1654 char_u *p;
cc2ef7367643 commit https://github.com/vim/vim/commit/ee1f7b3cb71684aaa9bf457e2caf9d02187e6b7c
Christian Brabandt <cb@256bit.org>
parents: 8757
diff changeset
1655
cc2ef7367643 commit https://github.com/vim/vim/commit/ee1f7b3cb71684aaa9bf457e2caf9d02187e6b7c
Christian Brabandt <cb@256bit.org>
parents: 8757
diff changeset
1656 /* If there is only one buffer just get that one. */
cc2ef7367643 commit https://github.com/vim/vim/commit/ee1f7b3cb71684aaa9bf457e2caf9d02187e6b7c
Christian Brabandt <cb@256bit.org>
parents: 8757
diff changeset
1657 if (head->rq_next == NULL || head->rq_next->rq_next == NULL)
cc2ef7367643 commit https://github.com/vim/vim/commit/ee1f7b3cb71684aaa9bf457e2caf9d02187e6b7c
Christian Brabandt <cb@256bit.org>
parents: 8757
diff changeset
1658 return channel_get(channel, part);
cc2ef7367643 commit https://github.com/vim/vim/commit/ee1f7b3cb71684aaa9bf457e2caf9d02187e6b7c
Christian Brabandt <cb@256bit.org>
parents: 8757
diff changeset
1659
cc2ef7367643 commit https://github.com/vim/vim/commit/ee1f7b3cb71684aaa9bf457e2caf9d02187e6b7c
Christian Brabandt <cb@256bit.org>
parents: 8757
diff changeset
1660 /* Concatenate everything into one buffer. */
cc2ef7367643 commit https://github.com/vim/vim/commit/ee1f7b3cb71684aaa9bf457e2caf9d02187e6b7c
Christian Brabandt <cb@256bit.org>
parents: 8757
diff changeset
1661 for (node = head->rq_next; node != NULL; node = node->rq_next)
9215
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1662 len += node->rq_buflen;
9367
2465b6cda394 commit https://github.com/vim/vim/commit/adb78a77ebb47627bcf73bd16ac1119d970e17c8
Christian Brabandt <cb@256bit.org>
parents: 9355
diff changeset
1663 res = lalloc(len + 1, TRUE);
8759
cc2ef7367643 commit https://github.com/vim/vim/commit/ee1f7b3cb71684aaa9bf457e2caf9d02187e6b7c
Christian Brabandt <cb@256bit.org>
parents: 8757
diff changeset
1664 if (res == NULL)
cc2ef7367643 commit https://github.com/vim/vim/commit/ee1f7b3cb71684aaa9bf457e2caf9d02187e6b7c
Christian Brabandt <cb@256bit.org>
parents: 8757
diff changeset
1665 return NULL;
9215
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1666 p = res;
8759
cc2ef7367643 commit https://github.com/vim/vim/commit/ee1f7b3cb71684aaa9bf457e2caf9d02187e6b7c
Christian Brabandt <cb@256bit.org>
parents: 8757
diff changeset
1667 for (node = head->rq_next; node != NULL; node = node->rq_next)
9215
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1668 {
9246
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1669 mch_memmove(p, node->rq_buffer, node->rq_buflen);
9215
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1670 p += node->rq_buflen;
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1671 }
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1672 *p = NUL;
8759
cc2ef7367643 commit https://github.com/vim/vim/commit/ee1f7b3cb71684aaa9bf457e2caf9d02187e6b7c
Christian Brabandt <cb@256bit.org>
parents: 8757
diff changeset
1673
cc2ef7367643 commit https://github.com/vim/vim/commit/ee1f7b3cb71684aaa9bf457e2caf9d02187e6b7c
Christian Brabandt <cb@256bit.org>
parents: 8757
diff changeset
1674 /* Free all buffers */
cc2ef7367643 commit https://github.com/vim/vim/commit/ee1f7b3cb71684aaa9bf457e2caf9d02187e6b7c
Christian Brabandt <cb@256bit.org>
parents: 8757
diff changeset
1675 do
cc2ef7367643 commit https://github.com/vim/vim/commit/ee1f7b3cb71684aaa9bf457e2caf9d02187e6b7c
Christian Brabandt <cb@256bit.org>
parents: 8757
diff changeset
1676 {
cc2ef7367643 commit https://github.com/vim/vim/commit/ee1f7b3cb71684aaa9bf457e2caf9d02187e6b7c
Christian Brabandt <cb@256bit.org>
parents: 8757
diff changeset
1677 p = channel_get(channel, part);
cc2ef7367643 commit https://github.com/vim/vim/commit/ee1f7b3cb71684aaa9bf457e2caf9d02187e6b7c
Christian Brabandt <cb@256bit.org>
parents: 8757
diff changeset
1678 vim_free(p);
cc2ef7367643 commit https://github.com/vim/vim/commit/ee1f7b3cb71684aaa9bf457e2caf9d02187e6b7c
Christian Brabandt <cb@256bit.org>
parents: 8757
diff changeset
1679 } while (p != NULL);
cc2ef7367643 commit https://github.com/vim/vim/commit/ee1f7b3cb71684aaa9bf457e2caf9d02187e6b7c
Christian Brabandt <cb@256bit.org>
parents: 8757
diff changeset
1680
9246
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1681 /* turn all NUL into NL */
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1682 while (len > 0)
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1683 {
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1684 --len;
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1685 if (res[len] == NUL)
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1686 res[len] = NL;
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1687 }
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1688
8759
cc2ef7367643 commit https://github.com/vim/vim/commit/ee1f7b3cb71684aaa9bf457e2caf9d02187e6b7c
Christian Brabandt <cb@256bit.org>
parents: 8757
diff changeset
1689 return res;
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1690 }
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1691
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1692 /*
9282
9f97a6290c63 commit https://github.com/vim/vim/commit/cf089463492fab53b2a5d81517829d22f882f82e
Christian Brabandt <cb@256bit.org>
parents: 9246
diff changeset
1693 * Consume "len" bytes from the head of "node".
9246
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1694 * Caller must check these bytes are available.
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1695 */
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1696 void
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
1697 channel_consume(channel_T *channel, ch_part_T part, int len)
9246
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1698 {
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1699 readq_T *head = &channel->ch_part[part].ch_head;
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1700 readq_T *node = head->rq_next;
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1701 char_u *buf = node->rq_buffer;
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1702
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1703 mch_memmove(buf, buf + len, node->rq_buflen - len);
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1704 node->rq_buflen -= len;
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1705 }
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1706
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1707 /*
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1708 * Collapses the first and second buffer for "channel"/"part".
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1709 * Returns FAIL if that is not possible.
9215
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1710 * When "want_nl" is TRUE collapse more buffers until a NL is found.
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1711 */
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1712 int
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
1713 channel_collapse(channel_T *channel, ch_part_T part, int want_nl)
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1714 {
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1715 readq_T *head = &channel->ch_part[part].ch_head;
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
1716 readq_T *node = head->rq_next;
9215
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1717 readq_T *last_node;
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1718 readq_T *n;
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1719 char_u *newbuf;
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1720 char_u *p;
9215
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1721 long_u len;
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1722
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
1723 if (node == NULL || node->rq_next == NULL)
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1724 return FAIL;
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1725
9215
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1726 last_node = node->rq_next;
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1727 len = node->rq_buflen + last_node->rq_buflen + 1;
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1728 if (want_nl)
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1729 while (last_node->rq_next != NULL
9246
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1730 && channel_first_nl(last_node) == NULL)
9215
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1731 {
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1732 last_node = last_node->rq_next;
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1733 len += last_node->rq_buflen;
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1734 }
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1735
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1736 p = newbuf = alloc(len);
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1737 if (newbuf == NULL)
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1738 return FAIL; /* out of memory */
9246
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1739 mch_memmove(p, node->rq_buffer, node->rq_buflen);
9215
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1740 p += node->rq_buflen;
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
1741 vim_free(node->rq_buffer);
9215
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1742 node->rq_buffer = newbuf;
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1743 for (n = node; n != last_node; )
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1744 {
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1745 n = n->rq_next;
9246
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1746 mch_memmove(p, n->rq_buffer, n->rq_buflen);
9215
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1747 p += n->rq_buflen;
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1748 vim_free(n->rq_buffer);
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1749 }
9238
7d13d180a6ae commit https://github.com/vim/vim/commit/bbe8d91e695184771d7e45315258fab8eb3e6b07
Christian Brabandt <cb@256bit.org>
parents: 9215
diff changeset
1750 node->rq_buflen = (long_u)(p - newbuf);
9215
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1751
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1752 /* dispose of the collapsed nodes and their buffers */
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1753 for (n = node->rq_next; n != last_node; )
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1754 {
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1755 n = n->rq_next;
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1756 vim_free(n->rq_prev);
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1757 }
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1758 node->rq_next = last_node->rq_next;
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1759 if (last_node->rq_next == NULL)
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1760 head->rq_prev = node;
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1761 else
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1762 last_node->rq_next->rq_prev = node;
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1763 vim_free(last_node);
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1764 return OK;
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1765 }
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1766
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1767 /*
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1768 * Store "buf[len]" on "channel"/"part".
8755
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1769 * When "prepend" is TRUE put in front, otherwise append at the end.
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1770 * Returns OK or FAIL.
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1771 */
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1772 static int
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
1773 channel_save(channel_T *channel, ch_part_T part, char_u *buf, int len,
8755
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1774 int prepend, char *lead)
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1775 {
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1776 readq_T *node;
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1777 readq_T *head = &channel->ch_part[part].ch_head;
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1778 char_u *p;
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1779 int i;
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1780
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1781 node = (readq_T *)alloc(sizeof(readq_T));
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1782 if (node == NULL)
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1783 return FAIL; /* out of memory */
9246
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1784 /* A NUL is added at the end, because netbeans code expects that.
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
1785 * Otherwise a NUL may appear inside the text. */
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1786 node->rq_buffer = alloc(len + 1);
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1787 if (node->rq_buffer == NULL)
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1788 {
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1789 vim_free(node);
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1790 return FAIL; /* out of memory */
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1791 }
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1792
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1793 if (channel->ch_part[part].ch_mode == MODE_NL)
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1794 {
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1795 /* Drop any CR before a NL. */
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1796 p = node->rq_buffer;
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1797 for (i = 0; i < len; ++i)
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1798 if (buf[i] != CAR || i + 1 >= len || buf[i + 1] != NL)
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1799 *p++ = buf[i];
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1800 *p = NUL;
9215
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1801 node->rq_buflen = (long_u)(p - node->rq_buffer);
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1802 }
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1803 else
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1804 {
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1805 mch_memmove(node->rq_buffer, buf, len);
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1806 node->rq_buffer[len] = NUL;
9215
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
1807 node->rq_buflen = (long_u)len;
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1808 }
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1809
8755
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1810 if (prepend)
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1811 {
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1812 /* preend node to the head of the queue */
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1813 node->rq_next = head->rq_next;
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1814 node->rq_prev = NULL;
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1815 if (head->rq_next == NULL)
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1816 head->rq_prev = node;
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1817 else
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1818 head->rq_next->rq_prev = node;
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1819 head->rq_next = node;
8755
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1820 }
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1821 else
8755
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1822 {
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1823 /* append node to the tail of the queue */
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1824 node->rq_next = NULL;
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1825 node->rq_prev = head->rq_prev;
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1826 if (head->rq_prev == NULL)
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1827 head->rq_next = node;
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1828 else
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1829 head->rq_prev->rq_next = node;
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1830 head->rq_prev = node;
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1831 }
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1832
8655
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1833 if (log_fd != NULL && lead != NULL)
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1834 {
8655
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1835 ch_log_lead(lead, channel);
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1836 fprintf(log_fd, "'");
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1837 if (fwrite(buf, len, 1, log_fd) != 1)
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1838 return FAIL;
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1839 fprintf(log_fd, "'\n");
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1840 }
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1841 return OK;
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1842 }
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1843
10845
c31782d57569 patch 8.0.0312: failure when a channel receives a split json message
Christian Brabandt <cb@256bit.org>
parents: 10587
diff changeset
1844 /*
c31782d57569 patch 8.0.0312: failure when a channel receives a split json message
Christian Brabandt <cb@256bit.org>
parents: 10587
diff changeset
1845 * Try to fill the buffer of "reader".
c31782d57569 patch 8.0.0312: failure when a channel receives a split json message
Christian Brabandt <cb@256bit.org>
parents: 10587
diff changeset
1846 * Returns FALSE when nothing was added.
c31782d57569 patch 8.0.0312: failure when a channel receives a split json message
Christian Brabandt <cb@256bit.org>
parents: 10587
diff changeset
1847 */
8755
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1848 static int
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1849 channel_fill(js_read_T *reader)
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1850 {
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1851 channel_T *channel = (channel_T *)reader->js_cookie;
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
1852 ch_part_T part = reader->js_cookie_arg;
8755
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1853 char_u *next = channel_get(channel, part);
10845
c31782d57569 patch 8.0.0312: failure when a channel receives a split json message
Christian Brabandt <cb@256bit.org>
parents: 10587
diff changeset
1854 int keeplen;
c31782d57569 patch 8.0.0312: failure when a channel receives a split json message
Christian Brabandt <cb@256bit.org>
parents: 10587
diff changeset
1855 int addlen;
8755
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1856 char_u *p;
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1857
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1858 if (next == NULL)
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1859 return FALSE;
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1860
10845
c31782d57569 patch 8.0.0312: failure when a channel receives a split json message
Christian Brabandt <cb@256bit.org>
parents: 10587
diff changeset
1861 keeplen = reader->js_end - reader->js_buf;
c31782d57569 patch 8.0.0312: failure when a channel receives a split json message
Christian Brabandt <cb@256bit.org>
parents: 10587
diff changeset
1862 if (keeplen > 0)
8755
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1863 {
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1864 /* Prepend unused text. */
10845
c31782d57569 patch 8.0.0312: failure when a channel receives a split json message
Christian Brabandt <cb@256bit.org>
parents: 10587
diff changeset
1865 addlen = (int)STRLEN(next);
c31782d57569 patch 8.0.0312: failure when a channel receives a split json message
Christian Brabandt <cb@256bit.org>
parents: 10587
diff changeset
1866 p = alloc(keeplen + addlen + 1);
8755
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1867 if (p == NULL)
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1868 {
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1869 vim_free(next);
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1870 return FALSE;
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1871 }
10845
c31782d57569 patch 8.0.0312: failure when a channel receives a split json message
Christian Brabandt <cb@256bit.org>
parents: 10587
diff changeset
1872 mch_memmove(p, reader->js_buf, keeplen);
c31782d57569 patch 8.0.0312: failure when a channel receives a split json message
Christian Brabandt <cb@256bit.org>
parents: 10587
diff changeset
1873 mch_memmove(p + keeplen, next, addlen + 1);
8755
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1874 vim_free(next);
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1875 next = p;
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1876 }
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1877
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1878 vim_free(reader->js_buf);
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1879 reader->js_buf = next;
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1880 return TRUE;
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1881 }
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1882
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1883 /*
8655
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1884 * Use the read buffer of "channel"/"part" and parse a JSON message that is
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1885 * complete. The messages are added to the queue.
7899
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
1886 * Return TRUE if there is more to read.
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1887 */
7899
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
1888 static int
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
1889 channel_parse_json(channel_T *channel, ch_part_T part)
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1890 {
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1891 js_read_T reader;
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1892 typval_T listtv;
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1893 jsonq_T *item;
8655
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1894 chanpart_T *chanpart = &channel->ch_part[part];
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1895 jsonq_T *head = &chanpart->ch_json_head;
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1896 int status;
7899
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
1897 int ret;
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1898
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
1899 if (channel_peek(channel, part) == NULL)
7899
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
1900 return FALSE;
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1901
8755
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1902 reader.js_buf = channel_get(channel, part);
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1903 reader.js_used = 0;
8755
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1904 reader.js_fill = channel_fill;
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
1905 reader.js_cookie = channel;
8755
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1906 reader.js_cookie_arg = part;
8655
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1907
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1908 /* When a message is incomplete we wait for a short while for more to
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1909 * arrive. After the delay drop the input, otherwise a truncated string
10553
f83b6a0b6148 patch 8.0.0166: JSON with a duplicate key gives an internal error
Christian Brabandt <cb@256bit.org>
parents: 10540
diff changeset
1910 * or list will make us hang.
f83b6a0b6148 patch 8.0.0166: JSON with a duplicate key gives an internal error
Christian Brabandt <cb@256bit.org>
parents: 10540
diff changeset
1911 * Do not generate error messages, they will be written in a channel log. */
f83b6a0b6148 patch 8.0.0166: JSON with a duplicate key gives an internal error
Christian Brabandt <cb@256bit.org>
parents: 10540
diff changeset
1912 ++emsg_silent;
8655
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1913 status = json_decode(&reader, &listtv,
8755
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
1914 chanpart->ch_mode == MODE_JS ? JSON_JS : 0);
10553
f83b6a0b6148 patch 8.0.0166: JSON with a duplicate key gives an internal error
Christian Brabandt <cb@256bit.org>
parents: 10540
diff changeset
1915 --emsg_silent;
8655
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1916 if (status == OK)
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1917 {
7937
2e905dfc6999 commit https://github.com/vim/vim/commit/6076fe1986255d32b7a078a28bf9e7bea19d6f30
Christian Brabandt <cb@256bit.org>
parents: 7935
diff changeset
1918 /* Only accept the response when it is a list with at least two
2e905dfc6999 commit https://github.com/vim/vim/commit/6076fe1986255d32b7a078a28bf9e7bea19d6f30
Christian Brabandt <cb@256bit.org>
parents: 7935
diff changeset
1919 * items. */
2e905dfc6999 commit https://github.com/vim/vim/commit/6076fe1986255d32b7a078a28bf9e7bea19d6f30
Christian Brabandt <cb@256bit.org>
parents: 7935
diff changeset
1920 if (listtv.v_type != VAR_LIST || listtv.vval.v_list->lv_len < 2)
7899
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
1921 {
8655
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1922 if (listtv.v_type != VAR_LIST)
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1923 ch_error(channel, "Did not receive a list, discarding");
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1924 else
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1925 ch_errorn(channel, "Expected list with two items, got %d",
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1926 listtv.vval.v_list->lv_len);
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1927 clear_tv(&listtv);
7899
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
1928 }
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1929 else
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1930 {
7899
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
1931 item = (jsonq_T *)alloc((unsigned)sizeof(jsonq_T));
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
1932 if (item == NULL)
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1933 clear_tv(&listtv);
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1934 else
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1935 {
10426
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
1936 item->jq_no_callback = FALSE;
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
1937 item->jq_value = alloc_tv();
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
1938 if (item->jq_value == NULL)
7899
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
1939 {
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
1940 vim_free(item);
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
1941 clear_tv(&listtv);
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
1942 }
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
1943 else
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
1944 {
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
1945 *item->jq_value = listtv;
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
1946 item->jq_prev = head->jq_prev;
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
1947 head->jq_prev = item;
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
1948 item->jq_next = NULL;
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
1949 if (item->jq_prev == NULL)
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
1950 head->jq_next = item;
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
1951 else
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
1952 item->jq_prev->jq_next = item;
7899
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
1953 }
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1954 }
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1955 }
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
1956 }
7885
6e6f829af138 commit https://github.com/vim/vim/commit/df5b27b20ec023274fb0f5347973d5abcde7ddd6
Christian Brabandt <cb@256bit.org>
parents: 7883
diff changeset
1957
8655
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1958 if (status == OK)
10845
c31782d57569 patch 8.0.0312: failure when a channel receives a split json message
Christian Brabandt <cb@256bit.org>
parents: 10587
diff changeset
1959 chanpart->ch_wait_len = 0;
8655
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1960 else if (status == MAYBE)
7899
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
1961 {
10845
c31782d57569 patch 8.0.0312: failure when a channel receives a split json message
Christian Brabandt <cb@256bit.org>
parents: 10587
diff changeset
1962 size_t buflen = STRLEN(reader.js_buf);
c31782d57569 patch 8.0.0312: failure when a channel receives a split json message
Christian Brabandt <cb@256bit.org>
parents: 10587
diff changeset
1963
c31782d57569 patch 8.0.0312: failure when a channel receives a split json message
Christian Brabandt <cb@256bit.org>
parents: 10587
diff changeset
1964 if (chanpart->ch_wait_len < buflen)
8653
d80edead9675 commit https://github.com/vim/vim/commit/ac74d5e86cd16b42e81ba48f58f3d45c72758248
Christian Brabandt <cb@256bit.org>
parents: 8607
diff changeset
1965 {
10845
c31782d57569 patch 8.0.0312: failure when a channel receives a split json message
Christian Brabandt <cb@256bit.org>
parents: 10587
diff changeset
1966 /* First time encountering incomplete message or after receiving
c31782d57569 patch 8.0.0312: failure when a channel receives a split json message
Christian Brabandt <cb@256bit.org>
parents: 10587
diff changeset
1967 * more (but still incomplete): set a deadline of 100 msec. */
c31782d57569 patch 8.0.0312: failure when a channel receives a split json message
Christian Brabandt <cb@256bit.org>
parents: 10587
diff changeset
1968 ch_logn(channel,
c31782d57569 patch 8.0.0312: failure when a channel receives a split json message
Christian Brabandt <cb@256bit.org>
parents: 10587
diff changeset
1969 "Incomplete message (%d bytes) - wait 100 msec for more",
10996
2f041b367cd9 patch 8.0.0387: compiler warnings
Christian Brabandt <cb@256bit.org>
parents: 10845
diff changeset
1970 (int)buflen);
8655
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1971 reader.js_used = 0;
10845
c31782d57569 patch 8.0.0312: failure when a channel receives a split json message
Christian Brabandt <cb@256bit.org>
parents: 10587
diff changeset
1972 chanpart->ch_wait_len = buflen;
8655
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1973 #ifdef WIN32
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1974 chanpart->ch_deadline = GetTickCount() + 100L;
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1975 #else
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1976 gettimeofday(&chanpart->ch_deadline, NULL);
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1977 chanpart->ch_deadline.tv_usec += 100 * 1000;
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1978 if (chanpart->ch_deadline.tv_usec > 1000 * 1000)
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1979 {
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1980 chanpart->ch_deadline.tv_usec -= 1000 * 1000;
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1981 ++chanpart->ch_deadline.tv_sec;
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1982 }
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1983 #endif
8653
d80edead9675 commit https://github.com/vim/vim/commit/ac74d5e86cd16b42e81ba48f58f3d45c72758248
Christian Brabandt <cb@256bit.org>
parents: 8607
diff changeset
1984 }
d80edead9675 commit https://github.com/vim/vim/commit/ac74d5e86cd16b42e81ba48f58f3d45c72758248
Christian Brabandt <cb@256bit.org>
parents: 8607
diff changeset
1985 else
d80edead9675 commit https://github.com/vim/vim/commit/ac74d5e86cd16b42e81ba48f58f3d45c72758248
Christian Brabandt <cb@256bit.org>
parents: 8607
diff changeset
1986 {
8655
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1987 int timeout;
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1988 #ifdef WIN32
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1989 timeout = GetTickCount() > chanpart->ch_deadline;
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1990 #else
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1991 {
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1992 struct timeval now_tv;
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1993
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1994 gettimeofday(&now_tv, NULL);
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1995 timeout = now_tv.tv_sec > chanpart->ch_deadline.tv_sec
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1996 || (now_tv.tv_sec == chanpart->ch_deadline.tv_sec
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1997 && now_tv.tv_usec > chanpart->ch_deadline.tv_usec);
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1998 }
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
1999 #endif
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
2000 if (timeout)
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
2001 {
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
2002 status = FAIL;
10845
c31782d57569 patch 8.0.0312: failure when a channel receives a split json message
Christian Brabandt <cb@256bit.org>
parents: 10587
diff changeset
2003 chanpart->ch_wait_len = 0;
c31782d57569 patch 8.0.0312: failure when a channel receives a split json message
Christian Brabandt <cb@256bit.org>
parents: 10587
diff changeset
2004 ch_log(channel, "timed out");
8655
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
2005 }
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
2006 else
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
2007 {
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
2008 reader.js_used = 0;
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
2009 ch_log(channel, "still waiting on incomplete message");
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
2010 }
8653
d80edead9675 commit https://github.com/vim/vim/commit/ac74d5e86cd16b42e81ba48f58f3d45c72758248
Christian Brabandt <cb@256bit.org>
parents: 8607
diff changeset
2011 }
7899
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
2012 }
8655
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
2013
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
2014 if (status == FAIL)
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
2015 {
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
2016 ch_error(channel, "Decoding failed - discarding input");
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
2017 ret = FALSE;
10845
c31782d57569 patch 8.0.0312: failure when a channel receives a split json message
Christian Brabandt <cb@256bit.org>
parents: 10587
diff changeset
2018 chanpart->ch_wait_len = 0;
8655
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
2019 }
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
2020 else if (reader.js_buf[reader.js_used] != NUL)
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
2021 {
8755
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
2022 /* Put the unread part back into the channel. */
8655
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
2023 channel_save(channel, part, reader.js_buf + reader.js_used,
8755
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
2024 (int)(reader.js_end - reader.js_buf) - reader.js_used,
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
2025 TRUE, NULL);
8655
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
2026 ret = status == MAYBE ? FALSE: TRUE;
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
2027 }
7899
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
2028 else
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
2029 ret = FALSE;
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
2030
7885
6e6f829af138 commit https://github.com/vim/vim/commit/df5b27b20ec023274fb0f5347973d5abcde7ddd6
Christian Brabandt <cb@256bit.org>
parents: 7883
diff changeset
2031 vim_free(reader.js_buf);
7899
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
2032 return ret;
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2033 }
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2034
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2035 /*
8074
dc32c8026899 commit https://github.com/vim/vim/commit/d46ae142aa9452e99576b5e923de974704e3c896
Christian Brabandt <cb@256bit.org>
parents: 8072
diff changeset
2036 * Remove "node" from the queue that it is in. Does not free it.
7933
1f0743f4f88f commit https://github.com/vim/vim/commit/a07fec9c85d062acd9dd433a2e681770f459ba47
Christian Brabandt <cb@256bit.org>
parents: 7931
diff changeset
2037 */
1f0743f4f88f commit https://github.com/vim/vim/commit/a07fec9c85d062acd9dd433a2e681770f459ba47
Christian Brabandt <cb@256bit.org>
parents: 7931
diff changeset
2038 static void
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2039 remove_cb_node(cbq_T *head, cbq_T *node)
7933
1f0743f4f88f commit https://github.com/vim/vim/commit/a07fec9c85d062acd9dd433a2e681770f459ba47
Christian Brabandt <cb@256bit.org>
parents: 7931
diff changeset
2040 {
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2041 if (node->cq_prev == NULL)
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2042 head->cq_next = node->cq_next;
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2043 else
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2044 node->cq_prev->cq_next = node->cq_next;
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2045 if (node->cq_next == NULL)
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2046 head->cq_prev = node->cq_prev;
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2047 else
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2048 node->cq_next->cq_prev = node->cq_prev;
7933
1f0743f4f88f commit https://github.com/vim/vim/commit/a07fec9c85d062acd9dd433a2e681770f459ba47
Christian Brabandt <cb@256bit.org>
parents: 7931
diff changeset
2049 }
1f0743f4f88f commit https://github.com/vim/vim/commit/a07fec9c85d062acd9dd433a2e681770f459ba47
Christian Brabandt <cb@256bit.org>
parents: 7931
diff changeset
2050
1f0743f4f88f commit https://github.com/vim/vim/commit/a07fec9c85d062acd9dd433a2e681770f459ba47
Christian Brabandt <cb@256bit.org>
parents: 7931
diff changeset
2051 /*
1f0743f4f88f commit https://github.com/vim/vim/commit/a07fec9c85d062acd9dd433a2e681770f459ba47
Christian Brabandt <cb@256bit.org>
parents: 7931
diff changeset
2052 * Remove "node" from the queue that it is in and free it.
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2053 * Caller should have freed or used node->jq_value.
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2054 */
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2055 static void
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2056 remove_json_node(jsonq_T *head, jsonq_T *node)
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2057 {
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2058 if (node->jq_prev == NULL)
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2059 head->jq_next = node->jq_next;
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2060 else
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2061 node->jq_prev->jq_next = node->jq_next;
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2062 if (node->jq_next == NULL)
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2063 head->jq_prev = node->jq_prev;
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2064 else
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2065 node->jq_next->jq_prev = node->jq_prev;
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2066 vim_free(node);
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2067 }
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2068
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2069 /*
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2070 * Get a message from the JSON queue for channel "channel".
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2071 * When "id" is positive it must match the first number in the list.
7997
c1c9ab17e197 commit https://github.com/vim/vim/commit/e56bf15c163a921ce9e1c09c0d5b3a03efc63324
Christian Brabandt <cb@256bit.org>
parents: 7988
diff changeset
2072 * When "id" is zero or negative jut get the first message. But not the one
c1c9ab17e197 commit https://github.com/vim/vim/commit/e56bf15c163a921ce9e1c09c0d5b3a03efc63324
Christian Brabandt <cb@256bit.org>
parents: 7988
diff changeset
2073 * with id ch_block_id.
10426
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2074 * When "without_callback" is TRUE also get messages that were pushed back.
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2075 * Return OK when found and return the value in "rettv".
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2076 * Return FAIL otherwise.
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2077 */
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2078 static int
10426
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2079 channel_get_json(
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2080 channel_T *channel,
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2081 ch_part_T part,
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2082 int id,
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2083 int without_callback,
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2084 typval_T **rettv)
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2085 {
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
2086 jsonq_T *head = &channel->ch_part[part].ch_json_head;
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2087 jsonq_T *item = head->jq_next;
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2088
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2089 while (item != NULL)
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2090 {
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2091 list_T *l = item->jq_value->vval.v_list;
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2092 typval_T *tv = &l->lv_first->li_tv;
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2093
10426
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2094 if ((without_callback || !item->jq_no_callback)
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2095 && ((id > 0 && tv->v_type == VAR_NUMBER && tv->vval.v_number == id)
7997
c1c9ab17e197 commit https://github.com/vim/vim/commit/e56bf15c163a921ce9e1c09c0d5b3a03efc63324
Christian Brabandt <cb@256bit.org>
parents: 7988
diff changeset
2096 || (id <= 0 && (tv->v_type != VAR_NUMBER
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
2097 || tv->vval.v_number == 0
10426
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2098 || tv->vval.v_number != channel->ch_part[part].ch_block_id))))
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2099 {
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2100 *rettv = item->jq_value;
8655
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
2101 if (tv->v_type == VAR_NUMBER)
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
2102 ch_logn(channel, "Getting JSON message %d", tv->vval.v_number);
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2103 remove_json_node(head, item);
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2104 return OK;
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2105 }
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2106 item = item->jq_next;
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2107 }
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2108 return FAIL;
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2109 }
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2110
10426
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2111 /*
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2112 * Put back "rettv" into the JSON queue, there was no callback for it.
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2113 * Takes over the values in "rettv".
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2114 */
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2115 static void
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2116 channel_push_json(channel_T *channel, ch_part_T part, typval_T *rettv)
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2117 {
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2118 jsonq_T *head = &channel->ch_part[part].ch_json_head;
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2119 jsonq_T *item = head->jq_next;
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2120 jsonq_T *newitem;
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2121
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2122 if (head->jq_prev != NULL && head->jq_prev->jq_no_callback)
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2123 /* last item was pushed back, append to the end */
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2124 item = NULL;
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2125 else while (item != NULL && item->jq_no_callback)
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2126 /* append after the last item that was pushed back */
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2127 item = item->jq_next;
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2128
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2129 newitem = (jsonq_T *)alloc((unsigned)sizeof(jsonq_T));
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2130 if (newitem == NULL)
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2131 clear_tv(rettv);
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2132 else
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2133 {
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2134 newitem->jq_value = alloc_tv();
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2135 if (newitem->jq_value == NULL)
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2136 {
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2137 vim_free(newitem);
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2138 clear_tv(rettv);
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2139 }
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2140 else
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2141 {
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2142 newitem->jq_no_callback = FALSE;
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2143 *newitem->jq_value = *rettv;
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2144 if (item == NULL)
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2145 {
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2146 /* append to the end */
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2147 newitem->jq_prev = head->jq_prev;
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2148 head->jq_prev = newitem;
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2149 newitem->jq_next = NULL;
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2150 if (newitem->jq_prev == NULL)
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2151 head->jq_next = newitem;
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2152 else
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2153 newitem->jq_prev->jq_next = newitem;
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2154 }
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2155 else
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2156 {
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2157 /* append after "item" */
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2158 newitem->jq_prev = item;
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2159 newitem->jq_next = item->jq_next;
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2160 item->jq_next = newitem;
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2161 if (newitem->jq_next == NULL)
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2162 head->jq_prev = newitem;
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2163 else
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2164 newitem->jq_next->jq_prev = newitem;
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2165 }
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2166 }
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2167 }
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2168 }
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2169
8159
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2170 #define CH_JSON_MAX_ARGS 4
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2171
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2172 /*
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
2173 * Execute a command received over "channel"/"part"
8159
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2174 * "argv[0]" is the command string.
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2175 * "argv[1]" etc. have further arguments, type is VAR_UNKNOWN if missing.
7864
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2176 */
7840
28f569c7dab9 commit https://github.com/vim/vim/commit/20fb9f346497daca4d19402fdfa5de7958642477
Christian Brabandt <cb@256bit.org>
parents: 7817
diff changeset
2177 static void
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
2178 channel_exe_cmd(channel_T *channel, ch_part_T part, typval_T *argv)
7840
28f569c7dab9 commit https://github.com/vim/vim/commit/20fb9f346497daca4d19402fdfa5de7958642477
Christian Brabandt <cb@256bit.org>
parents: 7817
diff changeset
2179 {
8159
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2180 char_u *cmd = argv[0].vval.v_string;
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2181 char_u *arg;
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2182 int options = channel->ch_part[part].ch_mode == MODE_JS ? JSON_JS : 0;
7864
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2183
8159
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2184 if (argv[1].v_type != VAR_STRING)
7864
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2185 {
8159
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2186 ch_error(channel, "received command with non-string argument");
7864
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2187 if (p_verbose > 2)
9953
9560a2eb7968 commit https://github.com/vim/vim/commit/5b30291785e6b9be1a607504c14bd03c601b59a6
Christian Brabandt <cb@256bit.org>
parents: 9723
diff changeset
2188 EMSG(_("E903: received command with non-string argument"));
7864
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2189 return;
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2190 }
8159
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2191 arg = argv[1].vval.v_string;
7872
4b9d4600166f commit https://github.com/vim/vim/commit/14ad611ca435d97e8fd0d9ab03ddc982843298ac
Christian Brabandt <cb@256bit.org>
parents: 7868
diff changeset
2192 if (arg == NULL)
4b9d4600166f commit https://github.com/vim/vim/commit/14ad611ca435d97e8fd0d9ab03ddc982843298ac
Christian Brabandt <cb@256bit.org>
parents: 7868
diff changeset
2193 arg = (char_u *)"";
7864
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2194
7840
28f569c7dab9 commit https://github.com/vim/vim/commit/20fb9f346497daca4d19402fdfa5de7958642477
Christian Brabandt <cb@256bit.org>
parents: 7817
diff changeset
2195 if (STRCMP(cmd, "ex") == 0)
28f569c7dab9 commit https://github.com/vim/vim/commit/20fb9f346497daca4d19402fdfa5de7958642477
Christian Brabandt <cb@256bit.org>
parents: 7817
diff changeset
2196 {
8746
4c38a4733578 commit https://github.com/vim/vim/commit/c4dcd60c76666bf113719f929709ad6120eb6528
Christian Brabandt <cb@256bit.org>
parents: 8684
diff changeset
2197 int save_called_emsg = called_emsg;
4c38a4733578 commit https://github.com/vim/vim/commit/c4dcd60c76666bf113719f929709ad6120eb6528
Christian Brabandt <cb@256bit.org>
parents: 8684
diff changeset
2198
4c38a4733578 commit https://github.com/vim/vim/commit/c4dcd60c76666bf113719f929709ad6120eb6528
Christian Brabandt <cb@256bit.org>
parents: 8684
diff changeset
2199 called_emsg = FALSE;
8653
d80edead9675 commit https://github.com/vim/vim/commit/ac74d5e86cd16b42e81ba48f58f3d45c72758248
Christian Brabandt <cb@256bit.org>
parents: 8607
diff changeset
2200 ch_logs(channel, "Executing ex command '%s'", (char *)arg);
8746
4c38a4733578 commit https://github.com/vim/vim/commit/c4dcd60c76666bf113719f929709ad6120eb6528
Christian Brabandt <cb@256bit.org>
parents: 8684
diff changeset
2201 ++emsg_silent;
7864
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2202 do_cmdline_cmd(arg);
8746
4c38a4733578 commit https://github.com/vim/vim/commit/c4dcd60c76666bf113719f929709ad6120eb6528
Christian Brabandt <cb@256bit.org>
parents: 8684
diff changeset
2203 --emsg_silent;
4c38a4733578 commit https://github.com/vim/vim/commit/c4dcd60c76666bf113719f929709ad6120eb6528
Christian Brabandt <cb@256bit.org>
parents: 8684
diff changeset
2204 if (called_emsg)
4c38a4733578 commit https://github.com/vim/vim/commit/c4dcd60c76666bf113719f929709ad6120eb6528
Christian Brabandt <cb@256bit.org>
parents: 8684
diff changeset
2205 ch_logs(channel, "Ex command error: '%s'",
4c38a4733578 commit https://github.com/vim/vim/commit/c4dcd60c76666bf113719f929709ad6120eb6528
Christian Brabandt <cb@256bit.org>
parents: 8684
diff changeset
2206 (char *)get_vim_var_str(VV_ERRMSG));
4c38a4733578 commit https://github.com/vim/vim/commit/c4dcd60c76666bf113719f929709ad6120eb6528
Christian Brabandt <cb@256bit.org>
parents: 8684
diff changeset
2207 called_emsg = save_called_emsg;
7840
28f569c7dab9 commit https://github.com/vim/vim/commit/20fb9f346497daca4d19402fdfa5de7958642477
Christian Brabandt <cb@256bit.org>
parents: 7817
diff changeset
2208 }
28f569c7dab9 commit https://github.com/vim/vim/commit/20fb9f346497daca4d19402fdfa5de7958642477
Christian Brabandt <cb@256bit.org>
parents: 7817
diff changeset
2209 else if (STRCMP(cmd, "normal") == 0)
28f569c7dab9 commit https://github.com/vim/vim/commit/20fb9f346497daca4d19402fdfa5de7958642477
Christian Brabandt <cb@256bit.org>
parents: 7817
diff changeset
2210 {
7864
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2211 exarg_T ea;
7840
28f569c7dab9 commit https://github.com/vim/vim/commit/20fb9f346497daca4d19402fdfa5de7958642477
Christian Brabandt <cb@256bit.org>
parents: 7817
diff changeset
2212
8653
d80edead9675 commit https://github.com/vim/vim/commit/ac74d5e86cd16b42e81ba48f58f3d45c72758248
Christian Brabandt <cb@256bit.org>
parents: 8607
diff changeset
2213 ch_logs(channel, "Executing normal command '%s'", (char *)arg);
7864
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2214 ea.arg = arg;
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2215 ea.addr_count = 0;
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2216 ea.forceit = TRUE; /* no mapping */
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2217 ex_normal(&ea);
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2218 }
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2219 else if (STRCMP(cmd, "redraw") == 0)
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2220 {
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2221 exarg_T ea;
7840
28f569c7dab9 commit https://github.com/vim/vim/commit/20fb9f346497daca4d19402fdfa5de7958642477
Christian Brabandt <cb@256bit.org>
parents: 7817
diff changeset
2222
8653
d80edead9675 commit https://github.com/vim/vim/commit/ac74d5e86cd16b42e81ba48f58f3d45c72758248
Christian Brabandt <cb@256bit.org>
parents: 8607
diff changeset
2223 ch_log(channel, "redraw");
7872
4b9d4600166f commit https://github.com/vim/vim/commit/14ad611ca435d97e8fd0d9ab03ddc982843298ac
Christian Brabandt <cb@256bit.org>
parents: 7868
diff changeset
2224 ea.forceit = *arg != NUL;
7864
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2225 ex_redraw(&ea);
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2226 showruler(FALSE);
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2227 setcursor();
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2228 out_flush();
7840
28f569c7dab9 commit https://github.com/vim/vim/commit/20fb9f346497daca4d19402fdfa5de7958642477
Christian Brabandt <cb@256bit.org>
parents: 7817
diff changeset
2229 #ifdef FEAT_GUI
7864
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2230 if (gui.in_use)
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2231 {
9215
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
2232 gui_update_cursor(TRUE, FALSE);
7864
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2233 gui_mch_flush();
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2234 }
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2235 #endif
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2236 }
8159
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2237 else if (STRCMP(cmd, "expr") == 0 || STRCMP(cmd, "call") == 0)
7864
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2238 {
8159
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2239 int is_call = cmd[0] == 'c';
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2240 int id_idx = is_call ? 3 : 2;
7864
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2241
8159
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2242 if (argv[id_idx].v_type != VAR_UNKNOWN
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2243 && argv[id_idx].v_type != VAR_NUMBER)
7864
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2244 {
8159
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2245 ch_error(channel, "last argument for expr/call must be a number");
7864
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2246 if (p_verbose > 2)
9953
9560a2eb7968 commit https://github.com/vim/vim/commit/5b30291785e6b9be1a607504c14bd03c601b59a6
Christian Brabandt <cb@256bit.org>
parents: 9723
diff changeset
2247 EMSG(_("E904: last argument for expr/call must be a number"));
8159
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2248 }
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2249 else if (is_call && argv[2].v_type != VAR_LIST)
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2250 {
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2251 ch_error(channel, "third argument for call must be a list");
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2252 if (p_verbose > 2)
9953
9560a2eb7968 commit https://github.com/vim/vim/commit/5b30291785e6b9be1a607504c14bd03c601b59a6
Christian Brabandt <cb@256bit.org>
parents: 9723
diff changeset
2253 EMSG(_("E904: third argument for call must be a list"));
7864
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2254 }
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2255 else
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2256 {
10112
90b9898d05a6 commit https://github.com/vim/vim/commit/c8fe338d64cc6183c03d4c12b1e036a7745e2932
Christian Brabandt <cb@256bit.org>
parents: 10054
diff changeset
2257 typval_T *tv = NULL;
8159
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2258 typval_T res_tv;
7864
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2259 typval_T err_tv;
7965
646d5148fee2 commit https://github.com/vim/vim/commit/55fab439a6f3bba6dbe780ac034b84d5822a1a96
Christian Brabandt <cb@256bit.org>
parents: 7961
diff changeset
2260 char_u *json = NULL;
7864
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2261
7906
ea1fd8d750a6 commit https://github.com/vim/vim/commit/fcb1e3d16832ce06da0dc38ecb7ab9aaa3ee4383
Christian Brabandt <cb@256bit.org>
parents: 7899
diff changeset
2262 /* Don't pollute the display with errors. */
ea1fd8d750a6 commit https://github.com/vim/vim/commit/fcb1e3d16832ce06da0dc38ecb7ab9aaa3ee4383
Christian Brabandt <cb@256bit.org>
parents: 7899
diff changeset
2263 ++emsg_skip;
8159
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2264 if (!is_call)
8653
d80edead9675 commit https://github.com/vim/vim/commit/ac74d5e86cd16b42e81ba48f58f3d45c72758248
Christian Brabandt <cb@256bit.org>
parents: 8607
diff changeset
2265 {
d80edead9675 commit https://github.com/vim/vim/commit/ac74d5e86cd16b42e81ba48f58f3d45c72758248
Christian Brabandt <cb@256bit.org>
parents: 8607
diff changeset
2266 ch_logs(channel, "Evaluating expression '%s'", (char *)arg);
8159
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2267 tv = eval_expr(arg, NULL);
8653
d80edead9675 commit https://github.com/vim/vim/commit/ac74d5e86cd16b42e81ba48f58f3d45c72758248
Christian Brabandt <cb@256bit.org>
parents: 8607
diff changeset
2268 }
8159
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2269 else
8653
d80edead9675 commit https://github.com/vim/vim/commit/ac74d5e86cd16b42e81ba48f58f3d45c72758248
Christian Brabandt <cb@256bit.org>
parents: 8607
diff changeset
2270 {
d80edead9675 commit https://github.com/vim/vim/commit/ac74d5e86cd16b42e81ba48f58f3d45c72758248
Christian Brabandt <cb@256bit.org>
parents: 8607
diff changeset
2271 ch_logs(channel, "Calling '%s'", (char *)arg);
d80edead9675 commit https://github.com/vim/vim/commit/ac74d5e86cd16b42e81ba48f58f3d45c72758248
Christian Brabandt <cb@256bit.org>
parents: 8607
diff changeset
2272 if (func_call(arg, &argv[2], NULL, NULL, &res_tv) == OK)
d80edead9675 commit https://github.com/vim/vim/commit/ac74d5e86cd16b42e81ba48f58f3d45c72758248
Christian Brabandt <cb@256bit.org>
parents: 8607
diff changeset
2273 tv = &res_tv;
d80edead9675 commit https://github.com/vim/vim/commit/ac74d5e86cd16b42e81ba48f58f3d45c72758248
Christian Brabandt <cb@256bit.org>
parents: 8607
diff changeset
2274 }
8159
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2275
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2276 if (argv[id_idx].v_type == VAR_NUMBER)
7840
28f569c7dab9 commit https://github.com/vim/vim/commit/20fb9f346497daca4d19402fdfa5de7958642477
Christian Brabandt <cb@256bit.org>
parents: 7817
diff changeset
2277 {
8159
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2278 int id = argv[id_idx].vval.v_number;
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2279
7965
646d5148fee2 commit https://github.com/vim/vim/commit/55fab439a6f3bba6dbe780ac034b84d5822a1a96
Christian Brabandt <cb@256bit.org>
parents: 7961
diff changeset
2280 if (tv != NULL)
9969
176e34b0d678 commit https://github.com/vim/vim/commit/f1f0792e55e72cdc7c833b30f565a9b02f18bb1e
Christian Brabandt <cb@256bit.org>
parents: 9953
diff changeset
2281 json = json_encode_nr_expr(id, tv, options | JSON_NL);
7965
646d5148fee2 commit https://github.com/vim/vim/commit/55fab439a6f3bba6dbe780ac034b84d5822a1a96
Christian Brabandt <cb@256bit.org>
parents: 7961
diff changeset
2282 if (tv == NULL || (json != NULL && *json == NUL))
7864
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2283 {
7965
646d5148fee2 commit https://github.com/vim/vim/commit/55fab439a6f3bba6dbe780ac034b84d5822a1a96
Christian Brabandt <cb@256bit.org>
parents: 7961
diff changeset
2284 /* If evaluation failed or the result can't be encoded
646d5148fee2 commit https://github.com/vim/vim/commit/55fab439a6f3bba6dbe780ac034b84d5822a1a96
Christian Brabandt <cb@256bit.org>
parents: 7961
diff changeset
2285 * then return the string "ERROR". */
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2286 vim_free(json);
7864
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2287 err_tv.v_type = VAR_STRING;
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2288 err_tv.vval.v_string = (char_u *)"ERROR";
10112
90b9898d05a6 commit https://github.com/vim/vim/commit/c8fe338d64cc6183c03d4c12b1e036a7745e2932
Christian Brabandt <cb@256bit.org>
parents: 10054
diff changeset
2289 json = json_encode_nr_expr(id, &err_tv, options | JSON_NL);
7864
6b0891de44a9 commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents: 7840
diff changeset
2290 }
7965
646d5148fee2 commit https://github.com/vim/vim/commit/55fab439a6f3bba6dbe780ac034b84d5822a1a96
Christian Brabandt <cb@256bit.org>
parents: 7961
diff changeset
2291 if (json != NULL)
646d5148fee2 commit https://github.com/vim/vim/commit/55fab439a6f3bba6dbe780ac034b84d5822a1a96
Christian Brabandt <cb@256bit.org>
parents: 7961
diff changeset
2292 {
8159
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2293 channel_send(channel,
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2294 part == PART_SOCK ? PART_SOCK : PART_IN,
9434
8f904a323b3f commit https://github.com/vim/vim/commit/bf2cc5f36d5ffd5de445e6970602000c7869b65a
Christian Brabandt <cb@256bit.org>
parents: 9367
diff changeset
2295 json, (int)STRLEN(json), (char *)cmd);
7965
646d5148fee2 commit https://github.com/vim/vim/commit/55fab439a6f3bba6dbe780ac034b84d5822a1a96
Christian Brabandt <cb@256bit.org>
parents: 7961
diff changeset
2296 vim_free(json);
646d5148fee2 commit https://github.com/vim/vim/commit/55fab439a6f3bba6dbe780ac034b84d5822a1a96
Christian Brabandt <cb@256bit.org>
parents: 7961
diff changeset
2297 }
7840
28f569c7dab9 commit https://github.com/vim/vim/commit/20fb9f346497daca4d19402fdfa5de7958642477
Christian Brabandt <cb@256bit.org>
parents: 7817
diff changeset
2298 }
7965
646d5148fee2 commit https://github.com/vim/vim/commit/55fab439a6f3bba6dbe780ac034b84d5822a1a96
Christian Brabandt <cb@256bit.org>
parents: 7961
diff changeset
2299 --emsg_skip;
8159
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2300 if (tv == &res_tv)
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2301 clear_tv(tv);
10112
90b9898d05a6 commit https://github.com/vim/vim/commit/c8fe338d64cc6183c03d4c12b1e036a7745e2932
Christian Brabandt <cb@256bit.org>
parents: 10054
diff changeset
2302 else
7906
ea1fd8d750a6 commit https://github.com/vim/vim/commit/fcb1e3d16832ce06da0dc38ecb7ab9aaa3ee4383
Christian Brabandt <cb@256bit.org>
parents: 7899
diff changeset
2303 free_tv(tv);
7840
28f569c7dab9 commit https://github.com/vim/vim/commit/20fb9f346497daca4d19402fdfa5de7958642477
Christian Brabandt <cb@256bit.org>
parents: 7817
diff changeset
2304 }
28f569c7dab9 commit https://github.com/vim/vim/commit/20fb9f346497daca4d19402fdfa5de7958642477
Christian Brabandt <cb@256bit.org>
parents: 7817
diff changeset
2305 }
28f569c7dab9 commit https://github.com/vim/vim/commit/20fb9f346497daca4d19402fdfa5de7958642477
Christian Brabandt <cb@256bit.org>
parents: 7817
diff changeset
2306 else if (p_verbose > 2)
8159
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2307 {
9355
40c8a8b012b5 commit https://github.com/vim/vim/commit/aad30bbcde2b268e2fffb6fd1443f27ebda9d1ff
Christian Brabandt <cb@256bit.org>
parents: 9282
diff changeset
2308 ch_errors(channel, "Received unknown command: %s", (char *)cmd);
9953
9560a2eb7968 commit https://github.com/vim/vim/commit/5b30291785e6b9be1a607504c14bd03c601b59a6
Christian Brabandt <cb@256bit.org>
parents: 9723
diff changeset
2309 EMSG2(_("E905: received unknown command: %s"), cmd);
8159
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2310 }
7840
28f569c7dab9 commit https://github.com/vim/vim/commit/20fb9f346497daca4d19402fdfa5de7958642477
Christian Brabandt <cb@256bit.org>
parents: 7817
diff changeset
2311 }
28f569c7dab9 commit https://github.com/vim/vim/commit/20fb9f346497daca4d19402fdfa5de7958642477
Christian Brabandt <cb@256bit.org>
parents: 7817
diff changeset
2312
8928
e6916e1683bb commit https://github.com/vim/vim/commit/7f7c3325d3f1baba32263a3457cfc4d90ecd5ff1
Christian Brabandt <cb@256bit.org>
parents: 8881
diff changeset
2313 /*
e6916e1683bb commit https://github.com/vim/vim/commit/7f7c3325d3f1baba32263a3457cfc4d90ecd5ff1
Christian Brabandt <cb@256bit.org>
parents: 8881
diff changeset
2314 * Invoke the callback at "cbhead".
e6916e1683bb commit https://github.com/vim/vim/commit/7f7c3325d3f1baba32263a3457cfc4d90ecd5ff1
Christian Brabandt <cb@256bit.org>
parents: 8881
diff changeset
2315 * Does not redraw but sets channel_need_redraw.
e6916e1683bb commit https://github.com/vim/vim/commit/7f7c3325d3f1baba32263a3457cfc4d90ecd5ff1
Christian Brabandt <cb@256bit.org>
parents: 8881
diff changeset
2316 */
8382
3dbe93a240d8 commit https://github.com/vim/vim/commit/d6547fc6471d9084f942bdc4ae3aedb39361751d
Christian Brabandt <cb@256bit.org>
parents: 8358
diff changeset
2317 static void
3dbe93a240d8 commit https://github.com/vim/vim/commit/d6547fc6471d9084f942bdc4ae3aedb39361751d
Christian Brabandt <cb@256bit.org>
parents: 8358
diff changeset
2318 invoke_one_time_callback(
3dbe93a240d8 commit https://github.com/vim/vim/commit/d6547fc6471d9084f942bdc4ae3aedb39361751d
Christian Brabandt <cb@256bit.org>
parents: 8358
diff changeset
2319 channel_T *channel,
3dbe93a240d8 commit https://github.com/vim/vim/commit/d6547fc6471d9084f942bdc4ae3aedb39361751d
Christian Brabandt <cb@256bit.org>
parents: 8358
diff changeset
2320 cbq_T *cbhead,
3dbe93a240d8 commit https://github.com/vim/vim/commit/d6547fc6471d9084f942bdc4ae3aedb39361751d
Christian Brabandt <cb@256bit.org>
parents: 8358
diff changeset
2321 cbq_T *item,
3dbe93a240d8 commit https://github.com/vim/vim/commit/d6547fc6471d9084f942bdc4ae3aedb39361751d
Christian Brabandt <cb@256bit.org>
parents: 8358
diff changeset
2322 typval_T *argv)
3dbe93a240d8 commit https://github.com/vim/vim/commit/d6547fc6471d9084f942bdc4ae3aedb39361751d
Christian Brabandt <cb@256bit.org>
parents: 8358
diff changeset
2323 {
3dbe93a240d8 commit https://github.com/vim/vim/commit/d6547fc6471d9084f942bdc4ae3aedb39361751d
Christian Brabandt <cb@256bit.org>
parents: 8358
diff changeset
2324 ch_logs(channel, "Invoking one-time callback %s",
3dbe93a240d8 commit https://github.com/vim/vim/commit/d6547fc6471d9084f942bdc4ae3aedb39361751d
Christian Brabandt <cb@256bit.org>
parents: 8358
diff changeset
2325 (char *)item->cq_callback);
3dbe93a240d8 commit https://github.com/vim/vim/commit/d6547fc6471d9084f942bdc4ae3aedb39361751d
Christian Brabandt <cb@256bit.org>
parents: 8358
diff changeset
2326 /* Remove the item from the list first, if the callback
3dbe93a240d8 commit https://github.com/vim/vim/commit/d6547fc6471d9084f942bdc4ae3aedb39361751d
Christian Brabandt <cb@256bit.org>
parents: 8358
diff changeset
2327 * invokes ch_close() the list will be cleared. */
3dbe93a240d8 commit https://github.com/vim/vim/commit/d6547fc6471d9084f942bdc4ae3aedb39361751d
Christian Brabandt <cb@256bit.org>
parents: 8358
diff changeset
2328 remove_cb_node(cbhead, item);
8538
c337c813c64d commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents: 8508
diff changeset
2329 invoke_callback(channel, item->cq_callback, item->cq_partial, argv);
9491
404de131cff9 commit https://github.com/vim/vim/commit/1436d8d51cce114be56209924fc71376407e5bad
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
2330 free_callback(item->cq_callback, item->cq_partial);
8382
3dbe93a240d8 commit https://github.com/vim/vim/commit/d6547fc6471d9084f942bdc4ae3aedb39361751d
Christian Brabandt <cb@256bit.org>
parents: 8358
diff changeset
2331 vim_free(item);
3dbe93a240d8 commit https://github.com/vim/vim/commit/d6547fc6471d9084f942bdc4ae3aedb39361751d
Christian Brabandt <cb@256bit.org>
parents: 8358
diff changeset
2332 }
3dbe93a240d8 commit https://github.com/vim/vim/commit/d6547fc6471d9084f942bdc4ae3aedb39361751d
Christian Brabandt <cb@256bit.org>
parents: 8358
diff changeset
2333
8422
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2334 static void
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
2335 append_to_buffer(buf_T *buffer, char_u *msg, channel_T *channel, ch_part_T part)
8422
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2336 {
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2337 buf_T *save_curbuf = curbuf;
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2338 linenr_T lnum = buffer->b_ml.ml_line_count;
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2339 int save_write_to = buffer->b_write_to_channel;
9147
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
2340 chanpart_T *ch_part = &channel->ch_part[part];
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
2341 int save_p_ma = buffer->b_p_ma;
11666
5cd9ba96561d patch 8.0.0716: not easy to start Vim cleanly
Christian Brabandt <cb@256bit.org>
parents: 11416
diff changeset
2342 int empty = (buffer->b_ml.ml_flags & ML_EMPTY) ? 1 : 0;
9147
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
2343
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
2344 if (!buffer->b_p_ma && !ch_part->ch_nomodifiable)
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
2345 {
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
2346 if (!ch_part->ch_nomod_error)
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
2347 {
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
2348 ch_error(channel, "Buffer is not modifiable, cannot append");
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
2349 ch_part->ch_nomod_error = TRUE;
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
2350 }
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
2351 return;
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
2352 }
8422
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2353
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2354 /* If the buffer is also used as input insert above the last
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2355 * line. Don't write these lines. */
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2356 if (save_write_to)
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2357 {
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2358 --lnum;
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2359 buffer->b_write_to_channel = FALSE;
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2360 }
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2361
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2362 /* Append to the buffer */
11666
5cd9ba96561d patch 8.0.0716: not easy to start Vim cleanly
Christian Brabandt <cb@256bit.org>
parents: 11416
diff changeset
2363 ch_logn(channel, "appending line %d to buffer", (int)lnum + 1 - empty);
8422
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2364
9147
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
2365 buffer->b_p_ma = TRUE;
8422
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2366 curbuf = buffer;
11666
5cd9ba96561d patch 8.0.0716: not easy to start Vim cleanly
Christian Brabandt <cb@256bit.org>
parents: 11416
diff changeset
2367 curwin->w_buffer = curbuf;
8422
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2368 u_sync(TRUE);
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2369 /* ignore undo failure, undo is not very useful here */
11666
5cd9ba96561d patch 8.0.0716: not easy to start Vim cleanly
Christian Brabandt <cb@256bit.org>
parents: 11416
diff changeset
2370 ignored = u_save(lnum - empty, lnum + 1);
10147
65afd399ffa7 commit https://github.com/vim/vim/commit/169ebb080454357279ad5ad21ac532deaec605e8
Christian Brabandt <cb@256bit.org>
parents: 10112
diff changeset
2371
65afd399ffa7 commit https://github.com/vim/vim/commit/169ebb080454357279ad5ad21ac532deaec605e8
Christian Brabandt <cb@256bit.org>
parents: 10112
diff changeset
2372 if (empty)
65afd399ffa7 commit https://github.com/vim/vim/commit/169ebb080454357279ad5ad21ac532deaec605e8
Christian Brabandt <cb@256bit.org>
parents: 10112
diff changeset
2373 {
65afd399ffa7 commit https://github.com/vim/vim/commit/169ebb080454357279ad5ad21ac532deaec605e8
Christian Brabandt <cb@256bit.org>
parents: 10112
diff changeset
2374 /* The buffer is empty, replace the first (dummy) line. */
65afd399ffa7 commit https://github.com/vim/vim/commit/169ebb080454357279ad5ad21ac532deaec605e8
Christian Brabandt <cb@256bit.org>
parents: 10112
diff changeset
2375 ml_replace(lnum, msg, TRUE);
65afd399ffa7 commit https://github.com/vim/vim/commit/169ebb080454357279ad5ad21ac532deaec605e8
Christian Brabandt <cb@256bit.org>
parents: 10112
diff changeset
2376 lnum = 0;
65afd399ffa7 commit https://github.com/vim/vim/commit/169ebb080454357279ad5ad21ac532deaec605e8
Christian Brabandt <cb@256bit.org>
parents: 10112
diff changeset
2377 }
65afd399ffa7 commit https://github.com/vim/vim/commit/169ebb080454357279ad5ad21ac532deaec605e8
Christian Brabandt <cb@256bit.org>
parents: 10112
diff changeset
2378 else
65afd399ffa7 commit https://github.com/vim/vim/commit/169ebb080454357279ad5ad21ac532deaec605e8
Christian Brabandt <cb@256bit.org>
parents: 10112
diff changeset
2379 ml_append(lnum, msg, 0, FALSE);
8422
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2380 appended_lines_mark(lnum, 1L);
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2381 curbuf = save_curbuf;
11666
5cd9ba96561d patch 8.0.0716: not easy to start Vim cleanly
Christian Brabandt <cb@256bit.org>
parents: 11416
diff changeset
2382 curwin->w_buffer = curbuf;
9147
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
2383 if (ch_part->ch_nomodifiable)
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
2384 buffer->b_p_ma = FALSE;
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
2385 else
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
2386 buffer->b_p_ma = save_p_ma;
8422
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2387
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2388 if (buffer->b_nwindows > 0)
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2389 {
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2390 win_T *wp;
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2391 win_T *save_curwin;
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2392
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2393 FOR_ALL_WINDOWS(wp)
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2394 {
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2395 if (wp->w_buffer == buffer
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2396 && (save_write_to
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2397 ? wp->w_cursor.lnum == lnum + 1
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2398 : (wp->w_cursor.lnum == lnum
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2399 && wp->w_cursor.col == 0)))
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2400 {
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2401 ++wp->w_cursor.lnum;
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2402 save_curwin = curwin;
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2403 curwin = wp;
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2404 curbuf = curwin->w_buffer;
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2405 scroll_cursor_bot(0, FALSE);
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2406 curwin = save_curwin;
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2407 curbuf = curwin->w_buffer;
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2408 }
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2409 }
11416
32aed0993813 patch 8.0.0592: if a job writes to a buffer screen is not updated
Christian Brabandt <cb@256bit.org>
parents: 11408
diff changeset
2410 redraw_buf_and_status_later(buffer, VALID);
8422
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2411 channel_need_redraw = TRUE;
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2412 }
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2413
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2414 if (save_write_to)
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2415 {
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2416 channel_T *ch;
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2417
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2418 /* Find channels reading from this buffer and adjust their
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2419 * next-to-read line number. */
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2420 buffer->b_write_to_channel = TRUE;
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2421 for (ch = first_channel; ch != NULL; ch = ch->ch_next)
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2422 {
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2423 chanpart_T *in_part = &ch->ch_part[PART_IN];
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2424
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9434
diff changeset
2425 if (in_part->ch_bufref.br_buf == buffer)
8422
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2426 in_part->ch_buf_bot = buffer->b_ml.ml_line_count;
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2427 }
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2428 }
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2429 }
5d2c84be23b5 commit https://github.com/vim/vim/commit/99ef06296f3c37490511c03786a2c8672e015c56
Christian Brabandt <cb@256bit.org>
parents: 8410
diff changeset
2430
9007
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
2431 static void
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
2432 drop_messages(channel_T *channel, ch_part_T part)
9007
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
2433 {
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
2434 char_u *msg;
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
2435
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
2436 while ((msg = channel_get(channel, part)) != NULL)
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
2437 {
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
2438 ch_logs(channel, "Dropping message '%s'", (char *)msg);
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
2439 vim_free(msg);
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
2440 }
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
2441 }
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
2442
7840
28f569c7dab9 commit https://github.com/vim/vim/commit/20fb9f346497daca4d19402fdfa5de7958642477
Christian Brabandt <cb@256bit.org>
parents: 7817
diff changeset
2443 /*
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
2444 * Invoke a callback for "channel"/"part" if needed.
8928
e6916e1683bb commit https://github.com/vim/vim/commit/7f7c3325d3f1baba32263a3457cfc4d90ecd5ff1
Christian Brabandt <cb@256bit.org>
parents: 8881
diff changeset
2445 * This does not redraw but sets channel_need_redraw when redraw is needed.
8084
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
2446 * Return TRUE when a message was handled, there might be another one.
7840
28f569c7dab9 commit https://github.com/vim/vim/commit/20fb9f346497daca4d19402fdfa5de7958642477
Christian Brabandt <cb@256bit.org>
parents: 7817
diff changeset
2447 */
7885
6e6f829af138 commit https://github.com/vim/vim/commit/df5b27b20ec023274fb0f5347973d5abcde7ddd6
Christian Brabandt <cb@256bit.org>
parents: 7883
diff changeset
2448 static int
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
2449 may_invoke_callback(channel_T *channel, ch_part_T part)
7840
28f569c7dab9 commit https://github.com/vim/vim/commit/20fb9f346497daca4d19402fdfa5de7958642477
Christian Brabandt <cb@256bit.org>
parents: 7817
diff changeset
2450 {
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2451 char_u *msg = NULL;
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2452 typval_T *listtv = NULL;
8159
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2453 typval_T argv[CH_JSON_MAX_ARGS];
7840
28f569c7dab9 commit https://github.com/vim/vim/commit/20fb9f346497daca4d19402fdfa5de7958642477
Christian Brabandt <cb@256bit.org>
parents: 7817
diff changeset
2454 int seq_nr = -1;
10249
920c73a27dda commit https://github.com/vim/vim/commit/ec68a99464055029c01082762517e97245ddae0c
Christian Brabandt <cb@256bit.org>
parents: 10240
diff changeset
2455 chanpart_T *ch_part = &channel->ch_part[part];
920c73a27dda commit https://github.com/vim/vim/commit/ec68a99464055029c01082762517e97245ddae0c
Christian Brabandt <cb@256bit.org>
parents: 10240
diff changeset
2456 ch_mode_T ch_mode = ch_part->ch_mode;
920c73a27dda commit https://github.com/vim/vim/commit/ec68a99464055029c01082762517e97245ddae0c
Christian Brabandt <cb@256bit.org>
parents: 10240
diff changeset
2457 cbq_T *cbhead = &ch_part->ch_cb_head;
8404
8894d595b786 commit https://github.com/vim/vim/commit/5983ad0b038fa689653246cb304fd43e8ae39a78
Christian Brabandt <cb@256bit.org>
parents: 8386
diff changeset
2458 cbq_T *cbitem;
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
2459 char_u *callback = NULL;
8538
c337c813c64d commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents: 8508
diff changeset
2460 partial_T *partial = NULL;
8267
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
2461 buf_T *buffer = NULL;
9246
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
2462 char_u *p;
7840
28f569c7dab9 commit https://github.com/vim/vim/commit/20fb9f346497daca4d19402fdfa5de7958642477
Christian Brabandt <cb@256bit.org>
parents: 7817
diff changeset
2463
8210
b717dae2f26d commit https://github.com/vim/vim/commit/4e221c99e85ed40c98892068a01270b9e7492d98
Christian Brabandt <cb@256bit.org>
parents: 8204
diff changeset
2464 if (channel->ch_nb_close_cb != NULL)
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2465 /* this channel is handled elsewhere (netbeans) */
7885
6e6f829af138 commit https://github.com/vim/vim/commit/df5b27b20ec023274fb0f5347973d5abcde7ddd6
Christian Brabandt <cb@256bit.org>
parents: 7883
diff changeset
2466 return FALSE;
7840
28f569c7dab9 commit https://github.com/vim/vim/commit/20fb9f346497daca4d19402fdfa5de7958642477
Christian Brabandt <cb@256bit.org>
parents: 7817
diff changeset
2467
8404
8894d595b786 commit https://github.com/vim/vim/commit/5983ad0b038fa689653246cb304fd43e8ae39a78
Christian Brabandt <cb@256bit.org>
parents: 8386
diff changeset
2468 /* Use a message-specific callback, part callback or channel callback */
8894d595b786 commit https://github.com/vim/vim/commit/5983ad0b038fa689653246cb304fd43e8ae39a78
Christian Brabandt <cb@256bit.org>
parents: 8386
diff changeset
2469 for (cbitem = cbhead->cq_next; cbitem != NULL; cbitem = cbitem->cq_next)
8894d595b786 commit https://github.com/vim/vim/commit/5983ad0b038fa689653246cb304fd43e8ae39a78
Christian Brabandt <cb@256bit.org>
parents: 8386
diff changeset
2470 if (cbitem->cq_seq_nr == 0)
8894d595b786 commit https://github.com/vim/vim/commit/5983ad0b038fa689653246cb304fd43e8ae39a78
Christian Brabandt <cb@256bit.org>
parents: 8386
diff changeset
2471 break;
8382
3dbe93a240d8 commit https://github.com/vim/vim/commit/d6547fc6471d9084f942bdc4ae3aedb39361751d
Christian Brabandt <cb@256bit.org>
parents: 8358
diff changeset
2472 if (cbitem != NULL)
8538
c337c813c64d commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents: 8508
diff changeset
2473 {
8382
3dbe93a240d8 commit https://github.com/vim/vim/commit/d6547fc6471d9084f942bdc4ae3aedb39361751d
Christian Brabandt <cb@256bit.org>
parents: 8358
diff changeset
2474 callback = cbitem->cq_callback;
8538
c337c813c64d commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents: 8508
diff changeset
2475 partial = cbitem->cq_partial;
c337c813c64d commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents: 8508
diff changeset
2476 }
10249
920c73a27dda commit https://github.com/vim/vim/commit/ec68a99464055029c01082762517e97245ddae0c
Christian Brabandt <cb@256bit.org>
parents: 10240
diff changeset
2477 else if (ch_part->ch_callback != NULL)
8538
c337c813c64d commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents: 8508
diff changeset
2478 {
10249
920c73a27dda commit https://github.com/vim/vim/commit/ec68a99464055029c01082762517e97245ddae0c
Christian Brabandt <cb@256bit.org>
parents: 10240
diff changeset
2479 callback = ch_part->ch_callback;
920c73a27dda commit https://github.com/vim/vim/commit/ec68a99464055029c01082762517e97245ddae0c
Christian Brabandt <cb@256bit.org>
parents: 10240
diff changeset
2480 partial = ch_part->ch_partial;
8538
c337c813c64d commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents: 8508
diff changeset
2481 }
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
2482 else
8538
c337c813c64d commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents: 8508
diff changeset
2483 {
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
2484 callback = channel->ch_callback;
8538
c337c813c64d commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents: 8508
diff changeset
2485 partial = channel->ch_partial;
c337c813c64d commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents: 8508
diff changeset
2486 }
8291
ac0c43e7af20 commit https://github.com/vim/vim/commit/c7f0ebc6d1e1cdaed816b88a0d6092c5ace615eb
Christian Brabandt <cb@256bit.org>
parents: 8267
diff changeset
2487
10249
920c73a27dda commit https://github.com/vim/vim/commit/ec68a99464055029c01082762517e97245ddae0c
Christian Brabandt <cb@256bit.org>
parents: 10240
diff changeset
2488 buffer = ch_part->ch_bufref.br_buf;
11666
5cd9ba96561d patch 8.0.0716: not easy to start Vim cleanly
Christian Brabandt <cb@256bit.org>
parents: 11416
diff changeset
2489 if (buffer != NULL && (!bufref_valid(&ch_part->ch_bufref)
5cd9ba96561d patch 8.0.0716: not easy to start Vim cleanly
Christian Brabandt <cb@256bit.org>
parents: 11416
diff changeset
2490 || buffer->b_ml.ml_mfp == NULL))
8291
ac0c43e7af20 commit https://github.com/vim/vim/commit/c7f0ebc6d1e1cdaed816b88a0d6092c5ace615eb
Christian Brabandt <cb@256bit.org>
parents: 8267
diff changeset
2491 {
11666
5cd9ba96561d patch 8.0.0716: not easy to start Vim cleanly
Christian Brabandt <cb@256bit.org>
parents: 11416
diff changeset
2492 /* buffer was wiped out or unloaded */
5cd9ba96561d patch 8.0.0716: not easy to start Vim cleanly
Christian Brabandt <cb@256bit.org>
parents: 11416
diff changeset
2493 ch_logs(channel, "%s buffer has been wiped out", part_names[part]);
10249
920c73a27dda commit https://github.com/vim/vim/commit/ec68a99464055029c01082762517e97245ddae0c
Christian Brabandt <cb@256bit.org>
parents: 10240
diff changeset
2494 ch_part->ch_bufref.br_buf = NULL;
8291
ac0c43e7af20 commit https://github.com/vim/vim/commit/c7f0ebc6d1e1cdaed816b88a0d6092c5ace615eb
Christian Brabandt <cb@256bit.org>
parents: 8267
diff changeset
2495 buffer = NULL;
ac0c43e7af20 commit https://github.com/vim/vim/commit/c7f0ebc6d1e1cdaed816b88a0d6092c5ace615eb
Christian Brabandt <cb@256bit.org>
parents: 8267
diff changeset
2496 }
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
2497
8084
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
2498 if (ch_mode == MODE_JSON || ch_mode == MODE_JS)
7840
28f569c7dab9 commit https://github.com/vim/vim/commit/20fb9f346497daca4d19402fdfa5de7958642477
Christian Brabandt <cb@256bit.org>
parents: 7817
diff changeset
2499 {
8159
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2500 listitem_T *item;
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2501 int argc = 0;
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2502
7899
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
2503 /* Get any json message in the queue. */
10426
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2504 if (channel_get_json(channel, part, -1, FALSE, &listtv) == FAIL)
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2505 {
7899
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
2506 /* Parse readahead, return when there is still no message. */
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
2507 channel_parse_json(channel, part);
10426
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2508 if (channel_get_json(channel, part, -1, FALSE, &listtv) == FAIL)
7899
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
2509 return FALSE;
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2510 }
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2511
8159
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2512 for (item = listtv->vval.v_list->lv_first;
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2513 item != NULL && argc < CH_JSON_MAX_ARGS;
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2514 item = item->li_next)
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2515 argv[argc++] = item->li_tv;
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2516 while (argc < CH_JSON_MAX_ARGS)
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2517 argv[argc++].v_type = VAR_UNKNOWN;
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2518
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2519 if (argv[0].v_type == VAR_STRING)
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2520 {
8159
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2521 /* ["cmd", arg] or ["cmd", arg, arg] or ["cmd", arg, arg, arg] */
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2522 channel_exe_cmd(channel, part, argv);
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2523 free_tv(listtv);
7885
6e6f829af138 commit https://github.com/vim/vim/commit/df5b27b20ec023274fb0f5347973d5abcde7ddd6
Christian Brabandt <cb@256bit.org>
parents: 7883
diff changeset
2524 return TRUE;
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2525 }
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2526
8159
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2527 if (argv[0].v_type != VAR_NUMBER)
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2528 {
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2529 ch_error(channel,
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
2530 "Dropping message with invalid sequence number type");
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2531 free_tv(listtv);
7885
6e6f829af138 commit https://github.com/vim/vim/commit/df5b27b20ec023274fb0f5347973d5abcde7ddd6
Christian Brabandt <cb@256bit.org>
parents: 7883
diff changeset
2532 return FALSE;
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2533 }
8159
d0958e22d9ff commit https://github.com/vim/vim/commit/ece61b06ef4726515177c9b293e1c20d2122a73f
Christian Brabandt <cb@256bit.org>
parents: 8157
diff changeset
2534 seq_nr = argv[0].vval.v_number;
7840
28f569c7dab9 commit https://github.com/vim/vim/commit/20fb9f346497daca4d19402fdfa5de7958642477
Christian Brabandt <cb@256bit.org>
parents: 7817
diff changeset
2535 }
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
2536 else if (channel_peek(channel, part) == NULL)
7899
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
2537 {
8084
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
2538 /* nothing to read on RAW or NL channel */
7899
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
2539 return FALSE;
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
2540 }
7788
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
2541 else
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
2542 {
8267
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
2543 /* If there is no callback or buffer drop the message. */
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
2544 if (callback == NULL && buffer == NULL)
8084
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
2545 {
9007
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
2546 /* If there is a close callback it may use ch_read() to get the
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
2547 * messages. */
10426
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2548 if (channel->ch_close_cb == NULL && !channel->ch_drop_never)
9007
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
2549 drop_messages(channel, part);
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
2550 return FALSE;
8084
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
2551 }
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
2552
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
2553 if (ch_mode == MODE_NL)
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
2554 {
10249
920c73a27dda commit https://github.com/vim/vim/commit/ec68a99464055029c01082762517e97245ddae0c
Christian Brabandt <cb@256bit.org>
parents: 10240
diff changeset
2555 char_u *nl = NULL;
8084
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
2556 char_u *buf;
9246
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
2557 readq_T *node;
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
2558
8084
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
2559 /* See if we have a message ending in NL in the first buffer. If
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
2560 * not try to concatenate the first and the second buffer. */
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
2561 while (TRUE)
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
2562 {
9246
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
2563 node = channel_peek(channel, part);
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
2564 nl = channel_first_nl(node);
8084
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
2565 if (nl != NULL)
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
2566 break;
9215
d2d44592467d commit https://github.com/vim/vim/commit/9ed96efb3d47d46e9637da04656efff715102407
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
2567 if (channel_collapse(channel, part, TRUE) == FAIL)
10249
920c73a27dda commit https://github.com/vim/vim/commit/ec68a99464055029c01082762517e97245ddae0c
Christian Brabandt <cb@256bit.org>
parents: 10240
diff changeset
2568 {
920c73a27dda commit https://github.com/vim/vim/commit/ec68a99464055029c01082762517e97245ddae0c
Christian Brabandt <cb@256bit.org>
parents: 10240
diff changeset
2569 if (ch_part->ch_fd == INVALID_FD && node->rq_buflen > 0)
920c73a27dda commit https://github.com/vim/vim/commit/ec68a99464055029c01082762517e97245ddae0c
Christian Brabandt <cb@256bit.org>
parents: 10240
diff changeset
2570 break;
8084
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
2571 return FALSE; /* incomplete message */
10249
920c73a27dda commit https://github.com/vim/vim/commit/ec68a99464055029c01082762517e97245ddae0c
Christian Brabandt <cb@256bit.org>
parents: 10240
diff changeset
2572 }
8084
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
2573 }
9246
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
2574 buf = node->rq_buffer;
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
2575
10249
920c73a27dda commit https://github.com/vim/vim/commit/ec68a99464055029c01082762517e97245ddae0c
Christian Brabandt <cb@256bit.org>
parents: 10240
diff changeset
2576 if (nl == NULL)
920c73a27dda commit https://github.com/vim/vim/commit/ec68a99464055029c01082762517e97245ddae0c
Christian Brabandt <cb@256bit.org>
parents: 10240
diff changeset
2577 {
920c73a27dda commit https://github.com/vim/vim/commit/ec68a99464055029c01082762517e97245ddae0c
Christian Brabandt <cb@256bit.org>
parents: 10240
diff changeset
2578 /* Flush remaining message that is missing a NL. */
11317
e45c6e4d78af patch 8.0.0544: cppcheck warnings
Christian Brabandt <cb@256bit.org>
parents: 10996
diff changeset
2579 char_u *new_buf;
e45c6e4d78af patch 8.0.0544: cppcheck warnings
Christian Brabandt <cb@256bit.org>
parents: 10996
diff changeset
2580
e45c6e4d78af patch 8.0.0544: cppcheck warnings
Christian Brabandt <cb@256bit.org>
parents: 10996
diff changeset
2581 new_buf = vim_realloc(buf, node->rq_buflen + 1);
e45c6e4d78af patch 8.0.0544: cppcheck warnings
Christian Brabandt <cb@256bit.org>
parents: 10996
diff changeset
2582 if (new_buf == NULL)
e45c6e4d78af patch 8.0.0544: cppcheck warnings
Christian Brabandt <cb@256bit.org>
parents: 10996
diff changeset
2583 /* This might fail over and over again, should the message
e45c6e4d78af patch 8.0.0544: cppcheck warnings
Christian Brabandt <cb@256bit.org>
parents: 10996
diff changeset
2584 * be dropped? */
10249
920c73a27dda commit https://github.com/vim/vim/commit/ec68a99464055029c01082762517e97245ddae0c
Christian Brabandt <cb@256bit.org>
parents: 10240
diff changeset
2585 return FALSE;
11317
e45c6e4d78af patch 8.0.0544: cppcheck warnings
Christian Brabandt <cb@256bit.org>
parents: 10996
diff changeset
2586 buf = new_buf;
10249
920c73a27dda commit https://github.com/vim/vim/commit/ec68a99464055029c01082762517e97245ddae0c
Christian Brabandt <cb@256bit.org>
parents: 10240
diff changeset
2587 node->rq_buffer = buf;
920c73a27dda commit https://github.com/vim/vim/commit/ec68a99464055029c01082762517e97245ddae0c
Christian Brabandt <cb@256bit.org>
parents: 10240
diff changeset
2588 nl = buf + node->rq_buflen++;
920c73a27dda commit https://github.com/vim/vim/commit/ec68a99464055029c01082762517e97245ddae0c
Christian Brabandt <cb@256bit.org>
parents: 10240
diff changeset
2589 *nl = NUL;
920c73a27dda commit https://github.com/vim/vim/commit/ec68a99464055029c01082762517e97245ddae0c
Christian Brabandt <cb@256bit.org>
parents: 10240
diff changeset
2590 }
920c73a27dda commit https://github.com/vim/vim/commit/ec68a99464055029c01082762517e97245ddae0c
Christian Brabandt <cb@256bit.org>
parents: 10240
diff changeset
2591
9246
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
2592 /* Convert NUL to NL, the internal representation. */
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
2593 for (p = buf; p < nl && p < buf + node->rq_buflen; ++p)
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
2594 if (*p == NUL)
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
2595 *p = NL;
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
2596
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
2597 if (nl + 1 == buf + node->rq_buflen)
8267
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
2598 {
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
2599 /* get the whole buffer, drop the NL */
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
2600 msg = channel_get(channel, part);
8267
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
2601 *nl = NUL;
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
2602 }
8084
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
2603 else
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
2604 {
9246
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
2605 /* Copy the message into allocated memory (excluding the NL)
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
2606 * and remove it from the buffer (including the NL). */
8084
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
2607 msg = vim_strnsave(buf, (int)(nl - buf));
9246
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
2608 channel_consume(channel, part, (int)(nl - buf) + 1);
8084
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
2609 }
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
2610 }
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
2611 else
9246
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
2612 {
8084
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
2613 /* For a raw channel we don't know where the message ends, just
9246
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
2614 * get everything we have.
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
2615 * Convert NUL to NL, the internal representation. */
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
2616 msg = channel_get_all(channel, part);
9246
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
2617 }
8084
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
2618
8358
49d0e094cb93 commit https://github.com/vim/vim/commit/bf73b91c664488ca57e2b4a8eb9b1f36f6625bc7
Christian Brabandt <cb@256bit.org>
parents: 8356
diff changeset
2619 if (msg == NULL)
49d0e094cb93 commit https://github.com/vim/vim/commit/bf73b91c664488ca57e2b4a8eb9b1f36f6625bc7
Christian Brabandt <cb@256bit.org>
parents: 8356
diff changeset
2620 return FALSE; /* out of memory (and avoids Coverity warning) */
49d0e094cb93 commit https://github.com/vim/vim/commit/bf73b91c664488ca57e2b4a8eb9b1f36f6625bc7
Christian Brabandt <cb@256bit.org>
parents: 8356
diff changeset
2621
7788
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
2622 argv[1].v_type = VAR_STRING;
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
2623 argv[1].vval.v_string = msg;
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
2624 }
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
2625
7933
1f0743f4f88f commit https://github.com/vim/vim/commit/a07fec9c85d062acd9dd433a2e681770f459ba47
Christian Brabandt <cb@256bit.org>
parents: 7931
diff changeset
2626 if (seq_nr > 0)
7788
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
2627 {
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
2628 int done = FALSE;
7933
1f0743f4f88f commit https://github.com/vim/vim/commit/a07fec9c85d062acd9dd433a2e681770f459ba47
Christian Brabandt <cb@256bit.org>
parents: 7931
diff changeset
2629
10426
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2630 /* JSON or JS mode: invoke the one-time callback with the matching nr */
8404
8894d595b786 commit https://github.com/vim/vim/commit/5983ad0b038fa689653246cb304fd43e8ae39a78
Christian Brabandt <cb@256bit.org>
parents: 8386
diff changeset
2631 for (cbitem = cbhead->cq_next; cbitem != NULL; cbitem = cbitem->cq_next)
8382
3dbe93a240d8 commit https://github.com/vim/vim/commit/d6547fc6471d9084f942bdc4ae3aedb39361751d
Christian Brabandt <cb@256bit.org>
parents: 8358
diff changeset
2632 if (cbitem->cq_seq_nr == seq_nr)
7933
1f0743f4f88f commit https://github.com/vim/vim/commit/a07fec9c85d062acd9dd433a2e681770f459ba47
Christian Brabandt <cb@256bit.org>
parents: 7931
diff changeset
2633 {
8382
3dbe93a240d8 commit https://github.com/vim/vim/commit/d6547fc6471d9084f942bdc4ae3aedb39361751d
Christian Brabandt <cb@256bit.org>
parents: 8358
diff changeset
2634 invoke_one_time_callback(channel, cbhead, cbitem, argv);
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
2635 done = TRUE;
7933
1f0743f4f88f commit https://github.com/vim/vim/commit/a07fec9c85d062acd9dd433a2e681770f459ba47
Christian Brabandt <cb@256bit.org>
parents: 7931
diff changeset
2636 break;
1f0743f4f88f commit https://github.com/vim/vim/commit/a07fec9c85d062acd9dd433a2e681770f459ba47
Christian Brabandt <cb@256bit.org>
parents: 7931
diff changeset
2637 }
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
2638 if (!done)
10426
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2639 {
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2640 if (channel->ch_drop_never)
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2641 {
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2642 /* message must be read with ch_read() */
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2643 channel_push_json(channel, part, listtv);
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2644 listtv = NULL;
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2645 }
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2646 else
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2647 ch_logn(channel, "Dropping message %d without callback",
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2648 seq_nr);
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2649 }
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2650 }
8267
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
2651 else if (callback != NULL || buffer != NULL)
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2652 {
8267
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
2653 if (buffer != NULL)
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
2654 {
8346
8fa75a4c39bd commit https://github.com/vim/vim/commit/cc7f8be3e0e6c4d902b02052a862e21c3a3fbe22
Christian Brabandt <cb@256bit.org>
parents: 8334
diff changeset
2655 if (msg == NULL)
8fa75a4c39bd commit https://github.com/vim/vim/commit/cc7f8be3e0e6c4d902b02052a862e21c3a3fbe22
Christian Brabandt <cb@256bit.org>
parents: 8334
diff changeset
2656 /* JSON or JS mode: re-encode the message. */
8fa75a4c39bd commit https://github.com/vim/vim/commit/cc7f8be3e0e6c4d902b02052a862e21c3a3fbe22
Christian Brabandt <cb@256bit.org>
parents: 8334
diff changeset
2657 msg = json_encode(listtv, ch_mode);
8fa75a4c39bd commit https://github.com/vim/vim/commit/cc7f8be3e0e6c4d902b02052a862e21c3a3fbe22
Christian Brabandt <cb@256bit.org>
parents: 8334
diff changeset
2658 if (msg != NULL)
11670
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11666
diff changeset
2659 {
11672
3c6cc2f24645 patch 8.0.0719: build failure without +terminal feature
Christian Brabandt <cb@256bit.org>
parents: 11670
diff changeset
2660 #ifdef FEAT_TERMINAL
11670
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11666
diff changeset
2661 if (buffer->b_term != NULL)
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11666
diff changeset
2662 write_to_term(buffer, msg, channel);
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11666
diff changeset
2663 else
11672
3c6cc2f24645 patch 8.0.0719: build failure without +terminal feature
Christian Brabandt <cb@256bit.org>
parents: 11670
diff changeset
2664 #endif
11670
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11666
diff changeset
2665 append_to_buffer(buffer, msg, channel, part);
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11666
diff changeset
2666 }
8267
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
2667 }
8382
3dbe93a240d8 commit https://github.com/vim/vim/commit/d6547fc6471d9084f942bdc4ae3aedb39361751d
Christian Brabandt <cb@256bit.org>
parents: 8358
diff changeset
2668
8267
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
2669 if (callback != NULL)
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
2670 {
8382
3dbe93a240d8 commit https://github.com/vim/vim/commit/d6547fc6471d9084f942bdc4ae3aedb39361751d
Christian Brabandt <cb@256bit.org>
parents: 8358
diff changeset
2671 if (cbitem != NULL)
3dbe93a240d8 commit https://github.com/vim/vim/commit/d6547fc6471d9084f942bdc4ae3aedb39361751d
Christian Brabandt <cb@256bit.org>
parents: 8358
diff changeset
2672 invoke_one_time_callback(channel, cbhead, cbitem, argv);
3dbe93a240d8 commit https://github.com/vim/vim/commit/d6547fc6471d9084f942bdc4ae3aedb39361751d
Christian Brabandt <cb@256bit.org>
parents: 8358
diff changeset
2673 else
3dbe93a240d8 commit https://github.com/vim/vim/commit/d6547fc6471d9084f942bdc4ae3aedb39361751d
Christian Brabandt <cb@256bit.org>
parents: 8358
diff changeset
2674 {
3dbe93a240d8 commit https://github.com/vim/vim/commit/d6547fc6471d9084f942bdc4ae3aedb39361751d
Christian Brabandt <cb@256bit.org>
parents: 8358
diff changeset
2675 /* invoke the channel callback */
3dbe93a240d8 commit https://github.com/vim/vim/commit/d6547fc6471d9084f942bdc4ae3aedb39361751d
Christian Brabandt <cb@256bit.org>
parents: 8358
diff changeset
2676 ch_logs(channel, "Invoking channel callback %s",
3dbe93a240d8 commit https://github.com/vim/vim/commit/d6547fc6471d9084f942bdc4ae3aedb39361751d
Christian Brabandt <cb@256bit.org>
parents: 8358
diff changeset
2677 (char *)callback);
8538
c337c813c64d commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents: 8508
diff changeset
2678 invoke_callback(channel, callback, partial, argv);
8382
3dbe93a240d8 commit https://github.com/vim/vim/commit/d6547fc6471d9084f942bdc4ae3aedb39361751d
Christian Brabandt <cb@256bit.org>
parents: 8358
diff changeset
2679 }
8267
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
2680 }
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2681 }
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
2682 else
10426
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2683 ch_logn(channel, "Dropping message %d", seq_nr);
7788
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
2684
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
2685 if (listtv != NULL)
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2686 free_tv(listtv);
7840
28f569c7dab9 commit https://github.com/vim/vim/commit/20fb9f346497daca4d19402fdfa5de7958642477
Christian Brabandt <cb@256bit.org>
parents: 7817
diff changeset
2687 vim_free(msg);
7885
6e6f829af138 commit https://github.com/vim/vim/commit/df5b27b20ec023274fb0f5347973d5abcde7ddd6
Christian Brabandt <cb@256bit.org>
parents: 7883
diff changeset
2688
6e6f829af138 commit https://github.com/vim/vim/commit/df5b27b20ec023274fb0f5347973d5abcde7ddd6
Christian Brabandt <cb@256bit.org>
parents: 7883
diff changeset
2689 return TRUE;
7788
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
2690 }
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
2691
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
2692 /*
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2693 * Return TRUE when channel "channel" is open for writing to.
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2694 * Also returns FALSE or invalid "channel".
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
2695 */
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
2696 int
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2697 channel_can_write_to(channel_T *channel)
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
2698 {
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
2699 return channel != NULL && (channel->CH_SOCK_FD != INVALID_FD
8493
caed4b2d305f commit https://github.com/vim/vim/commit/509ce2a558e7e0c03242e32e844255af52f1c821
Christian Brabandt <cb@256bit.org>
parents: 8491
diff changeset
2700 || channel->CH_IN_FD != INVALID_FD);
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
2701 }
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
2702
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
2703 /*
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2704 * Return TRUE when channel "channel" is open for reading or writing.
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2705 * Also returns FALSE for invalid "channel".
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
2706 */
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
2707 int
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2708 channel_is_open(channel_T *channel)
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
2709 {
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
2710 return channel != NULL && (channel->CH_SOCK_FD != INVALID_FD
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
2711 || channel->CH_IN_FD != INVALID_FD
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
2712 || channel->CH_OUT_FD != INVALID_FD
8493
caed4b2d305f commit https://github.com/vim/vim/commit/509ce2a558e7e0c03242e32e844255af52f1c821
Christian Brabandt <cb@256bit.org>
parents: 8491
diff changeset
2713 || channel->CH_ERR_FD != INVALID_FD);
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
2714 }
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
2715
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
2716 /*
9007
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
2717 * Return TRUE if "channel" has JSON or other typeahead.
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
2718 */
10422
e664ee056a84 commit https://github.com/vim/vim/commit/4b785f69c0616dba5d3f38e8ce4b5398cec89407
Christian Brabandt <cb@256bit.org>
parents: 10418
diff changeset
2719 int
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
2720 channel_has_readahead(channel_T *channel, ch_part_T part)
9007
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
2721 {
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
2722 ch_mode_T ch_mode = channel->ch_part[part].ch_mode;
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
2723
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
2724 if (ch_mode == MODE_JSON || ch_mode == MODE_JS)
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
2725 {
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
2726 jsonq_T *head = &channel->ch_part[part].ch_json_head;
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
2727 jsonq_T *item = head->jq_next;
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
2728
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
2729 return item != NULL;
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
2730 }
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
2731 return channel_peek(channel, part) != NULL;
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
2732 }
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
2733
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
2734 /*
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2735 * Return a string indicating the status of the channel.
10233
d709622a18c9 commit https://github.com/vim/vim/commit/7ef3810d28b7ab2edbfcafab3fe8ad8bc2c2f138
Christian Brabandt <cb@256bit.org>
parents: 10147
diff changeset
2736 * If "req_part" is not negative check that part.
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2737 */
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2738 char *
10233
d709622a18c9 commit https://github.com/vim/vim/commit/7ef3810d28b7ab2edbfcafab3fe8ad8bc2c2f138
Christian Brabandt <cb@256bit.org>
parents: 10147
diff changeset
2739 channel_status(channel_T *channel, int req_part)
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2740 {
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
2741 ch_part_T part;
9007
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
2742 int has_readahead = FALSE;
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
2743
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2744 if (channel == NULL)
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2745 return "fail";
10233
d709622a18c9 commit https://github.com/vim/vim/commit/7ef3810d28b7ab2edbfcafab3fe8ad8bc2c2f138
Christian Brabandt <cb@256bit.org>
parents: 10147
diff changeset
2746 if (req_part == PART_OUT)
d709622a18c9 commit https://github.com/vim/vim/commit/7ef3810d28b7ab2edbfcafab3fe8ad8bc2c2f138
Christian Brabandt <cb@256bit.org>
parents: 10147
diff changeset
2747 {
d709622a18c9 commit https://github.com/vim/vim/commit/7ef3810d28b7ab2edbfcafab3fe8ad8bc2c2f138
Christian Brabandt <cb@256bit.org>
parents: 10147
diff changeset
2748 if (channel->CH_OUT_FD != INVALID_FD)
d709622a18c9 commit https://github.com/vim/vim/commit/7ef3810d28b7ab2edbfcafab3fe8ad8bc2c2f138
Christian Brabandt <cb@256bit.org>
parents: 10147
diff changeset
2749 return "open";
d709622a18c9 commit https://github.com/vim/vim/commit/7ef3810d28b7ab2edbfcafab3fe8ad8bc2c2f138
Christian Brabandt <cb@256bit.org>
parents: 10147
diff changeset
2750 if (channel_has_readahead(channel, PART_OUT))
d709622a18c9 commit https://github.com/vim/vim/commit/7ef3810d28b7ab2edbfcafab3fe8ad8bc2c2f138
Christian Brabandt <cb@256bit.org>
parents: 10147
diff changeset
2751 has_readahead = TRUE;
d709622a18c9 commit https://github.com/vim/vim/commit/7ef3810d28b7ab2edbfcafab3fe8ad8bc2c2f138
Christian Brabandt <cb@256bit.org>
parents: 10147
diff changeset
2752 }
d709622a18c9 commit https://github.com/vim/vim/commit/7ef3810d28b7ab2edbfcafab3fe8ad8bc2c2f138
Christian Brabandt <cb@256bit.org>
parents: 10147
diff changeset
2753 else if (req_part == PART_ERR)
d709622a18c9 commit https://github.com/vim/vim/commit/7ef3810d28b7ab2edbfcafab3fe8ad8bc2c2f138
Christian Brabandt <cb@256bit.org>
parents: 10147
diff changeset
2754 {
d709622a18c9 commit https://github.com/vim/vim/commit/7ef3810d28b7ab2edbfcafab3fe8ad8bc2c2f138
Christian Brabandt <cb@256bit.org>
parents: 10147
diff changeset
2755 if (channel->CH_ERR_FD != INVALID_FD)
d709622a18c9 commit https://github.com/vim/vim/commit/7ef3810d28b7ab2edbfcafab3fe8ad8bc2c2f138
Christian Brabandt <cb@256bit.org>
parents: 10147
diff changeset
2756 return "open";
d709622a18c9 commit https://github.com/vim/vim/commit/7ef3810d28b7ab2edbfcafab3fe8ad8bc2c2f138
Christian Brabandt <cb@256bit.org>
parents: 10147
diff changeset
2757 if (channel_has_readahead(channel, PART_ERR))
9007
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
2758 has_readahead = TRUE;
10233
d709622a18c9 commit https://github.com/vim/vim/commit/7ef3810d28b7ab2edbfcafab3fe8ad8bc2c2f138
Christian Brabandt <cb@256bit.org>
parents: 10147
diff changeset
2759 }
d709622a18c9 commit https://github.com/vim/vim/commit/7ef3810d28b7ab2edbfcafab3fe8ad8bc2c2f138
Christian Brabandt <cb@256bit.org>
parents: 10147
diff changeset
2760 else
d709622a18c9 commit https://github.com/vim/vim/commit/7ef3810d28b7ab2edbfcafab3fe8ad8bc2c2f138
Christian Brabandt <cb@256bit.org>
parents: 10147
diff changeset
2761 {
d709622a18c9 commit https://github.com/vim/vim/commit/7ef3810d28b7ab2edbfcafab3fe8ad8bc2c2f138
Christian Brabandt <cb@256bit.org>
parents: 10147
diff changeset
2762 if (channel_is_open(channel))
d709622a18c9 commit https://github.com/vim/vim/commit/7ef3810d28b7ab2edbfcafab3fe8ad8bc2c2f138
Christian Brabandt <cb@256bit.org>
parents: 10147
diff changeset
2763 return "open";
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
2764 for (part = PART_SOCK; part < PART_IN; ++part)
10233
d709622a18c9 commit https://github.com/vim/vim/commit/7ef3810d28b7ab2edbfcafab3fe8ad8bc2c2f138
Christian Brabandt <cb@256bit.org>
parents: 10147
diff changeset
2765 if (channel_has_readahead(channel, part))
d709622a18c9 commit https://github.com/vim/vim/commit/7ef3810d28b7ab2edbfcafab3fe8ad8bc2c2f138
Christian Brabandt <cb@256bit.org>
parents: 10147
diff changeset
2766 {
d709622a18c9 commit https://github.com/vim/vim/commit/7ef3810d28b7ab2edbfcafab3fe8ad8bc2c2f138
Christian Brabandt <cb@256bit.org>
parents: 10147
diff changeset
2767 has_readahead = TRUE;
d709622a18c9 commit https://github.com/vim/vim/commit/7ef3810d28b7ab2edbfcafab3fe8ad8bc2c2f138
Christian Brabandt <cb@256bit.org>
parents: 10147
diff changeset
2768 break;
d709622a18c9 commit https://github.com/vim/vim/commit/7ef3810d28b7ab2edbfcafab3fe8ad8bc2c2f138
Christian Brabandt <cb@256bit.org>
parents: 10147
diff changeset
2769 }
d709622a18c9 commit https://github.com/vim/vim/commit/7ef3810d28b7ab2edbfcafab3fe8ad8bc2c2f138
Christian Brabandt <cb@256bit.org>
parents: 10147
diff changeset
2770 }
9007
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
2771
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
2772 if (has_readahead)
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
2773 return "buffered";
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2774 return "closed";
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2775 }
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2776
8669
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2777 static void
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
2778 channel_part_info(channel_T *channel, dict_T *dict, char *name, ch_part_T part)
8669
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2779 {
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2780 chanpart_T *chanpart = &channel->ch_part[part];
8783
23b7f05a7f48 commit https://github.com/vim/vim/commit/925ccfde79bf734bc89269c705cebe2d49fe6444
Christian Brabandt <cb@256bit.org>
parents: 8761
diff changeset
2781 char namebuf[20]; /* longest is "sock_timeout" */
8678
a4e7f4a62193 commit https://github.com/vim/vim/commit/3f3fbd3fdb73bdfbfeab22a9dfc7a25e38bdf5f6
Christian Brabandt <cb@256bit.org>
parents: 8669
diff changeset
2782 size_t tail;
10233
d709622a18c9 commit https://github.com/vim/vim/commit/7ef3810d28b7ab2edbfcafab3fe8ad8bc2c2f138
Christian Brabandt <cb@256bit.org>
parents: 10147
diff changeset
2783 char *status;
8684
6e567914f55a commit https://github.com/vim/vim/commit/573e445664eef399a72b1bfc975260a639605fef
Christian Brabandt <cb@256bit.org>
parents: 8678
diff changeset
2784 char *s = "";
8669
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2785
8783
23b7f05a7f48 commit https://github.com/vim/vim/commit/925ccfde79bf734bc89269c705cebe2d49fe6444
Christian Brabandt <cb@256bit.org>
parents: 8761
diff changeset
2786 vim_strncpy((char_u *)namebuf, (char_u *)name, 4);
8669
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2787 STRCAT(namebuf, "_");
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2788 tail = STRLEN(namebuf);
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2789
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2790 STRCPY(namebuf + tail, "status");
10233
d709622a18c9 commit https://github.com/vim/vim/commit/7ef3810d28b7ab2edbfcafab3fe8ad8bc2c2f138
Christian Brabandt <cb@256bit.org>
parents: 10147
diff changeset
2791 if (chanpart->ch_fd != INVALID_FD)
d709622a18c9 commit https://github.com/vim/vim/commit/7ef3810d28b7ab2edbfcafab3fe8ad8bc2c2f138
Christian Brabandt <cb@256bit.org>
parents: 10147
diff changeset
2792 status = "open";
d709622a18c9 commit https://github.com/vim/vim/commit/7ef3810d28b7ab2edbfcafab3fe8ad8bc2c2f138
Christian Brabandt <cb@256bit.org>
parents: 10147
diff changeset
2793 else if (channel_has_readahead(channel, part))
d709622a18c9 commit https://github.com/vim/vim/commit/7ef3810d28b7ab2edbfcafab3fe8ad8bc2c2f138
Christian Brabandt <cb@256bit.org>
parents: 10147
diff changeset
2794 status = "buffered";
d709622a18c9 commit https://github.com/vim/vim/commit/7ef3810d28b7ab2edbfcafab3fe8ad8bc2c2f138
Christian Brabandt <cb@256bit.org>
parents: 10147
diff changeset
2795 else
d709622a18c9 commit https://github.com/vim/vim/commit/7ef3810d28b7ab2edbfcafab3fe8ad8bc2c2f138
Christian Brabandt <cb@256bit.org>
parents: 10147
diff changeset
2796 status = "closed";
d709622a18c9 commit https://github.com/vim/vim/commit/7ef3810d28b7ab2edbfcafab3fe8ad8bc2c2f138
Christian Brabandt <cb@256bit.org>
parents: 10147
diff changeset
2797 dict_add_nr_str(dict, namebuf, 0, (char_u *)status);
8669
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2798
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2799 STRCPY(namebuf + tail, "mode");
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2800 switch (chanpart->ch_mode)
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2801 {
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2802 case MODE_NL: s = "NL"; break;
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2803 case MODE_RAW: s = "RAW"; break;
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2804 case MODE_JSON: s = "JSON"; break;
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2805 case MODE_JS: s = "JS"; break;
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2806 }
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2807 dict_add_nr_str(dict, namebuf, 0, (char_u *)s);
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2808
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2809 STRCPY(namebuf + tail, "io");
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2810 if (part == PART_SOCK)
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2811 s = "socket";
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2812 else switch (chanpart->ch_io)
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2813 {
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2814 case JIO_NULL: s = "null"; break;
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2815 case JIO_PIPE: s = "pipe"; break;
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2816 case JIO_FILE: s = "file"; break;
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2817 case JIO_BUFFER: s = "buffer"; break;
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2818 case JIO_OUT: s = "out"; break;
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2819 }
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2820 dict_add_nr_str(dict, namebuf, 0, (char_u *)s);
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2821
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2822 STRCPY(namebuf + tail, "timeout");
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2823 dict_add_nr_str(dict, namebuf, chanpart->ch_timeout, NULL);
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2824 }
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2825
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2826 void
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2827 channel_info(channel_T *channel, dict_T *dict)
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2828 {
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2829 dict_add_nr_str(dict, "id", channel->ch_id, NULL);
10233
d709622a18c9 commit https://github.com/vim/vim/commit/7ef3810d28b7ab2edbfcafab3fe8ad8bc2c2f138
Christian Brabandt <cb@256bit.org>
parents: 10147
diff changeset
2830 dict_add_nr_str(dict, "status", 0, (char_u *)channel_status(channel, -1));
8669
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2831
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2832 if (channel->ch_hostname != NULL)
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2833 {
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2834 dict_add_nr_str(dict, "hostname", 0, (char_u *)channel->ch_hostname);
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2835 dict_add_nr_str(dict, "port", channel->ch_port, NULL);
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2836 channel_part_info(channel, dict, "sock", PART_SOCK);
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2837 }
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2838 else
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2839 {
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2840 channel_part_info(channel, dict, "out", PART_OUT);
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2841 channel_part_info(channel, dict, "err", PART_ERR);
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2842 channel_part_info(channel, dict, "in", PART_IN);
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2843 }
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2844 }
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2845
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2846 /*
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2847 * Close channel "channel".
8257
c4ffdda8cdfd commit https://github.com/vim/vim/commit/c8dcbb12c5d7f3eb0c334daebb4475bb015b91e7
Christian Brabandt <cb@256bit.org>
parents: 8240
diff changeset
2848 * Trigger the close callback if "invoke_close_cb" is TRUE.
8267
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
2849 * Does not clear the buffers.
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
2850 */
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
2851 void
8240
60586ce747c4 commit https://github.com/vim/vim/commit/8b374215ccd35003b95ba1df8f12e03bf8a8adc3
Christian Brabandt <cb@256bit.org>
parents: 8222
diff changeset
2852 channel_close(channel_T *channel, int invoke_close_cb)
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
2853 {
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
2854 ch_log(channel, "Closing channel");
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
2855
8049
15253130abd8 commit https://github.com/vim/vim/commit/16eb4f88000cfdba68df6c421fe44e7e029ba53e
Christian Brabandt <cb@256bit.org>
parents: 8047
diff changeset
2856 #ifdef FEAT_GUI
15253130abd8 commit https://github.com/vim/vim/commit/16eb4f88000cfdba68df6c421fe44e7e029ba53e
Christian Brabandt <cb@256bit.org>
parents: 8047
diff changeset
2857 channel_gui_unregister(channel);
15253130abd8 commit https://github.com/vim/vim/commit/16eb4f88000cfdba68df6c421fe44e7e029ba53e
Christian Brabandt <cb@256bit.org>
parents: 8047
diff changeset
2858 #endif
15253130abd8 commit https://github.com/vim/vim/commit/16eb4f88000cfdba68df6c421fe44e7e029ba53e
Christian Brabandt <cb@256bit.org>
parents: 8047
diff changeset
2859
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
2860 ch_close_part(channel, PART_SOCK);
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
2861 ch_close_part(channel, PART_IN);
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
2862 ch_close_part(channel, PART_OUT);
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
2863 ch_close_part(channel, PART_ERR);
8049
15253130abd8 commit https://github.com/vim/vim/commit/16eb4f88000cfdba68df6c421fe44e7e029ba53e
Christian Brabandt <cb@256bit.org>
parents: 8047
diff changeset
2864
8240
60586ce747c4 commit https://github.com/vim/vim/commit/8b374215ccd35003b95ba1df8f12e03bf8a8adc3
Christian Brabandt <cb@256bit.org>
parents: 8222
diff changeset
2865 if (invoke_close_cb && channel->ch_close_cb != NULL)
8210
b717dae2f26d commit https://github.com/vim/vim/commit/4e221c99e85ed40c98892068a01270b9e7492d98
Christian Brabandt <cb@256bit.org>
parents: 8204
diff changeset
2866 {
b717dae2f26d commit https://github.com/vim/vim/commit/4e221c99e85ed40c98892068a01270b9e7492d98
Christian Brabandt <cb@256bit.org>
parents: 8204
diff changeset
2867 typval_T argv[1];
b717dae2f26d commit https://github.com/vim/vim/commit/4e221c99e85ed40c98892068a01270b9e7492d98
Christian Brabandt <cb@256bit.org>
parents: 8204
diff changeset
2868 typval_T rettv;
b717dae2f26d commit https://github.com/vim/vim/commit/4e221c99e85ed40c98892068a01270b9e7492d98
Christian Brabandt <cb@256bit.org>
parents: 8204
diff changeset
2869 int dummy;
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
2870 ch_part_T part;
9003
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
2871
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
2872 /* Invoke callbacks before the close callback, since it's weird to
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
2873 * first invoke the close callback. Increment the refcount to avoid
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
2874 * the channel being freed halfway. */
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
2875 ++channel->ch_refcount;
9044
5abf6f38cbbb commit https://github.com/vim/vim/commit/d75263c020a5044fa73bc8cd57ce73ca5e23b360
Christian Brabandt <cb@256bit.org>
parents: 9011
diff changeset
2876 ch_log(channel, "Invoking callbacks before closing");
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
2877 for (part = PART_SOCK; part < PART_IN; ++part)
9003
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
2878 while (may_invoke_callback(channel, part))
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
2879 ;
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
2880
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
2881 /* Invoke the close callback, if still set. */
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
2882 if (channel->ch_close_cb != NULL)
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
2883 {
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
2884 ch_logs(channel, "Invoking close callback %s",
8310
aec8f8ce8e4c commit https://github.com/vim/vim/commit/d6051b5eb83687f60bb4a2f3d5cd23fe8b290eb4
Christian Brabandt <cb@256bit.org>
parents: 8297
diff changeset
2885 (char *)channel->ch_close_cb);
9003
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
2886 argv[0].v_type = VAR_CHANNEL;
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
2887 argv[0].vval.v_channel = channel;
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
2888 call_func(channel->ch_close_cb, (int)STRLEN(channel->ch_close_cb),
9626
172131507c85 commit https://github.com/vim/vim/commit/df48fb456fb6bf63d94cad9b302ff01d8ee8d311
Christian Brabandt <cb@256bit.org>
parents: 9529
diff changeset
2889 &rettv, 1, argv, NULL, 0L, 0L, &dummy, TRUE,
8538
c337c813c64d commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents: 8508
diff changeset
2890 channel->ch_close_partial, NULL);
9003
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
2891 clear_tv(&rettv);
9064
a86103d4b356 commit https://github.com/vim/vim/commit/cefe4f994853c2d4866e2aa4ea3e3f36ab2fea13
Christian Brabandt <cb@256bit.org>
parents: 9058
diff changeset
2892 channel_need_redraw = TRUE;
9003
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
2893 }
8210
b717dae2f26d commit https://github.com/vim/vim/commit/4e221c99e85ed40c98892068a01270b9e7492d98
Christian Brabandt <cb@256bit.org>
parents: 8204
diff changeset
2894
b717dae2f26d commit https://github.com/vim/vim/commit/4e221c99e85ed40c98892068a01270b9e7492d98
Christian Brabandt <cb@256bit.org>
parents: 8204
diff changeset
2895 /* the callback is only called once */
9491
404de131cff9 commit https://github.com/vim/vim/commit/1436d8d51cce114be56209924fc71376407e5bad
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
2896 free_callback(channel->ch_close_cb, channel->ch_close_partial);
8210
b717dae2f26d commit https://github.com/vim/vim/commit/4e221c99e85ed40c98892068a01270b9e7492d98
Christian Brabandt <cb@256bit.org>
parents: 8204
diff changeset
2897 channel->ch_close_cb = NULL;
8538
c337c813c64d commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents: 8508
diff changeset
2898 channel->ch_close_partial = NULL;
9007
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
2899
9139
ddca37101ffb commit https://github.com/vim/vim/commit/28ae5773422c2cf61aaf8d9d2b9fae70642d6a33
Christian Brabandt <cb@256bit.org>
parents: 9133
diff changeset
2900 --channel->ch_refcount;
ddca37101ffb commit https://github.com/vim/vim/commit/28ae5773422c2cf61aaf8d9d2b9fae70642d6a33
Christian Brabandt <cb@256bit.org>
parents: 9133
diff changeset
2901
9064
a86103d4b356 commit https://github.com/vim/vim/commit/cefe4f994853c2d4866e2aa4ea3e3f36ab2fea13
Christian Brabandt <cb@256bit.org>
parents: 9058
diff changeset
2902 if (channel_need_redraw)
a86103d4b356 commit https://github.com/vim/vim/commit/cefe4f994853c2d4866e2aa4ea3e3f36ab2fea13
Christian Brabandt <cb@256bit.org>
parents: 9058
diff changeset
2903 {
a86103d4b356 commit https://github.com/vim/vim/commit/cefe4f994853c2d4866e2aa4ea3e3f36ab2fea13
Christian Brabandt <cb@256bit.org>
parents: 9058
diff changeset
2904 channel_need_redraw = FALSE;
a86103d4b356 commit https://github.com/vim/vim/commit/cefe4f994853c2d4866e2aa4ea3e3f36ab2fea13
Christian Brabandt <cb@256bit.org>
parents: 9058
diff changeset
2905 redraw_after_callback();
a86103d4b356 commit https://github.com/vim/vim/commit/cefe4f994853c2d4866e2aa4ea3e3f36ab2fea13
Christian Brabandt <cb@256bit.org>
parents: 9058
diff changeset
2906 }
a86103d4b356 commit https://github.com/vim/vim/commit/cefe4f994853c2d4866e2aa4ea3e3f36ab2fea13
Christian Brabandt <cb@256bit.org>
parents: 9058
diff changeset
2907
10426
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2908 if (!channel->ch_drop_never)
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2909 /* any remaining messages are useless now */
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2910 for (part = PART_SOCK; part < PART_IN; ++part)
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
2911 drop_messages(channel, part);
8210
b717dae2f26d commit https://github.com/vim/vim/commit/4e221c99e85ed40c98892068a01270b9e7492d98
Christian Brabandt <cb@256bit.org>
parents: 8204
diff changeset
2912 }
b717dae2f26d commit https://github.com/vim/vim/commit/4e221c99e85ed40c98892068a01270b9e7492d98
Christian Brabandt <cb@256bit.org>
parents: 8204
diff changeset
2913
b717dae2f26d commit https://github.com/vim/vim/commit/4e221c99e85ed40c98892068a01270b9e7492d98
Christian Brabandt <cb@256bit.org>
parents: 8204
diff changeset
2914 channel->ch_nb_close_cb = NULL;
7743
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
2915 }
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
2916
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
2917 /*
10054
d4b7232fc63a commit https://github.com/vim/vim/commit/0874a83e9be1b39fdb217f02b427bf1d6133a4d8
Christian Brabandt <cb@256bit.org>
parents: 10052
diff changeset
2918 * Close the "in" part channel "channel".
d4b7232fc63a commit https://github.com/vim/vim/commit/0874a83e9be1b39fdb217f02b427bf1d6133a4d8
Christian Brabandt <cb@256bit.org>
parents: 10052
diff changeset
2919 */
d4b7232fc63a commit https://github.com/vim/vim/commit/0874a83e9be1b39fdb217f02b427bf1d6133a4d8
Christian Brabandt <cb@256bit.org>
parents: 10052
diff changeset
2920 void
d4b7232fc63a commit https://github.com/vim/vim/commit/0874a83e9be1b39fdb217f02b427bf1d6133a4d8
Christian Brabandt <cb@256bit.org>
parents: 10052
diff changeset
2921 channel_close_in(channel_T *channel)
d4b7232fc63a commit https://github.com/vim/vim/commit/0874a83e9be1b39fdb217f02b427bf1d6133a4d8
Christian Brabandt <cb@256bit.org>
parents: 10052
diff changeset
2922 {
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
2923 ch_close_part(channel, PART_IN);
10054
d4b7232fc63a commit https://github.com/vim/vim/commit/0874a83e9be1b39fdb217f02b427bf1d6133a4d8
Christian Brabandt <cb@256bit.org>
parents: 10052
diff changeset
2924 }
d4b7232fc63a commit https://github.com/vim/vim/commit/0874a83e9be1b39fdb217f02b427bf1d6133a4d8
Christian Brabandt <cb@256bit.org>
parents: 10052
diff changeset
2925
d4b7232fc63a commit https://github.com/vim/vim/commit/0874a83e9be1b39fdb217f02b427bf1d6133a4d8
Christian Brabandt <cb@256bit.org>
parents: 10052
diff changeset
2926 /*
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
2927 * Clear the read buffer on "channel"/"part".
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
2928 */
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
2929 static void
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
2930 channel_clear_one(channel_T *channel, ch_part_T part)
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
2931 {
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
2932 jsonq_T *json_head = &channel->ch_part[part].ch_json_head;
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
2933 cbq_T *cb_head = &channel->ch_part[part].ch_cb_head;
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
2934
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
2935 while (channel_peek(channel, part) != NULL)
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
2936 vim_free(channel_get(channel, part));
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2937
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2938 while (cb_head->cq_next != NULL)
8074
dc32c8026899 commit https://github.com/vim/vim/commit/d46ae142aa9452e99576b5e923de974704e3c896
Christian Brabandt <cb@256bit.org>
parents: 8072
diff changeset
2939 {
dc32c8026899 commit https://github.com/vim/vim/commit/d46ae142aa9452e99576b5e923de974704e3c896
Christian Brabandt <cb@256bit.org>
parents: 8072
diff changeset
2940 cbq_T *node = cb_head->cq_next;
dc32c8026899 commit https://github.com/vim/vim/commit/d46ae142aa9452e99576b5e923de974704e3c896
Christian Brabandt <cb@256bit.org>
parents: 8072
diff changeset
2941
dc32c8026899 commit https://github.com/vim/vim/commit/d46ae142aa9452e99576b5e923de974704e3c896
Christian Brabandt <cb@256bit.org>
parents: 8072
diff changeset
2942 remove_cb_node(cb_head, node);
9491
404de131cff9 commit https://github.com/vim/vim/commit/1436d8d51cce114be56209924fc71376407e5bad
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
2943 free_callback(node->cq_callback, node->cq_partial);
8074
dc32c8026899 commit https://github.com/vim/vim/commit/d46ae142aa9452e99576b5e923de974704e3c896
Christian Brabandt <cb@256bit.org>
parents: 8072
diff changeset
2944 vim_free(node);
dc32c8026899 commit https://github.com/vim/vim/commit/d46ae142aa9452e99576b5e923de974704e3c896
Christian Brabandt <cb@256bit.org>
parents: 8072
diff changeset
2945 }
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2946
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2947 while (json_head->jq_next != NULL)
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
2948 {
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2949 free_tv(json_head->jq_next->jq_value);
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2950 remove_json_node(json_head, json_head->jq_next);
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
2951 }
8055
6db4b1c863ec commit https://github.com/vim/vim/commit/3bece9fee9c02934d3e295b29d253e13d4ef26a7
Christian Brabandt <cb@256bit.org>
parents: 8049
diff changeset
2952
9491
404de131cff9 commit https://github.com/vim/vim/commit/1436d8d51cce114be56209924fc71376407e5bad
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
2953 free_callback(channel->ch_part[part].ch_callback,
404de131cff9 commit https://github.com/vim/vim/commit/1436d8d51cce114be56209924fc71376407e5bad
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
2954 channel->ch_part[part].ch_partial);
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
2955 channel->ch_part[part].ch_callback = NULL;
8538
c337c813c64d commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents: 8508
diff changeset
2956 channel->ch_part[part].ch_partial = NULL;
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
2957 }
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
2958
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
2959 /*
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
2960 * Clear all the read buffers on "channel".
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
2961 */
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
2962 void
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
2963 channel_clear(channel_T *channel)
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
2964 {
8310
aec8f8ce8e4c commit https://github.com/vim/vim/commit/d6051b5eb83687f60bb4a2f3d5cd23fe8b290eb4
Christian Brabandt <cb@256bit.org>
parents: 8297
diff changeset
2965 ch_log(channel, "Clearing channel");
8669
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2966 vim_free(channel->ch_hostname);
06848fe9c816 commit https://github.com/vim/vim/commit/03602ec28ed25739e88b2c835adb0662d3720bb2
Christian Brabandt <cb@256bit.org>
parents: 8667
diff changeset
2967 channel->ch_hostname = NULL;
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
2968 channel_clear_one(channel, PART_SOCK);
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
2969 channel_clear_one(channel, PART_OUT);
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
2970 channel_clear_one(channel, PART_ERR);
8863
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
2971 /* there is no callback or queue for PART_IN */
9491
404de131cff9 commit https://github.com/vim/vim/commit/1436d8d51cce114be56209924fc71376407e5bad
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
2972 free_callback(channel->ch_callback, channel->ch_partial);
8055
6db4b1c863ec commit https://github.com/vim/vim/commit/3bece9fee9c02934d3e295b29d253e13d4ef26a7
Christian Brabandt <cb@256bit.org>
parents: 8049
diff changeset
2973 channel->ch_callback = NULL;
8538
c337c813c64d commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents: 8508
diff changeset
2974 channel->ch_partial = NULL;
9491
404de131cff9 commit https://github.com/vim/vim/commit/1436d8d51cce114be56209924fc71376407e5bad
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
2975 free_callback(channel->ch_close_cb, channel->ch_close_partial);
8210
b717dae2f26d commit https://github.com/vim/vim/commit/4e221c99e85ed40c98892068a01270b9e7492d98
Christian Brabandt <cb@256bit.org>
parents: 8204
diff changeset
2976 channel->ch_close_cb = NULL;
8538
c337c813c64d commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents: 8508
diff changeset
2977 channel->ch_close_partial = NULL;
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
2978 }
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
2979
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2980 #if defined(EXITFREE) || defined(PROTO)
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2981 void
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2982 channel_free_all(void)
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2983 {
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2984 channel_T *channel;
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2985
8310
aec8f8ce8e4c commit https://github.com/vim/vim/commit/d6051b5eb83687f60bb4a2f3d5cd23fe8b290eb4
Christian Brabandt <cb@256bit.org>
parents: 8297
diff changeset
2986 ch_log(NULL, "channel_free_all()");
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2987 for (channel = first_channel; channel != NULL; channel = channel->ch_next)
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2988 channel_clear(channel);
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2989 }
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2990 #endif
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2991
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
2992
9050
31bba6f25d84 commit https://github.com/vim/vim/commit/715d285d79a1d97928dd717278e25e6de45d1496
Christian Brabandt <cb@256bit.org>
parents: 9044
diff changeset
2993 /* Sent when the netbeans channel is found closed when reading. */
8204
08d251a1c178 commit https://github.com/vim/vim/commit/eed284a16977ab81fa6da8c9562990ba498acd8c
Christian Brabandt <cb@256bit.org>
parents: 8200
diff changeset
2994 #define DETACH_MSG_RAW "DETACH\n"
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
2995
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
2996 /* Buffer size for reading incoming messages. */
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
2997 #define MAXMSGSIZE 4096
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
2998
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
2999 #if defined(HAVE_SELECT)
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3000 /*
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3001 * Add write fds where we are waiting for writing to be possible.
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3002 */
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3003 static int
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3004 channel_fill_wfds(int maxfd_arg, fd_set *wfds)
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3005 {
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3006 int maxfd = maxfd_arg;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3007 channel_T *ch;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3008
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3009 for (ch = first_channel; ch != NULL; ch = ch->ch_next)
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3010 {
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3011 chanpart_T *in_part = &ch->ch_part[PART_IN];
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3012
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9434
diff changeset
3013 if (in_part->ch_fd != INVALID_FD && in_part->ch_bufref.br_buf != NULL)
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3014 {
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3015 FD_SET((int)in_part->ch_fd, wfds);
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3016 if ((int)in_part->ch_fd >= maxfd)
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3017 maxfd = (int)in_part->ch_fd + 1;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3018 }
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3019 }
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3020 return maxfd;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3021 }
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3022 #else
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3023 /*
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3024 * Add write fds where we are waiting for writing to be possible.
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3025 */
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3026 static int
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3027 channel_fill_poll_write(int nfd_in, struct pollfd *fds)
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3028 {
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3029 int nfd = nfd_in;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3030 channel_T *ch;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3031
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3032 for (ch = first_channel; ch != NULL; ch = ch->ch_next)
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3033 {
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3034 chanpart_T *in_part = &ch->ch_part[PART_IN];
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3035
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9434
diff changeset
3036 if (in_part->ch_fd != INVALID_FD && in_part->ch_bufref.br_buf != NULL)
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3037 {
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3038 in_part->ch_poll_idx = nfd;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3039 fds[nfd].fd = in_part->ch_fd;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3040 fds[nfd].events = POLLOUT;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3041 ++nfd;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3042 }
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3043 else
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3044 in_part->ch_poll_idx = -1;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3045 }
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3046 return nfd;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3047 }
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3048 #endif
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3049
9003
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3050 typedef enum {
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3051 CW_READY,
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3052 CW_NOT_READY,
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3053 CW_ERROR
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3054 } channel_wait_result;
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3055
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3056 /*
7788
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
3057 * Check for reading from "fd" with "timeout" msec.
9003
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3058 * Return CW_READY when there is something to read.
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3059 * Return CW_NOT_READY when there is nothing to read.
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3060 * Return CW_ERROR when there is an error.
7788
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
3061 */
9003
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3062 static channel_wait_result
8059
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
3063 channel_wait(channel_T *channel, sock_T fd, int timeout)
7788
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
3064 {
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
3065 if (timeout > 0)
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
3066 ch_logn(channel, "Waiting for up to %d msec", timeout);
8059
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
3067
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
3068 # ifdef WIN32
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3069 if (fd != channel->CH_SOCK_FD)
8059
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
3070 {
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
3071 DWORD nread;
8757
4fb37555e814 commit https://github.com/vim/vim/commit/84e1d2b21a424f2687b61daaf84f5fc4f1ab0abe
Christian Brabandt <cb@256bit.org>
parents: 8755
diff changeset
3072 int sleep_time;
8059
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
3073 DWORD deadline = GetTickCount() + timeout;
8757
4fb37555e814 commit https://github.com/vim/vim/commit/84e1d2b21a424f2687b61daaf84f5fc4f1ab0abe
Christian Brabandt <cb@256bit.org>
parents: 8755
diff changeset
3074 int delay = 1;
8059
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
3075
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
3076 /* reading from a pipe, not a socket */
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
3077 while (TRUE)
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
3078 {
9003
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3079 int r = PeekNamedPipe((HANDLE)fd, NULL, 0, NULL, &nread, NULL);
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3080
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3081 if (r && nread > 0)
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3082 return CW_READY;
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3083 if (r == 0)
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3084 return CW_ERROR;
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3085
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3086 /* perhaps write some buffer lines */
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3087 channel_write_any_lines();
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3088
8757
4fb37555e814 commit https://github.com/vim/vim/commit/84e1d2b21a424f2687b61daaf84f5fc4f1ab0abe
Christian Brabandt <cb@256bit.org>
parents: 8755
diff changeset
3089 sleep_time = deadline - GetTickCount();
4fb37555e814 commit https://github.com/vim/vim/commit/84e1d2b21a424f2687b61daaf84f5fc4f1ab0abe
Christian Brabandt <cb@256bit.org>
parents: 8755
diff changeset
3090 if (sleep_time <= 0)
8059
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
3091 break;
8757
4fb37555e814 commit https://github.com/vim/vim/commit/84e1d2b21a424f2687b61daaf84f5fc4f1ab0abe
Christian Brabandt <cb@256bit.org>
parents: 8755
diff changeset
3092 /* Wait for a little while. Very short at first, up to 10 msec
4fb37555e814 commit https://github.com/vim/vim/commit/84e1d2b21a424f2687b61daaf84f5fc4f1ab0abe
Christian Brabandt <cb@256bit.org>
parents: 8755
diff changeset
3093 * after looping a few times. */
4fb37555e814 commit https://github.com/vim/vim/commit/84e1d2b21a424f2687b61daaf84f5fc4f1ab0abe
Christian Brabandt <cb@256bit.org>
parents: 8755
diff changeset
3094 if (sleep_time > delay)
4fb37555e814 commit https://github.com/vim/vim/commit/84e1d2b21a424f2687b61daaf84f5fc4f1ab0abe
Christian Brabandt <cb@256bit.org>
parents: 8755
diff changeset
3095 sleep_time = delay;
4fb37555e814 commit https://github.com/vim/vim/commit/84e1d2b21a424f2687b61daaf84f5fc4f1ab0abe
Christian Brabandt <cb@256bit.org>
parents: 8755
diff changeset
3096 Sleep(sleep_time);
4fb37555e814 commit https://github.com/vim/vim/commit/84e1d2b21a424f2687b61daaf84f5fc4f1ab0abe
Christian Brabandt <cb@256bit.org>
parents: 8755
diff changeset
3097 delay = delay * 2;
4fb37555e814 commit https://github.com/vim/vim/commit/84e1d2b21a424f2687b61daaf84f5fc4f1ab0abe
Christian Brabandt <cb@256bit.org>
parents: 8755
diff changeset
3098 if (delay > 10)
4fb37555e814 commit https://github.com/vim/vim/commit/84e1d2b21a424f2687b61daaf84f5fc4f1ab0abe
Christian Brabandt <cb@256bit.org>
parents: 8755
diff changeset
3099 delay = 10;
8059
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
3100 }
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
3101 }
8122
39532ee7dd43 commit https://github.com/vim/vim/commit/ed5a78e11c80c7b13b233149fd4273b71fc96262
Christian Brabandt <cb@256bit.org>
parents: 8114
diff changeset
3102 else
8059
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
3103 #endif
8122
39532ee7dd43 commit https://github.com/vim/vim/commit/ed5a78e11c80c7b13b233149fd4273b71fc96262
Christian Brabandt <cb@256bit.org>
parents: 8114
diff changeset
3104 {
8222
4f0677020a43 commit https://github.com/vim/vim/commit/9186a276222ea8a7c88f4092ac5b4201381f4e20
Christian Brabandt <cb@256bit.org>
parents: 8218
diff changeset
3105 #if defined(HAVE_SELECT)
8122
39532ee7dd43 commit https://github.com/vim/vim/commit/ed5a78e11c80c7b13b233149fd4273b71fc96262
Christian Brabandt <cb@256bit.org>
parents: 8114
diff changeset
3106 struct timeval tval;
39532ee7dd43 commit https://github.com/vim/vim/commit/ed5a78e11c80c7b13b233149fd4273b71fc96262
Christian Brabandt <cb@256bit.org>
parents: 8114
diff changeset
3107 fd_set rfds;
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3108 fd_set wfds;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3109 int ret;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3110 int maxfd;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3111
8122
39532ee7dd43 commit https://github.com/vim/vim/commit/ed5a78e11c80c7b13b233149fd4273b71fc96262
Christian Brabandt <cb@256bit.org>
parents: 8114
diff changeset
3112 tval.tv_sec = timeout / 1000;
39532ee7dd43 commit https://github.com/vim/vim/commit/ed5a78e11c80c7b13b233149fd4273b71fc96262
Christian Brabandt <cb@256bit.org>
parents: 8114
diff changeset
3113 tval.tv_usec = (timeout % 1000) * 1000;
39532ee7dd43 commit https://github.com/vim/vim/commit/ed5a78e11c80c7b13b233149fd4273b71fc96262
Christian Brabandt <cb@256bit.org>
parents: 8114
diff changeset
3114 for (;;)
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
3115 {
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3116 FD_ZERO(&rfds);
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3117 FD_SET((int)fd, &rfds);
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3118
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3119 /* Write lines to a pipe when a pipe can be written to. Need to
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3120 * set this every time, some buffers may be done. */
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3121 maxfd = (int)fd + 1;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3122 FD_ZERO(&wfds);
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3123 maxfd = channel_fill_wfds(maxfd, &wfds);
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3124
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3125 ret = select(maxfd, &rfds, &wfds, NULL, &tval);
8222
4f0677020a43 commit https://github.com/vim/vim/commit/9186a276222ea8a7c88f4092ac5b4201381f4e20
Christian Brabandt <cb@256bit.org>
parents: 8218
diff changeset
3126 # ifdef EINTR
8122
39532ee7dd43 commit https://github.com/vim/vim/commit/ed5a78e11c80c7b13b233149fd4273b71fc96262
Christian Brabandt <cb@256bit.org>
parents: 8114
diff changeset
3127 SOCK_ERRNO;
39532ee7dd43 commit https://github.com/vim/vim/commit/ed5a78e11c80c7b13b233149fd4273b71fc96262
Christian Brabandt <cb@256bit.org>
parents: 8114
diff changeset
3128 if (ret == -1 && errno == EINTR)
39532ee7dd43 commit https://github.com/vim/vim/commit/ed5a78e11c80c7b13b233149fd4273b71fc96262
Christian Brabandt <cb@256bit.org>
parents: 8114
diff changeset
3129 continue;
8222
4f0677020a43 commit https://github.com/vim/vim/commit/9186a276222ea8a7c88f4092ac5b4201381f4e20
Christian Brabandt <cb@256bit.org>
parents: 8218
diff changeset
3130 # endif
8122
39532ee7dd43 commit https://github.com/vim/vim/commit/ed5a78e11c80c7b13b233149fd4273b71fc96262
Christian Brabandt <cb@256bit.org>
parents: 8114
diff changeset
3131 if (ret > 0)
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3132 {
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3133 if (FD_ISSET(fd, &rfds))
9003
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3134 return CW_READY;
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3135 channel_write_any_lines();
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3136 continue;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3137 }
8122
39532ee7dd43 commit https://github.com/vim/vim/commit/ed5a78e11c80c7b13b233149fd4273b71fc96262
Christian Brabandt <cb@256bit.org>
parents: 8114
diff changeset
3138 break;
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
3139 }
8222
4f0677020a43 commit https://github.com/vim/vim/commit/9186a276222ea8a7c88f4092ac5b4201381f4e20
Christian Brabandt <cb@256bit.org>
parents: 8218
diff changeset
3140 #else
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3141 for (;;)
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3142 {
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3143 struct pollfd fds[MAX_OPEN_CHANNELS + 1];
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3144 int nfd = 1;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3145
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3146 fds[0].fd = fd;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3147 fds[0].events = POLLIN;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3148 nfd = channel_fill_poll_write(nfd, fds);
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3149 if (poll(fds, nfd, timeout) > 0)
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3150 {
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3151 if (fds[0].revents & POLLIN)
9003
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3152 return CW_READY;
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3153 channel_write_any_lines();
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3154 continue;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3155 }
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3156 break;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3157 }
7788
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
3158 #endif
8122
39532ee7dd43 commit https://github.com/vim/vim/commit/ed5a78e11c80c7b13b233149fd4273b71fc96262
Christian Brabandt <cb@256bit.org>
parents: 8114
diff changeset
3159 }
9003
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3160 return CW_NOT_READY;
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3161 }
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3162
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3163 static void
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3164 ch_close_part_on_error(
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3165 channel_T *channel, ch_part_T part, int is_err, char *func)
9003
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3166 {
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3167 char msgbuf[80];
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3168
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3169 vim_snprintf(msgbuf, sizeof(msgbuf),
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3170 "%%s(): Read %s from ch_part[%d], closing",
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3171 (is_err ? "error" : "EOF"), part);
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3172
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3173 if (is_err)
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3174 /* Do not call emsg(), most likely the other end just exited. */
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3175 ch_errors(channel, msgbuf, func);
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3176 else
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3177 ch_logs(channel, msgbuf, func);
9003
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3178
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3179 /* Queue a "DETACH" netbeans message in the command queue in order to
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3180 * terminate the netbeans session later. Do not end the session here
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3181 * directly as we may be running in the context of a call to
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3182 * netbeans_parse_messages():
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3183 * netbeans_parse_messages
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3184 * -> autocmd triggered while processing the netbeans cmd
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3185 * -> ui_breakcheck
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3186 * -> gui event loop or select loop
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3187 * -> channel_read()
9050
31bba6f25d84 commit https://github.com/vim/vim/commit/715d285d79a1d97928dd717278e25e6de45d1496
Christian Brabandt <cb@256bit.org>
parents: 9044
diff changeset
3188 * Only send "DETACH" for a netbeans channel.
9003
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3189 */
9050
31bba6f25d84 commit https://github.com/vim/vim/commit/715d285d79a1d97928dd717278e25e6de45d1496
Christian Brabandt <cb@256bit.org>
parents: 9044
diff changeset
3190 if (channel->ch_nb_close_cb != NULL)
10253
a92c4abb8c1f commit https://github.com/vim/vim/commit/8ddef48d1eade1911b946fdda8c73c80856e6273
Christian Brabandt <cb@256bit.org>
parents: 10249
diff changeset
3191 channel_save(channel, PART_SOCK, (char_u *)DETACH_MSG_RAW,
9003
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3192 (int)STRLEN(DETACH_MSG_RAW), FALSE, "PUT ");
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3193
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3194 /* When reading is not possible close this part of the channel. Don't
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3195 * close the channel yet, there may be something to read on another part. */
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3196 ch_close_part(channel, part);
9133
dec3b7b977c0 commit https://github.com/vim/vim/commit/bf981eeb6b4ee63ae8543a7f9865ab700159a79c
Christian Brabandt <cb@256bit.org>
parents: 9131
diff changeset
3197
dec3b7b977c0 commit https://github.com/vim/vim/commit/bf981eeb6b4ee63ae8543a7f9865ab700159a79c
Christian Brabandt <cb@256bit.org>
parents: 9131
diff changeset
3198 #ifdef FEAT_GUI
dec3b7b977c0 commit https://github.com/vim/vim/commit/bf981eeb6b4ee63ae8543a7f9865ab700159a79c
Christian Brabandt <cb@256bit.org>
parents: 9131
diff changeset
3199 /* Stop listening to GUI events right away. */
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3200 channel_gui_unregister_one(channel, part);
9133
dec3b7b977c0 commit https://github.com/vim/vim/commit/bf981eeb6b4ee63ae8543a7f9865ab700159a79c
Christian Brabandt <cb@256bit.org>
parents: 9131
diff changeset
3201 #endif
9083
69bb7b230094 commit https://github.com/vim/vim/commit/cf7ff70ca73218d618e7c00ab785bcf5f9120a94
Christian Brabandt <cb@256bit.org>
parents: 9081
diff changeset
3202 }
69bb7b230094 commit https://github.com/vim/vim/commit/cf7ff70ca73218d618e7c00ab785bcf5f9120a94
Christian Brabandt <cb@256bit.org>
parents: 9081
diff changeset
3203
69bb7b230094 commit https://github.com/vim/vim/commit/cf7ff70ca73218d618e7c00ab785bcf5f9120a94
Christian Brabandt <cb@256bit.org>
parents: 9081
diff changeset
3204 static void
69bb7b230094 commit https://github.com/vim/vim/commit/cf7ff70ca73218d618e7c00ab785bcf5f9120a94
Christian Brabandt <cb@256bit.org>
parents: 9081
diff changeset
3205 channel_close_now(channel_T *channel)
69bb7b230094 commit https://github.com/vim/vim/commit/cf7ff70ca73218d618e7c00ab785bcf5f9120a94
Christian Brabandt <cb@256bit.org>
parents: 9081
diff changeset
3206 {
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3207 ch_log(channel, "Closing channel because all readable fds are closed");
9003
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3208 if (channel->ch_nb_close_cb != NULL)
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3209 (*channel->ch_nb_close_cb)();
10426
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
3210 channel_close(channel, TRUE);
7788
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
3211 }
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
3212
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
3213 /*
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
3214 * Read from channel "channel" for as long as there is something to read.
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3215 * "part" is PART_SOCK, PART_OUT or PART_ERR.
9143
b9c1a397a8a6 commit https://github.com/vim/vim/commit/655da31a18ef3f888acf10e68b438e2a851f7b14
Christian Brabandt <cb@256bit.org>
parents: 9139
diff changeset
3216 * The data is put in the read queue. No callbacks are invoked here.
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3217 */
9003
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3218 static void
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3219 channel_read(channel_T *channel, ch_part_T part, char *func)
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3220 {
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3221 static char_u *buf = NULL;
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3222 int len = 0;
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3223 int readlen = 0;
8059
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
3224 sock_T fd;
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
3225 int use_socket = FALSE;
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3226
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3227 fd = channel->ch_part[part].ch_fd;
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3228 if (fd == INVALID_FD)
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3229 {
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3230 ch_errors(channel, "channel_read() called while %s part is closed",
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3231 part_names[part]);
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3232 return;
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3233 }
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3234 use_socket = fd == channel->CH_SOCK_FD;
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3235
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3236 /* Allocate a buffer to read into. */
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3237 if (buf == NULL)
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3238 {
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3239 buf = alloc(MAXMSGSIZE);
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3240 if (buf == NULL)
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3241 return; /* out of memory! */
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3242 }
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3243
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3244 /* Keep on reading for as long as there is something to read.
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3245 * Use select() or poll() to avoid blocking on a message that is exactly
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3246 * MAXMSGSIZE long. */
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3247 for (;;)
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3248 {
9003
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3249 if (channel_wait(channel, fd, 0) != CW_READY)
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3250 break;
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
3251 if (use_socket)
8080
b6cb94ad97a4 commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents: 8074
diff changeset
3252 len = sock_read(fd, (char *)buf, MAXMSGSIZE);
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
3253 else
8080
b6cb94ad97a4 commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents: 8074
diff changeset
3254 len = fd_read(fd, (char *)buf, MAXMSGSIZE);
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3255 if (len <= 0)
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3256 break; /* error or nothing more to read */
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3257
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3258 /* Store the read message in the queue. */
8755
7038ec89d1fd commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents: 8753
diff changeset
3259 channel_save(channel, part, buf, len, FALSE, "RECV ");
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3260 readlen += len;
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3261 if (len < MAXMSGSIZE)
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3262 break; /* did read everything that's available */
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3263 }
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3264
8261
a412b466bedc commit https://github.com/vim/vim/commit/4cafa6dc7f0728b018979aff0ca039908ecf2ae1
Christian Brabandt <cb@256bit.org>
parents: 8259
diff changeset
3265 /* Reading a disconnection (readlen == 0), or an error. */
8200
ee84450e604e commit https://github.com/vim/vim/commit/bd73ae1bc63a3b0187ffe7fc8f0caee5a4eb66fa
Christian Brabandt <cb@256bit.org>
parents: 8174
diff changeset
3266 if (readlen <= 0)
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3267 ch_close_part_on_error(channel, part, (len < 0), func);
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3268
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3269 #if defined(CH_HAS_GUI) && defined(FEAT_GUI_GTK)
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
3270 /* signal the main loop that there is something to read */
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3271 if (CH_HAS_GUI && gtk_main_level() > 0)
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3272 gtk_main_quit();
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3273 #endif
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3274 }
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3275
7788
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
3276 /*
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3277 * Read from RAW or NL "channel"/"part". Blocks until there is something to
8084
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
3278 * read or the timeout expires.
7788
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
3279 * Returns what was read in allocated memory.
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
3280 * Returns NULL in case of error or timeout.
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
3281 */
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
3282 char_u *
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3283 channel_read_block(channel_T *channel, ch_part_T part, int timeout)
7788
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
3284 {
8084
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
3285 char_u *buf;
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
3286 char_u *msg;
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3287 ch_mode_T mode = channel->ch_part[part].ch_mode;
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3288 sock_T fd = channel->ch_part[part].ch_fd;
8084
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
3289 char_u *nl;
9246
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
3290 readq_T *node;
8084
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
3291
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
3292 ch_logsn(channel, "Blocking %s read, timeout: %d msec",
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3293 mode == MODE_RAW ? "RAW" : "NL", timeout);
8084
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
3294
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
3295 while (TRUE)
7788
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
3296 {
9246
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
3297 node = channel_peek(channel, part);
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
3298 if (node != NULL)
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
3299 {
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
3300 if (mode == MODE_RAW || (mode == MODE_NL
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
3301 && channel_first_nl(node) != NULL))
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
3302 /* got a complete message */
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
3303 break;
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
3304 if (channel_collapse(channel, part, mode == MODE_NL) == OK)
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
3305 continue;
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
3306 }
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
3307
7935
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
3308 /* Wait for up to the channel timeout. */
8655
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3309 if (fd == INVALID_FD)
7788
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
3310 return NULL;
9003
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3311 if (channel_wait(channel, fd, timeout) != CW_READY)
8655
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3312 {
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3313 ch_log(channel, "Timed out");
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3314 return NULL;
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3315 }
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3316 channel_read(channel, part, "channel_read_block");
7788
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
3317 }
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
3318
10996
2f041b367cd9 patch 8.0.0387: compiler warnings
Christian Brabandt <cb@256bit.org>
parents: 10845
diff changeset
3319 /* We have a complete message now. */
8084
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
3320 if (mode == MODE_RAW)
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
3321 {
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3322 msg = channel_get_all(channel, part);
8084
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
3323 }
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
3324 else
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
3325 {
9246
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
3326 char_u *p;
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
3327
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
3328 buf = node->rq_buffer;
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
3329 nl = channel_first_nl(node);
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
3330
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
3331 /* Convert NUL to NL, the internal representation. */
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
3332 for (p = buf; p < nl && p < buf + node->rq_buflen; ++p)
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
3333 if (*p == NUL)
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
3334 *p = NL;
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
3335
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
3336 if (nl + 1 == buf + node->rq_buflen)
8084
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
3337 {
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
3338 /* get the whole buffer */
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3339 msg = channel_get(channel, part);
8084
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
3340 *nl = NUL;
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
3341 }
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
3342 else
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
3343 {
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
3344 /* Copy the message into allocated memory and remove it from the
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
3345 * buffer. */
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
3346 msg = vim_strnsave(buf, (int)(nl - buf));
9246
6ee88fa405b3 commit https://github.com/vim/vim/commit/5f1032d2a55b9417a0a6fa225e35089c98a5a419
Christian Brabandt <cb@256bit.org>
parents: 9238
diff changeset
3347 channel_consume(channel, part, (int)(nl - buf) + 1);
8084
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
3348 }
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
3349 }
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
3350 if (log_fd != NULL)
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
3351 ch_logn(channel, "Returning %d bytes", (int)STRLEN(msg));
8084
3ea56a74077f commit https://github.com/vim/vim/commit/9a6e33a19b18f20c25b73392cd2faa3ec4890c8c
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
3352 return msg;
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
3353 }
7788
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
3354
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
3355 /*
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3356 * Read one JSON message with ID "id" from "channel"/"part" and store the
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
3357 * result in "rettv".
8157
74b44d06d3c7 commit https://github.com/vim/vim/commit/6f3a544228c1faf92211cbaf8bbedb1dff883f90
Christian Brabandt <cb@256bit.org>
parents: 8155
diff changeset
3358 * When "id" is -1 accept any message;
7935
3f2e0b62003d commit https://github.com/vim/vim/commit/4d919d748e4e435edb135aa5ccf6ee7de9212023
Christian Brabandt <cb@256bit.org>
parents: 7933
diff changeset
3359 * Blocks until the message is received or the timeout is reached.
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
3360 */
10426
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
3361 static int
8157
74b44d06d3c7 commit https://github.com/vim/vim/commit/6f3a544228c1faf92211cbaf8bbedb1dff883f90
Christian Brabandt <cb@256bit.org>
parents: 8155
diff changeset
3362 channel_read_json_block(
8310
aec8f8ce8e4c commit https://github.com/vim/vim/commit/d6051b5eb83687f60bb4a2f3d5cd23fe8b290eb4
Christian Brabandt <cb@256bit.org>
parents: 8297
diff changeset
3363 channel_T *channel,
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3364 ch_part_T part,
8655
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3365 int timeout_arg,
8310
aec8f8ce8e4c commit https://github.com/vim/vim/commit/d6051b5eb83687f60bb4a2f3d5cd23fe8b290eb4
Christian Brabandt <cb@256bit.org>
parents: 8297
diff changeset
3366 int id,
aec8f8ce8e4c commit https://github.com/vim/vim/commit/d6051b5eb83687f60bb4a2f3d5cd23fe8b290eb4
Christian Brabandt <cb@256bit.org>
parents: 8297
diff changeset
3367 typval_T **rettv)
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
3368 {
7997
c1c9ab17e197 commit https://github.com/vim/vim/commit/e56bf15c163a921ce9e1c09c0d5b3a03efc63324
Christian Brabandt <cb@256bit.org>
parents: 7988
diff changeset
3369 int more;
8059
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
3370 sock_T fd;
8655
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3371 int timeout;
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3372 chanpart_T *chanpart = &channel->ch_part[part];
7899
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
3373
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
3374 ch_log(channel, "Reading JSON");
8157
74b44d06d3c7 commit https://github.com/vim/vim/commit/6f3a544228c1faf92211cbaf8bbedb1dff883f90
Christian Brabandt <cb@256bit.org>
parents: 8155
diff changeset
3375 if (id != -1)
8655
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3376 chanpart->ch_block_id = id;
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
3377 for (;;)
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
3378 {
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3379 more = channel_parse_json(channel, part);
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
3380
9355
40c8a8b012b5 commit https://github.com/vim/vim/commit/aad30bbcde2b268e2fffb6fd1443f27ebda9d1ff
Christian Brabandt <cb@256bit.org>
parents: 9282
diff changeset
3381 /* search for message "id" */
10426
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
3382 if (channel_get_json(channel, part, id, TRUE, rettv) == OK)
7997
c1c9ab17e197 commit https://github.com/vim/vim/commit/e56bf15c163a921ce9e1c09c0d5b3a03efc63324
Christian Brabandt <cb@256bit.org>
parents: 7988
diff changeset
3383 {
8655
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3384 chanpart->ch_block_id = 0;
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
3385 return OK;
7997
c1c9ab17e197 commit https://github.com/vim/vim/commit/e56bf15c163a921ce9e1c09c0d5b3a03efc63324
Christian Brabandt <cb@256bit.org>
parents: 7988
diff changeset
3386 }
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
3387
7899
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
3388 if (!more)
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
3389 {
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
3390 /* Handle any other messages in the queue. If done some more
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
3391 * messages may have arrived. */
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
3392 if (channel_parse_messages())
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
3393 continue;
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
3394
8655
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3395 /* Wait for up to the timeout. If there was an incomplete message
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3396 * use the deadline for that. */
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3397 timeout = timeout_arg;
10845
c31782d57569 patch 8.0.0312: failure when a channel receives a split json message
Christian Brabandt <cb@256bit.org>
parents: 10587
diff changeset
3398 if (chanpart->ch_wait_len > 0)
8655
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3399 {
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3400 #ifdef WIN32
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3401 timeout = chanpart->ch_deadline - GetTickCount() + 1;
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3402 #else
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3403 {
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3404 struct timeval now_tv;
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3405
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3406 gettimeofday(&now_tv, NULL);
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3407 timeout = (chanpart->ch_deadline.tv_sec
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3408 - now_tv.tv_sec) * 1000
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3409 + (chanpart->ch_deadline.tv_usec
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3410 - now_tv.tv_usec) / 1000
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3411 + 1;
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3412 }
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3413 #endif
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3414 if (timeout < 0)
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3415 {
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3416 /* Something went wrong, channel_parse_json() didn't
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3417 * discard message. Cancel waiting. */
10845
c31782d57569 patch 8.0.0312: failure when a channel receives a split json message
Christian Brabandt <cb@256bit.org>
parents: 10587
diff changeset
3418 chanpart->ch_wait_len = 0;
8655
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3419 timeout = timeout_arg;
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3420 }
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3421 else if (timeout > timeout_arg)
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3422 timeout = timeout_arg;
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3423 }
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3424 fd = chanpart->ch_fd;
9003
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3425 if (fd == INVALID_FD
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3426 || channel_wait(channel, fd, timeout) != CW_READY)
8655
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3427 {
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3428 if (timeout == timeout_arg)
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3429 {
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3430 if (fd != INVALID_FD)
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3431 ch_log(channel, "Timed out");
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3432 break;
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3433 }
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3434 }
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3435 else
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3436 channel_read(channel, part, "channel_read_json_block");
7899
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
3437 }
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
3438 }
8655
1eb302bf2475 commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents: 8653
diff changeset
3439 chanpart->ch_block_id = 0;
7868
17e6ff1a74f1 commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents: 7864
diff changeset
3440 return FAIL;
7788
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
3441 }
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
3442
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3443 /*
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3444 * Common for ch_read() and ch_readraw().
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3445 */
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3446 void
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3447 common_channel_read(typval_T *argvars, typval_T *rettv, int raw)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3448 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3449 channel_T *channel;
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3450 ch_part_T part = PART_COUNT;
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3451 jobopt_T opt;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3452 int mode;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3453 int timeout;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3454 int id = -1;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3455 typval_T *listtv = NULL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3456
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3457 /* return an empty string by default */
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3458 rettv->v_type = VAR_STRING;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3459 rettv->vval.v_string = NULL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3460
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3461 clear_job_options(&opt);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3462 if (get_job_options(&argvars[1], &opt, JO_TIMEOUT + JO_PART + JO_ID)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3463 == FAIL)
8859
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
3464 goto theend;
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3465
9007
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
3466 if (opt.jo_set & JO_PART)
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
3467 part = opt.jo_part;
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
3468 channel = get_channel_arg(&argvars[0], TRUE, TRUE, part);
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3469 if (channel != NULL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3470 {
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3471 if (part == PART_COUNT)
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3472 part = channel_part_read(channel);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3473 mode = channel_get_mode(channel, part);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3474 timeout = channel_get_timeout(channel, part);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3475 if (opt.jo_set & JO_TIMEOUT)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3476 timeout = opt.jo_timeout;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3477
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3478 if (raw || mode == MODE_RAW || mode == MODE_NL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3479 rettv->vval.v_string = channel_read_block(channel, part, timeout);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3480 else
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3481 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3482 if (opt.jo_set & JO_ID)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3483 id = opt.jo_id;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3484 channel_read_json_block(channel, part, timeout, id, &listtv);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3485 if (listtv != NULL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3486 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3487 *rettv = *listtv;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3488 vim_free(listtv);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3489 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3490 else
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3491 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3492 rettv->v_type = VAR_SPECIAL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3493 rettv->vval.v_number = VVAL_NONE;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3494 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3495 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3496 }
8859
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
3497
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
3498 theend:
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
3499 free_job_options(&opt);
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3500 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3501
8155
6ee6fb27dcea commit https://github.com/vim/vim/commit/fffd5560c6c8840be3233ef1c8da3c9e5dd424ea
Christian Brabandt <cb@256bit.org>
parents: 8151
diff changeset
3502 # if defined(WIN32) || defined(FEAT_GUI_X11) || defined(FEAT_GUI_GTK) \
6ee6fb27dcea commit https://github.com/vim/vim/commit/fffd5560c6c8840be3233ef1c8da3c9e5dd424ea
Christian Brabandt <cb@256bit.org>
parents: 8151
diff changeset
3503 || defined(PROTO)
7780
e09af43f98f7 commit https://github.com/vim/vim/commit/85be35f33ea848b50e84d57321a45ebfedfad669
Christian Brabandt <cb@256bit.org>
parents: 7774
diff changeset
3504 /*
8155
6ee6fb27dcea commit https://github.com/vim/vim/commit/fffd5560c6c8840be3233ef1c8da3c9e5dd424ea
Christian Brabandt <cb@256bit.org>
parents: 8151
diff changeset
3505 * Lookup the channel from the socket. Set "partp" to the fd index.
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
3506 * Returns NULL when the socket isn't found.
7780
e09af43f98f7 commit https://github.com/vim/vim/commit/85be35f33ea848b50e84d57321a45ebfedfad669
Christian Brabandt <cb@256bit.org>
parents: 7774
diff changeset
3507 */
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
3508 channel_T *
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3509 channel_fd2channel(sock_T fd, ch_part_T *partp)
7780
e09af43f98f7 commit https://github.com/vim/vim/commit/85be35f33ea848b50e84d57321a45ebfedfad669
Christian Brabandt <cb@256bit.org>
parents: 7774
diff changeset
3510 {
8047
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
3511 channel_T *channel;
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3512 ch_part_T part;
7780
e09af43f98f7 commit https://github.com/vim/vim/commit/85be35f33ea848b50e84d57321a45ebfedfad669
Christian Brabandt <cb@256bit.org>
parents: 7774
diff changeset
3513
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3514 if (fd != INVALID_FD)
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
3515 for (channel = first_channel; channel != NULL;
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
3516 channel = channel->ch_next)
8049
15253130abd8 commit https://github.com/vim/vim/commit/16eb4f88000cfdba68df6c421fe44e7e029ba53e
Christian Brabandt <cb@256bit.org>
parents: 8047
diff changeset
3517 {
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3518 for (part = PART_SOCK; part < PART_IN; ++part)
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3519 if (channel->ch_part[part].ch_fd == fd)
8047
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
3520 {
8155
6ee6fb27dcea commit https://github.com/vim/vim/commit/fffd5560c6c8840be3233ef1c8da3c9e5dd424ea
Christian Brabandt <cb@256bit.org>
parents: 8151
diff changeset
3521 *partp = part;
8049
15253130abd8 commit https://github.com/vim/vim/commit/16eb4f88000cfdba68df6c421fe44e7e029ba53e
Christian Brabandt <cb@256bit.org>
parents: 8047
diff changeset
3522 return channel;
8047
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
3523 }
8049
15253130abd8 commit https://github.com/vim/vim/commit/16eb4f88000cfdba68df6c421fe44e7e029ba53e
Christian Brabandt <cb@256bit.org>
parents: 8047
diff changeset
3524 }
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
3525 return NULL;
7780
e09af43f98f7 commit https://github.com/vim/vim/commit/85be35f33ea848b50e84d57321a45ebfedfad669
Christian Brabandt <cb@256bit.org>
parents: 7774
diff changeset
3526 }
8172
db5c79d93eee commit https://github.com/vim/vim/commit/b7522a2f0ca6c970df37241c9e70024465d8596b
Christian Brabandt <cb@256bit.org>
parents: 8165
diff changeset
3527 # endif
8122
39532ee7dd43 commit https://github.com/vim/vim/commit/ed5a78e11c80c7b13b233149fd4273b71fc96262
Christian Brabandt <cb@256bit.org>
parents: 8114
diff changeset
3528
8172
db5c79d93eee commit https://github.com/vim/vim/commit/b7522a2f0ca6c970df37241c9e70024465d8596b
Christian Brabandt <cb@256bit.org>
parents: 8165
diff changeset
3529 # if defined(WIN32) || defined(PROTO)
db5c79d93eee commit https://github.com/vim/vim/commit/b7522a2f0ca6c970df37241c9e70024465d8596b
Christian Brabandt <cb@256bit.org>
parents: 8165
diff changeset
3530 /*
db5c79d93eee commit https://github.com/vim/vim/commit/b7522a2f0ca6c970df37241c9e70024465d8596b
Christian Brabandt <cb@256bit.org>
parents: 8165
diff changeset
3531 * Check the channels for anything that is ready to be read.
db5c79d93eee commit https://github.com/vim/vim/commit/b7522a2f0ca6c970df37241c9e70024465d8596b
Christian Brabandt <cb@256bit.org>
parents: 8165
diff changeset
3532 * The data is put in the read queue.
db5c79d93eee commit https://github.com/vim/vim/commit/b7522a2f0ca6c970df37241c9e70024465d8596b
Christian Brabandt <cb@256bit.org>
parents: 8165
diff changeset
3533 */
8122
39532ee7dd43 commit https://github.com/vim/vim/commit/ed5a78e11c80c7b13b233149fd4273b71fc96262
Christian Brabandt <cb@256bit.org>
parents: 8114
diff changeset
3534 void
39532ee7dd43 commit https://github.com/vim/vim/commit/ed5a78e11c80c7b13b233149fd4273b71fc96262
Christian Brabandt <cb@256bit.org>
parents: 8114
diff changeset
3535 channel_handle_events(void)
39532ee7dd43 commit https://github.com/vim/vim/commit/ed5a78e11c80c7b13b233149fd4273b71fc96262
Christian Brabandt <cb@256bit.org>
parents: 8114
diff changeset
3536 {
39532ee7dd43 commit https://github.com/vim/vim/commit/ed5a78e11c80c7b13b233149fd4273b71fc96262
Christian Brabandt <cb@256bit.org>
parents: 8114
diff changeset
3537 channel_T *channel;
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3538 ch_part_T part;
8172
db5c79d93eee commit https://github.com/vim/vim/commit/b7522a2f0ca6c970df37241c9e70024465d8596b
Christian Brabandt <cb@256bit.org>
parents: 8165
diff changeset
3539 sock_T fd;
8122
39532ee7dd43 commit https://github.com/vim/vim/commit/ed5a78e11c80c7b13b233149fd4273b71fc96262
Christian Brabandt <cb@256bit.org>
parents: 8114
diff changeset
3540
39532ee7dd43 commit https://github.com/vim/vim/commit/ed5a78e11c80c7b13b233149fd4273b71fc96262
Christian Brabandt <cb@256bit.org>
parents: 8114
diff changeset
3541 for (channel = first_channel; channel != NULL; channel = channel->ch_next)
39532ee7dd43 commit https://github.com/vim/vim/commit/ed5a78e11c80c7b13b233149fd4273b71fc96262
Christian Brabandt <cb@256bit.org>
parents: 8114
diff changeset
3542 {
39532ee7dd43 commit https://github.com/vim/vim/commit/ed5a78e11c80c7b13b233149fd4273b71fc96262
Christian Brabandt <cb@256bit.org>
parents: 8114
diff changeset
3543 /* check the socket and pipes */
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3544 for (part = PART_SOCK; part < PART_IN; ++part)
8172
db5c79d93eee commit https://github.com/vim/vim/commit/b7522a2f0ca6c970df37241c9e70024465d8596b
Christian Brabandt <cb@256bit.org>
parents: 8165
diff changeset
3545 {
db5c79d93eee commit https://github.com/vim/vim/commit/b7522a2f0ca6c970df37241c9e70024465d8596b
Christian Brabandt <cb@256bit.org>
parents: 8165
diff changeset
3546 fd = channel->ch_part[part].ch_fd;
9003
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3547 if (fd != INVALID_FD)
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3548 {
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3549 int r = channel_wait(channel, fd, 0);
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3550
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3551 if (r == CW_READY)
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3552 channel_read(channel, part, "channel_handle_events");
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3553 else if (r == CW_ERROR)
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3554 ch_close_part_on_error(channel, part, TRUE,
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3555 "channel_handle_events");
9003
072556995a8e commit https://github.com/vim/vim/commit/b2658a1ab02cd0ba848164f70c7c464fdc398162
Christian Brabandt <cb@256bit.org>
parents: 8928
diff changeset
3556 }
8172
db5c79d93eee commit https://github.com/vim/vim/commit/b7522a2f0ca6c970df37241c9e70024465d8596b
Christian Brabandt <cb@256bit.org>
parents: 8165
diff changeset
3557 }
8122
39532ee7dd43 commit https://github.com/vim/vim/commit/ed5a78e11c80c7b13b233149fd4273b71fc96262
Christian Brabandt <cb@256bit.org>
parents: 8114
diff changeset
3558 }
39532ee7dd43 commit https://github.com/vim/vim/commit/ed5a78e11c80c7b13b233149fd4273b71fc96262
Christian Brabandt <cb@256bit.org>
parents: 8114
diff changeset
3559 }
7780
e09af43f98f7 commit https://github.com/vim/vim/commit/85be35f33ea848b50e84d57321a45ebfedfad669
Christian Brabandt <cb@256bit.org>
parents: 7774
diff changeset
3560 # endif
e09af43f98f7 commit https://github.com/vim/vim/commit/85be35f33ea848b50e84d57321a45ebfedfad669
Christian Brabandt <cb@256bit.org>
parents: 7774
diff changeset
3561
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3562 /*
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3563 * Write "buf" (NUL terminated string) to "channel"/"part".
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3564 * When "fun" is not NULL an error message might be given.
7788
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
3565 * Return FAIL or OK.
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3566 */
7788
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
3567 int
10363
471b87c3b67d commit https://github.com/vim/vim/commit/79cbdcb1eeead00bad6fc64ab4a53e5860d5a663
Christian Brabandt <cb@256bit.org>
parents: 10309
diff changeset
3568 channel_send(
471b87c3b67d commit https://github.com/vim/vim/commit/79cbdcb1eeead00bad6fc64ab4a53e5860d5a663
Christian Brabandt <cb@256bit.org>
parents: 10309
diff changeset
3569 channel_T *channel,
471b87c3b67d commit https://github.com/vim/vim/commit/79cbdcb1eeead00bad6fc64ab4a53e5860d5a663
Christian Brabandt <cb@256bit.org>
parents: 10309
diff changeset
3570 ch_part_T part,
471b87c3b67d commit https://github.com/vim/vim/commit/79cbdcb1eeead00bad6fc64ab4a53e5860d5a663
Christian Brabandt <cb@256bit.org>
parents: 10309
diff changeset
3571 char_u *buf,
471b87c3b67d commit https://github.com/vim/vim/commit/79cbdcb1eeead00bad6fc64ab4a53e5860d5a663
Christian Brabandt <cb@256bit.org>
parents: 10309
diff changeset
3572 int len,
471b87c3b67d commit https://github.com/vim/vim/commit/79cbdcb1eeead00bad6fc64ab4a53e5860d5a663
Christian Brabandt <cb@256bit.org>
parents: 10309
diff changeset
3573 char *fun)
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3574 {
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
3575 int res;
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3576 sock_T fd;
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3577
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3578 fd = channel->ch_part[part].ch_fd;
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3579 if (fd == INVALID_FD)
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3580 {
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3581 if (!channel->ch_error && fun != NULL)
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3582 {
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
3583 ch_errors(channel, "%s(): write while not connected", fun);
9953
9560a2eb7968 commit https://github.com/vim/vim/commit/5b30291785e6b9be1a607504c14bd03c601b59a6
Christian Brabandt <cb@256bit.org>
parents: 9723
diff changeset
3584 EMSG2(_("E630: %s(): write while not connected"), fun);
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3585 }
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3586 channel->ch_error = TRUE;
7788
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
3587 return FAIL;
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3588 }
7788
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
3589
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
3590 if (log_fd != NULL)
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
3591 {
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
3592 ch_log_lead("SEND ", channel);
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
3593 fprintf(log_fd, "'");
8049
15253130abd8 commit https://github.com/vim/vim/commit/16eb4f88000cfdba68df6c421fe44e7e029ba53e
Christian Brabandt <cb@256bit.org>
parents: 8047
diff changeset
3594 ignored = (int)fwrite(buf, len, 1, log_fd);
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
3595 fprintf(log_fd, "'\n");
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
3596 fflush(log_fd);
8428
4e22d0e7bfb1 commit https://github.com/vim/vim/commit/d0b6502a7ace39d6cd30874110a572371d10beae
Christian Brabandt <cb@256bit.org>
parents: 8422
diff changeset
3597 did_log_msg = TRUE;
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
3598 }
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
3599
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3600 if (part == PART_SOCK)
8080
b6cb94ad97a4 commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents: 8074
diff changeset
3601 res = sock_write(fd, (char *)buf, len);
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
3602 else
8080
b6cb94ad97a4 commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents: 8074
diff changeset
3603 res = fd_write(fd, (char *)buf, len);
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
3604 if (res != len)
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3605 {
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3606 if (!channel->ch_error && fun != NULL)
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3607 {
8114
4aea0b0aa714 commit https://github.com/vim/vim/commit/81661fb86801e6d6e5194b43dfd27d73fcc016ec
Christian Brabandt <cb@256bit.org>
parents: 8096
diff changeset
3608 ch_errors(channel, "%s(): write failed", fun);
9953
9560a2eb7968 commit https://github.com/vim/vim/commit/5b30291785e6b9be1a607504c14bd03c601b59a6
Christian Brabandt <cb@256bit.org>
parents: 9723
diff changeset
3609 EMSG2(_("E631: %s(): write failed"), fun);
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3610 }
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3611 channel->ch_error = TRUE;
7788
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
3612 return FAIL;
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3613 }
7788
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
3614
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
3615 channel->ch_error = FALSE;
192ae655ac91 commit https://github.com/vim/vim/commit/3b5f929b18492fec291d1ec95a91f54e5912c03b
Christian Brabandt <cb@256bit.org>
parents: 7780
diff changeset
3616 return OK;
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3617 }
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3618
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3619 /*
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3620 * Common for "ch_sendexpr()" and "ch_sendraw()".
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3621 * Returns the channel if the caller should read the response.
9355
40c8a8b012b5 commit https://github.com/vim/vim/commit/aad30bbcde2b268e2fffb6fd1443f27ebda9d1ff
Christian Brabandt <cb@256bit.org>
parents: 9282
diff changeset
3622 * Sets "part_read" to the read fd.
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3623 * Otherwise returns NULL.
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3624 */
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3625 static channel_T *
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3626 send_common(
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3627 typval_T *argvars,
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3628 char_u *text,
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3629 int id,
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3630 int eval,
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3631 jobopt_T *opt,
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3632 char *fun,
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3633 ch_part_T *part_read)
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3634 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3635 channel_T *channel;
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3636 ch_part_T part_send;
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3637
8859
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
3638 clear_job_options(opt);
9007
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
3639 channel = get_channel_arg(&argvars[0], TRUE, FALSE, 0);
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3640 if (channel == NULL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3641 return NULL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3642 part_send = channel_part_send(channel);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3643 *part_read = channel_part_read(channel);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3644
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3645 if (get_job_options(&argvars[2], opt, JO_CALLBACK + JO_TIMEOUT) == FAIL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3646 return NULL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3647
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3648 /* Set the callback. An empty callback means no callback and not reading
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3649 * the response. With "ch_evalexpr()" and "ch_evalraw()" a callback is not
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3650 * allowed. */
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3651 if (opt->jo_callback != NULL && *opt->jo_callback != NUL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3652 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3653 if (eval)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3654 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3655 EMSG2(_("E917: Cannot use a callback with %s()"), fun);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3656 return NULL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3657 }
10030
3b4b2ac811f0 commit https://github.com/vim/vim/commit/6fc8227ebfbdfbbb48b81b679db81f421dbce79b
Christian Brabandt <cb@256bit.org>
parents: 9969
diff changeset
3658 channel_set_req_callback(channel, *part_read,
8538
c337c813c64d commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents: 8508
diff changeset
3659 opt->jo_callback, opt->jo_partial, id);
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3660 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3661
9434
8f904a323b3f commit https://github.com/vim/vim/commit/bf2cc5f36d5ffd5de445e6970602000c7869b65a
Christian Brabandt <cb@256bit.org>
parents: 9367
diff changeset
3662 if (channel_send(channel, part_send, text, (int)STRLEN(text), fun) == OK
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3663 && opt->jo_callback == NULL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3664 return channel;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3665 return NULL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3666 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3667
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3668 /*
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3669 * common for "ch_evalexpr()" and "ch_sendexpr()"
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3670 */
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3671 void
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3672 ch_expr_common(typval_T *argvars, typval_T *rettv, int eval)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3673 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3674 char_u *text;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3675 typval_T *listtv;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3676 channel_T *channel;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3677 int id;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3678 ch_mode_T ch_mode;
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3679 ch_part_T part_send;
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3680 ch_part_T part_read;
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3681 jobopt_T opt;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3682 int timeout;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3683
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3684 /* return an empty string by default */
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3685 rettv->v_type = VAR_STRING;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3686 rettv->vval.v_string = NULL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3687
9007
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
3688 channel = get_channel_arg(&argvars[0], TRUE, FALSE, 0);
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3689 if (channel == NULL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3690 return;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3691 part_send = channel_part_send(channel);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3692
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3693 ch_mode = channel_get_mode(channel, part_send);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3694 if (ch_mode == MODE_RAW || ch_mode == MODE_NL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3695 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3696 EMSG(_("E912: cannot use ch_evalexpr()/ch_sendexpr() with a raw or nl channel"));
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3697 return;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3698 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3699
8667
8c80c21a1885 commit https://github.com/vim/vim/commit/e9d6a298df6108e2044b1f0da5a2712f0c51c7d9
Christian Brabandt <cb@256bit.org>
parents: 8657
diff changeset
3700 id = ++channel->ch_last_msg_id;
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3701 text = json_encode_nr_expr(id, &argvars[1],
9969
176e34b0d678 commit https://github.com/vim/vim/commit/f1f0792e55e72cdc7c833b30f565a9b02f18bb1e
Christian Brabandt <cb@256bit.org>
parents: 9953
diff changeset
3702 (ch_mode == MODE_JS ? JSON_JS : 0) | JSON_NL);
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3703 if (text == NULL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3704 return;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3705
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3706 channel = send_common(argvars, text, id, eval, &opt,
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3707 eval ? "ch_evalexpr" : "ch_sendexpr", &part_read);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3708 vim_free(text);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3709 if (channel != NULL && eval)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3710 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3711 if (opt.jo_set & JO_TIMEOUT)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3712 timeout = opt.jo_timeout;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3713 else
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3714 timeout = channel_get_timeout(channel, part_read);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3715 if (channel_read_json_block(channel, part_read, timeout, id, &listtv)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3716 == OK)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3717 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3718 list_T *list = listtv->vval.v_list;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3719
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3720 /* Move the item from the list and then change the type to
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3721 * avoid the value being freed. */
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3722 *rettv = list->lv_last->li_tv;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3723 list->lv_last->li_tv.v_type = VAR_NUMBER;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3724 free_tv(listtv);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3725 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3726 }
8859
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
3727 free_job_options(&opt);
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3728 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3729
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3730 /*
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3731 * common for "ch_evalraw()" and "ch_sendraw()"
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3732 */
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3733 void
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3734 ch_raw_common(typval_T *argvars, typval_T *rettv, int eval)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3735 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3736 char_u buf[NUMBUFLEN];
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3737 char_u *text;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3738 channel_T *channel;
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3739 ch_part_T part_read;
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3740 jobopt_T opt;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3741 int timeout;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3742
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3743 /* return an empty string by default */
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3744 rettv->v_type = VAR_STRING;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3745 rettv->vval.v_string = NULL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3746
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3747 text = get_tv_string_buf(&argvars[1], buf);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3748 channel = send_common(argvars, text, 0, eval, &opt,
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3749 eval ? "ch_evalraw" : "ch_sendraw", &part_read);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3750 if (channel != NULL && eval)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3751 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3752 if (opt.jo_set & JO_TIMEOUT)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3753 timeout = opt.jo_timeout;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3754 else
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3755 timeout = channel_get_timeout(channel, part_read);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3756 rettv->vval.v_string = channel_read_block(channel, part_read, timeout);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3757 }
8859
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
3758 free_job_options(&opt);
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3759 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
3760
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3761 # if (defined(UNIX) && !defined(HAVE_SELECT)) || defined(PROTO)
7743
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3762 /*
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3763 * Add open channels to the poll struct.
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3764 * Return the adjusted struct index.
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3765 * The type of "fds" is hidden to avoid problems with the function proto.
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3766 */
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3767 int
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3768 channel_poll_setup(int nfd_in, void *fds_in)
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3769 {
8047
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
3770 int nfd = nfd_in;
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
3771 channel_T *channel;
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
3772 struct pollfd *fds = fds_in;
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3773 ch_part_T part;
7743
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3774
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
3775 for (channel = first_channel; channel != NULL; channel = channel->ch_next)
8049
15253130abd8 commit https://github.com/vim/vim/commit/16eb4f88000cfdba68df6c421fe44e7e029ba53e
Christian Brabandt <cb@256bit.org>
parents: 8047
diff changeset
3776 {
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3777 for (part = PART_SOCK; part < PART_IN; ++part)
8049
15253130abd8 commit https://github.com/vim/vim/commit/16eb4f88000cfdba68df6c421fe44e7e029ba53e
Christian Brabandt <cb@256bit.org>
parents: 8047
diff changeset
3778 {
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3779 chanpart_T *ch_part = &channel->ch_part[part];
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3780
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3781 if (ch_part->ch_fd != INVALID_FD)
8047
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
3782 {
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3783 ch_part->ch_poll_idx = nfd;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3784 fds[nfd].fd = ch_part->ch_fd;
8047
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
3785 fds[nfd].events = POLLIN;
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
3786 nfd++;
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
3787 }
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
3788 else
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3789 channel->ch_part[part].ch_poll_idx = -1;
8049
15253130abd8 commit https://github.com/vim/vim/commit/16eb4f88000cfdba68df6c421fe44e7e029ba53e
Christian Brabandt <cb@256bit.org>
parents: 8047
diff changeset
3790 }
15253130abd8 commit https://github.com/vim/vim/commit/16eb4f88000cfdba68df6c421fe44e7e029ba53e
Christian Brabandt <cb@256bit.org>
parents: 8047
diff changeset
3791 }
7743
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3792
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3793 nfd = channel_fill_poll_write(nfd, fds);
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3794
7743
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3795 return nfd;
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3796 }
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3797
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3798 /*
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3799 * The type of "fds" is hidden to avoid problems with the function proto.
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3800 */
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3801 int
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3802 channel_poll_check(int ret_in, void *fds_in)
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3803 {
8047
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
3804 int ret = ret_in;
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
3805 channel_T *channel;
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
3806 struct pollfd *fds = fds_in;
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3807 ch_part_T part;
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3808 int idx;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3809 chanpart_T *in_part;
7743
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3810
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
3811 for (channel = first_channel; channel != NULL; channel = channel->ch_next)
8049
15253130abd8 commit https://github.com/vim/vim/commit/16eb4f88000cfdba68df6c421fe44e7e029ba53e
Christian Brabandt <cb@256bit.org>
parents: 8047
diff changeset
3812 {
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3813 for (part = PART_SOCK; part < PART_IN; ++part)
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
3814 {
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3815 idx = channel->ch_part[part].ch_poll_idx;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3816
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3817 if (ret > 0 && idx != -1 && (fds[idx].revents & POLLIN))
8047
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
3818 {
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3819 channel_read(channel, part, "channel_poll_check");
8047
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
3820 --ret;
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
3821 }
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
3822 }
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3823
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3824 in_part = &channel->ch_part[PART_IN];
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3825 idx = in_part->ch_poll_idx;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3826 if (ret > 0 && idx != -1 && (fds[idx].revents & POLLOUT))
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3827 {
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3828 if (in_part->ch_buf_append)
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3829 {
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9434
diff changeset
3830 if (in_part->ch_bufref.br_buf != NULL)
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9434
diff changeset
3831 channel_write_new_lines(in_part->ch_bufref.br_buf);
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3832 }
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3833 else
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3834 channel_write_in(channel);
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3835 --ret;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3836 }
8049
15253130abd8 commit https://github.com/vim/vim/commit/16eb4f88000cfdba68df6c421fe44e7e029ba53e
Christian Brabandt <cb@256bit.org>
parents: 8047
diff changeset
3837 }
7743
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3838
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3839 return ret;
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3840 }
7770
42c1a4e63d12 commit https://github.com/vim/vim/commit/d04a020a8a8d7a438b091d49218c438880beb50c
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3841 # endif /* UNIX && !HAVE_SELECT */
7743
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3842
8122
39532ee7dd43 commit https://github.com/vim/vim/commit/ed5a78e11c80c7b13b233149fd4273b71fc96262
Christian Brabandt <cb@256bit.org>
parents: 8114
diff changeset
3843 # if (!defined(WIN32) && defined(HAVE_SELECT)) || defined(PROTO)
7743
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3844 /*
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3845 * The "fd_set" type is hidden to avoid problems with the function proto.
7743
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3846 */
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3847 int
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3848 channel_select_setup(int maxfd_in, void *rfds_in, void *wfds_in)
7743
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3849 {
8047
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
3850 int maxfd = maxfd_in;
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
3851 channel_T *channel;
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
3852 fd_set *rfds = rfds_in;
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3853 fd_set *wfds = wfds_in;
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3854 ch_part_T part;
7743
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3855
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
3856 for (channel = first_channel; channel != NULL; channel = channel->ch_next)
8049
15253130abd8 commit https://github.com/vim/vim/commit/16eb4f88000cfdba68df6c421fe44e7e029ba53e
Christian Brabandt <cb@256bit.org>
parents: 8047
diff changeset
3857 {
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3858 for (part = PART_SOCK; part < PART_IN; ++part)
7743
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3859 {
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3860 sock_T fd = channel->ch_part[part].ch_fd;
8047
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
3861
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3862 if (fd != INVALID_FD)
8047
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
3863 {
8059
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
3864 FD_SET((int)fd, rfds);
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
3865 if (maxfd < (int)fd)
19304db153bc commit https://github.com/vim/vim/commit/d807036d10615b960c814ef3890ecad335b57f56
Christian Brabandt <cb@256bit.org>
parents: 8055
diff changeset
3866 maxfd = (int)fd;
8047
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
3867 }
7743
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3868 }
8049
15253130abd8 commit https://github.com/vim/vim/commit/16eb4f88000cfdba68df6c421fe44e7e029ba53e
Christian Brabandt <cb@256bit.org>
parents: 8047
diff changeset
3869 }
7743
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3870
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3871 maxfd = channel_fill_wfds(maxfd, wfds);
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3872
7743
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3873 return maxfd;
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3874 }
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3875
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3876 /*
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3877 * The "fd_set" type is hidden to avoid problems with the function proto.
7743
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3878 */
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3879 int
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3880 channel_select_check(int ret_in, void *rfds_in, void *wfds_in)
7743
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3881 {
8047
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
3882 int ret = ret_in;
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
3883 channel_T *channel;
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
3884 fd_set *rfds = rfds_in;
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3885 fd_set *wfds = wfds_in;
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3886 ch_part_T part;
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3887 chanpart_T *in_part;
7743
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3888
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
3889 for (channel = first_channel; channel != NULL; channel = channel->ch_next)
8049
15253130abd8 commit https://github.com/vim/vim/commit/16eb4f88000cfdba68df6c421fe44e7e029ba53e
Christian Brabandt <cb@256bit.org>
parents: 8047
diff changeset
3890 {
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3891 for (part = PART_SOCK; part < PART_IN; ++part)
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
3892 {
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3893 sock_T fd = channel->ch_part[part].ch_fd;
8047
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
3894
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3895 if (ret > 0 && fd != INVALID_FD && FD_ISSET(fd, rfds))
8047
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
3896 {
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3897 channel_read(channel, part, "channel_select_check");
8047
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
3898 --ret;
7c74cafac0a1 commit https://github.com/vim/vim/commit/7b3ca76a451b10d238ef946f3231762e0bd988e9
Christian Brabandt <cb@256bit.org>
parents: 8041
diff changeset
3899 }
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8009
diff changeset
3900 }
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3901
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3902 in_part = &channel->ch_part[PART_IN];
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3903 if (ret > 0 && in_part->ch_fd != INVALID_FD
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3904 && FD_ISSET(in_part->ch_fd, wfds))
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3905 {
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3906 if (in_part->ch_buf_append)
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3907 {
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9434
diff changeset
3908 if (in_part->ch_bufref.br_buf != NULL)
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9434
diff changeset
3909 channel_write_new_lines(in_part->ch_bufref.br_buf);
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3910 }
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3911 else
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3912 channel_write_in(channel);
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3913 --ret;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
3914 }
8049
15253130abd8 commit https://github.com/vim/vim/commit/16eb4f88000cfdba68df6c421fe44e7e029ba53e
Christian Brabandt <cb@256bit.org>
parents: 8047
diff changeset
3915 }
7743
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3916
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3917 return ret;
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3918 }
8122
39532ee7dd43 commit https://github.com/vim/vim/commit/ed5a78e11c80c7b13b233149fd4273b71fc96262
Christian Brabandt <cb@256bit.org>
parents: 8114
diff changeset
3919 # endif /* !WIN32 && HAVE_SELECT */
7743
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3920
7840
28f569c7dab9 commit https://github.com/vim/vim/commit/20fb9f346497daca4d19402fdfa5de7958642477
Christian Brabandt <cb@256bit.org>
parents: 7817
diff changeset
3921 /*
7899
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
3922 * Execute queued up commands.
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
3923 * Invoked from the main loop when it's safe to execute received commands.
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
3924 * Return TRUE when something was done.
7840
28f569c7dab9 commit https://github.com/vim/vim/commit/20fb9f346497daca4d19402fdfa5de7958642477
Christian Brabandt <cb@256bit.org>
parents: 7817
diff changeset
3925 */
7899
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
3926 int
7840
28f569c7dab9 commit https://github.com/vim/vim/commit/20fb9f346497daca4d19402fdfa5de7958642477
Christian Brabandt <cb@256bit.org>
parents: 7817
diff changeset
3927 channel_parse_messages(void)
28f569c7dab9 commit https://github.com/vim/vim/commit/20fb9f346497daca4d19402fdfa5de7958642477
Christian Brabandt <cb@256bit.org>
parents: 7817
diff changeset
3928 {
8055
6db4b1c863ec commit https://github.com/vim/vim/commit/3bece9fee9c02934d3e295b29d253e13d4ef26a7
Christian Brabandt <cb@256bit.org>
parents: 8049
diff changeset
3929 channel_T *channel = first_channel;
6db4b1c863ec commit https://github.com/vim/vim/commit/3bece9fee9c02934d3e295b29d253e13d4ef26a7
Christian Brabandt <cb@256bit.org>
parents: 8049
diff changeset
3930 int ret = FALSE;
6db4b1c863ec commit https://github.com/vim/vim/commit/3bece9fee9c02934d3e295b29d253e13d4ef26a7
Christian Brabandt <cb@256bit.org>
parents: 8049
diff changeset
3931 int r;
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3932 ch_part_T part = PART_SOCK;
10406
42911b233245 commit https://github.com/vim/vim/commit/833eb1d752426689051bf2001083359899536939
Christian Brabandt <cb@256bit.org>
parents: 10386
diff changeset
3933 #ifdef ELAPSED_FUNC
42911b233245 commit https://github.com/vim/vim/commit/833eb1d752426689051bf2001083359899536939
Christian Brabandt <cb@256bit.org>
parents: 10386
diff changeset
3934 ELAPSED_TYPE start_tv;
42911b233245 commit https://github.com/vim/vim/commit/833eb1d752426689051bf2001083359899536939
Christian Brabandt <cb@256bit.org>
parents: 10386
diff changeset
3935
42911b233245 commit https://github.com/vim/vim/commit/833eb1d752426689051bf2001083359899536939
Christian Brabandt <cb@256bit.org>
parents: 10386
diff changeset
3936 ELAPSED_INIT(start_tv);
42911b233245 commit https://github.com/vim/vim/commit/833eb1d752426689051bf2001083359899536939
Christian Brabandt <cb@256bit.org>
parents: 10386
diff changeset
3937 #endif
7840
28f569c7dab9 commit https://github.com/vim/vim/commit/20fb9f346497daca4d19402fdfa5de7958642477
Christian Brabandt <cb@256bit.org>
parents: 7817
diff changeset
3938
9085
d362e6df1deb commit https://github.com/vim/vim/commit/fb6ffc732e65dbc459c89247ff78134402f1a18b
Christian Brabandt <cb@256bit.org>
parents: 9083
diff changeset
3939 ++safe_to_invoke_callback;
d362e6df1deb commit https://github.com/vim/vim/commit/fb6ffc732e65dbc459c89247ff78134402f1a18b
Christian Brabandt <cb@256bit.org>
parents: 9083
diff changeset
3940
8428
4e22d0e7bfb1 commit https://github.com/vim/vim/commit/d0b6502a7ace39d6cd30874110a572371d10beae
Christian Brabandt <cb@256bit.org>
parents: 8422
diff changeset
3941 /* Only do this message when another message was given, otherwise we get
4e22d0e7bfb1 commit https://github.com/vim/vim/commit/d0b6502a7ace39d6cd30874110a572371d10beae
Christian Brabandt <cb@256bit.org>
parents: 8422
diff changeset
3942 * lots of them. */
4e22d0e7bfb1 commit https://github.com/vim/vim/commit/d0b6502a7ace39d6cd30874110a572371d10beae
Christian Brabandt <cb@256bit.org>
parents: 8422
diff changeset
3943 if (did_log_msg)
4e22d0e7bfb1 commit https://github.com/vim/vim/commit/d0b6502a7ace39d6cd30874110a572371d10beae
Christian Brabandt <cb@256bit.org>
parents: 8422
diff changeset
3944 {
4e22d0e7bfb1 commit https://github.com/vim/vim/commit/d0b6502a7ace39d6cd30874110a572371d10beae
Christian Brabandt <cb@256bit.org>
parents: 8422
diff changeset
3945 ch_log(NULL, "looking for messages on channels");
4e22d0e7bfb1 commit https://github.com/vim/vim/commit/d0b6502a7ace39d6cd30874110a572371d10beae
Christian Brabandt <cb@256bit.org>
parents: 8422
diff changeset
3946 did_log_msg = FALSE;
4e22d0e7bfb1 commit https://github.com/vim/vim/commit/d0b6502a7ace39d6cd30874110a572371d10beae
Christian Brabandt <cb@256bit.org>
parents: 8422
diff changeset
3947 }
8055
6db4b1c863ec commit https://github.com/vim/vim/commit/3bece9fee9c02934d3e295b29d253e13d4ef26a7
Christian Brabandt <cb@256bit.org>
parents: 8049
diff changeset
3948 while (channel != NULL)
6db4b1c863ec commit https://github.com/vim/vim/commit/3bece9fee9c02934d3e295b29d253e13d4ef26a7
Christian Brabandt <cb@256bit.org>
parents: 8049
diff changeset
3949 {
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3950 if (channel->ch_to_be_closed == 0)
9083
69bb7b230094 commit https://github.com/vim/vim/commit/cf7ff70ca73218d618e7c00ab785bcf5f9120a94
Christian Brabandt <cb@256bit.org>
parents: 9081
diff changeset
3951 {
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3952 channel->ch_to_be_closed = (1 << PART_COUNT);
9083
69bb7b230094 commit https://github.com/vim/vim/commit/cf7ff70ca73218d618e7c00ab785bcf5f9120a94
Christian Brabandt <cb@256bit.org>
parents: 9081
diff changeset
3953 channel_close_now(channel);
69bb7b230094 commit https://github.com/vim/vim/commit/cf7ff70ca73218d618e7c00ab785bcf5f9120a94
Christian Brabandt <cb@256bit.org>
parents: 9081
diff changeset
3954 /* channel may have been freed, start over */
69bb7b230094 commit https://github.com/vim/vim/commit/cf7ff70ca73218d618e7c00ab785bcf5f9120a94
Christian Brabandt <cb@256bit.org>
parents: 9081
diff changeset
3955 channel = first_channel;
69bb7b230094 commit https://github.com/vim/vim/commit/cf7ff70ca73218d618e7c00ab785bcf5f9120a94
Christian Brabandt <cb@256bit.org>
parents: 9081
diff changeset
3956 continue;
69bb7b230094 commit https://github.com/vim/vim/commit/cf7ff70ca73218d618e7c00ab785bcf5f9120a94
Christian Brabandt <cb@256bit.org>
parents: 9081
diff changeset
3957 }
9085
d362e6df1deb commit https://github.com/vim/vim/commit/fb6ffc732e65dbc459c89247ff78134402f1a18b
Christian Brabandt <cb@256bit.org>
parents: 9083
diff changeset
3958 if (channel->ch_to_be_freed)
d362e6df1deb commit https://github.com/vim/vim/commit/fb6ffc732e65dbc459c89247ff78134402f1a18b
Christian Brabandt <cb@256bit.org>
parents: 9083
diff changeset
3959 {
d362e6df1deb commit https://github.com/vim/vim/commit/fb6ffc732e65dbc459c89247ff78134402f1a18b
Christian Brabandt <cb@256bit.org>
parents: 9083
diff changeset
3960 channel_free(channel);
d362e6df1deb commit https://github.com/vim/vim/commit/fb6ffc732e65dbc459c89247ff78134402f1a18b
Christian Brabandt <cb@256bit.org>
parents: 9083
diff changeset
3961 /* channel has been freed, start over */
d362e6df1deb commit https://github.com/vim/vim/commit/fb6ffc732e65dbc459c89247ff78134402f1a18b
Christian Brabandt <cb@256bit.org>
parents: 9083
diff changeset
3962 channel = first_channel;
d362e6df1deb commit https://github.com/vim/vim/commit/fb6ffc732e65dbc459c89247ff78134402f1a18b
Christian Brabandt <cb@256bit.org>
parents: 9083
diff changeset
3963 continue;
d362e6df1deb commit https://github.com/vim/vim/commit/fb6ffc732e65dbc459c89247ff78134402f1a18b
Christian Brabandt <cb@256bit.org>
parents: 9083
diff changeset
3964 }
8259
99a70c3b902f commit https://github.com/vim/vim/commit/46c85439c966d7ed39fb3d711d4d6c61ac964647
Christian Brabandt <cb@256bit.org>
parents: 8257
diff changeset
3965 if (channel->ch_refcount == 0 && !channel_still_useful(channel))
8257
c4ffdda8cdfd commit https://github.com/vim/vim/commit/c8dcbb12c5d7f3eb0c334daebb4475bb015b91e7
Christian Brabandt <cb@256bit.org>
parents: 8240
diff changeset
3966 {
c4ffdda8cdfd commit https://github.com/vim/vim/commit/c8dcbb12c5d7f3eb0c334daebb4475bb015b91e7
Christian Brabandt <cb@256bit.org>
parents: 8240
diff changeset
3967 /* channel is no longer useful, free it */
c4ffdda8cdfd commit https://github.com/vim/vim/commit/c8dcbb12c5d7f3eb0c334daebb4475bb015b91e7
Christian Brabandt <cb@256bit.org>
parents: 8240
diff changeset
3968 channel_free(channel);
c4ffdda8cdfd commit https://github.com/vim/vim/commit/c8dcbb12c5d7f3eb0c334daebb4475bb015b91e7
Christian Brabandt <cb@256bit.org>
parents: 8240
diff changeset
3969 channel = first_channel;
c4ffdda8cdfd commit https://github.com/vim/vim/commit/c8dcbb12c5d7f3eb0c334daebb4475bb015b91e7
Christian Brabandt <cb@256bit.org>
parents: 8240
diff changeset
3970 part = PART_SOCK;
c4ffdda8cdfd commit https://github.com/vim/vim/commit/c8dcbb12c5d7f3eb0c334daebb4475bb015b91e7
Christian Brabandt <cb@256bit.org>
parents: 8240
diff changeset
3971 continue;
c4ffdda8cdfd commit https://github.com/vim/vim/commit/c8dcbb12c5d7f3eb0c334daebb4475bb015b91e7
Christian Brabandt <cb@256bit.org>
parents: 8240
diff changeset
3972 }
8267
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
3973 if (channel->ch_part[part].ch_fd != INVALID_FD
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
3974 || channel_has_readahead(channel, part))
7899
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
3975 {
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3976 /* Increase the refcount, in case the handler causes the channel
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3977 * to be unreferenced or closed. */
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3978 ++channel->ch_refcount;
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3979 r = may_invoke_callback(channel, part);
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3980 if (r == OK)
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3981 ret = TRUE;
10406
42911b233245 commit https://github.com/vim/vim/commit/833eb1d752426689051bf2001083359899536939
Christian Brabandt <cb@256bit.org>
parents: 10386
diff changeset
3982 if (channel_unref(channel) || (r == OK
42911b233245 commit https://github.com/vim/vim/commit/833eb1d752426689051bf2001083359899536939
Christian Brabandt <cb@256bit.org>
parents: 10386
diff changeset
3983 #ifdef ELAPSED_FUNC
42911b233245 commit https://github.com/vim/vim/commit/833eb1d752426689051bf2001083359899536939
Christian Brabandt <cb@256bit.org>
parents: 10386
diff changeset
3984 /* Limit the time we loop here to 100 msec, otherwise
42911b233245 commit https://github.com/vim/vim/commit/833eb1d752426689051bf2001083359899536939
Christian Brabandt <cb@256bit.org>
parents: 10386
diff changeset
3985 * Vim becomes unresponsive when the callback takes
42911b233245 commit https://github.com/vim/vim/commit/833eb1d752426689051bf2001083359899536939
Christian Brabandt <cb@256bit.org>
parents: 10386
diff changeset
3986 * more than a bit of time. */
42911b233245 commit https://github.com/vim/vim/commit/833eb1d752426689051bf2001083359899536939
Christian Brabandt <cb@256bit.org>
parents: 10386
diff changeset
3987 && ELAPSED_FUNC(start_tv) < 100L
42911b233245 commit https://github.com/vim/vim/commit/833eb1d752426689051bf2001083359899536939
Christian Brabandt <cb@256bit.org>
parents: 10386
diff changeset
3988 #endif
42911b233245 commit https://github.com/vim/vim/commit/833eb1d752426689051bf2001083359899536939
Christian Brabandt <cb@256bit.org>
parents: 10386
diff changeset
3989 ))
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3990 {
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3991 /* channel was freed or something was done, start over */
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3992 channel = first_channel;
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3993 part = PART_SOCK;
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3994 continue;
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3995 }
7899
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
3996 }
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3997 if (part < PART_ERR)
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
3998 ++part;
8055
6db4b1c863ec commit https://github.com/vim/vim/commit/3bece9fee9c02934d3e295b29d253e13d4ef26a7
Christian Brabandt <cb@256bit.org>
parents: 8049
diff changeset
3999 else
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
4000 {
8055
6db4b1c863ec commit https://github.com/vim/vim/commit/3bece9fee9c02934d3e295b29d253e13d4ef26a7
Christian Brabandt <cb@256bit.org>
parents: 8049
diff changeset
4001 channel = channel->ch_next;
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
4002 part = PART_SOCK;
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
4003 }
8055
6db4b1c863ec commit https://github.com/vim/vim/commit/3bece9fee9c02934d3e295b29d253e13d4ef26a7
Christian Brabandt <cb@256bit.org>
parents: 8049
diff changeset
4004 }
8267
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
4005
8928
e6916e1683bb commit https://github.com/vim/vim/commit/7f7c3325d3f1baba32263a3457cfc4d90ecd5ff1
Christian Brabandt <cb@256bit.org>
parents: 8881
diff changeset
4006 if (channel_need_redraw)
8267
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
4007 {
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
4008 channel_need_redraw = FALSE;
8928
e6916e1683bb commit https://github.com/vim/vim/commit/7f7c3325d3f1baba32263a3457cfc4d90ecd5ff1
Christian Brabandt <cb@256bit.org>
parents: 8881
diff changeset
4009 redraw_after_callback();
8267
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
4010 }
108d30ed34ba commit https://github.com/vim/vim/commit/187db50d0499aecf4cfd42fb4db0a1bebf61c8cd
Christian Brabandt <cb@256bit.org>
parents: 8261
diff changeset
4011
9085
d362e6df1deb commit https://github.com/vim/vim/commit/fb6ffc732e65dbc459c89247ff78134402f1a18b
Christian Brabandt <cb@256bit.org>
parents: 9083
diff changeset
4012 --safe_to_invoke_callback;
d362e6df1deb commit https://github.com/vim/vim/commit/fb6ffc732e65dbc459c89247ff78134402f1a18b
Christian Brabandt <cb@256bit.org>
parents: 9083
diff changeset
4013
7899
93c61501c2cf commit https://github.com/vim/vim/commit/d7ece1008ee6173afda6d173bed486ae79c1c38a
Christian Brabandt <cb@256bit.org>
parents: 7885
diff changeset
4014 return ret;
7840
28f569c7dab9 commit https://github.com/vim/vim/commit/20fb9f346497daca4d19402fdfa5de7958642477
Christian Brabandt <cb@256bit.org>
parents: 7817
diff changeset
4015 }
28f569c7dab9 commit https://github.com/vim/vim/commit/20fb9f346497daca4d19402fdfa5de7958642477
Christian Brabandt <cb@256bit.org>
parents: 7817
diff changeset
4016
7961
a7e58c6e4e9a commit https://github.com/vim/vim/commit/fbc4b4db3a9690906a96e16724350a6241cf32a5
Christian Brabandt <cb@256bit.org>
parents: 7945
diff changeset
4017 /*
10418
56cb9538386c commit https://github.com/vim/vim/commit/8a8199e4a1814b10630a770165502abb1121cd1b
Christian Brabandt <cb@256bit.org>
parents: 10406
diff changeset
4018 * Return TRUE if any channel has readahead. That means we should not block on
56cb9538386c commit https://github.com/vim/vim/commit/8a8199e4a1814b10630a770165502abb1121cd1b
Christian Brabandt <cb@256bit.org>
parents: 10406
diff changeset
4019 * waiting for input.
56cb9538386c commit https://github.com/vim/vim/commit/8a8199e4a1814b10630a770165502abb1121cd1b
Christian Brabandt <cb@256bit.org>
parents: 10406
diff changeset
4020 */
56cb9538386c commit https://github.com/vim/vim/commit/8a8199e4a1814b10630a770165502abb1121cd1b
Christian Brabandt <cb@256bit.org>
parents: 10406
diff changeset
4021 int
56cb9538386c commit https://github.com/vim/vim/commit/8a8199e4a1814b10630a770165502abb1121cd1b
Christian Brabandt <cb@256bit.org>
parents: 10406
diff changeset
4022 channel_any_readahead(void)
56cb9538386c commit https://github.com/vim/vim/commit/8a8199e4a1814b10630a770165502abb1121cd1b
Christian Brabandt <cb@256bit.org>
parents: 10406
diff changeset
4023 {
56cb9538386c commit https://github.com/vim/vim/commit/8a8199e4a1814b10630a770165502abb1121cd1b
Christian Brabandt <cb@256bit.org>
parents: 10406
diff changeset
4024 channel_T *channel = first_channel;
56cb9538386c commit https://github.com/vim/vim/commit/8a8199e4a1814b10630a770165502abb1121cd1b
Christian Brabandt <cb@256bit.org>
parents: 10406
diff changeset
4025 ch_part_T part = PART_SOCK;
56cb9538386c commit https://github.com/vim/vim/commit/8a8199e4a1814b10630a770165502abb1121cd1b
Christian Brabandt <cb@256bit.org>
parents: 10406
diff changeset
4026
56cb9538386c commit https://github.com/vim/vim/commit/8a8199e4a1814b10630a770165502abb1121cd1b
Christian Brabandt <cb@256bit.org>
parents: 10406
diff changeset
4027 while (channel != NULL)
56cb9538386c commit https://github.com/vim/vim/commit/8a8199e4a1814b10630a770165502abb1121cd1b
Christian Brabandt <cb@256bit.org>
parents: 10406
diff changeset
4028 {
56cb9538386c commit https://github.com/vim/vim/commit/8a8199e4a1814b10630a770165502abb1121cd1b
Christian Brabandt <cb@256bit.org>
parents: 10406
diff changeset
4029 if (channel_has_readahead(channel, part))
56cb9538386c commit https://github.com/vim/vim/commit/8a8199e4a1814b10630a770165502abb1121cd1b
Christian Brabandt <cb@256bit.org>
parents: 10406
diff changeset
4030 return TRUE;
56cb9538386c commit https://github.com/vim/vim/commit/8a8199e4a1814b10630a770165502abb1121cd1b
Christian Brabandt <cb@256bit.org>
parents: 10406
diff changeset
4031 if (part < PART_ERR)
56cb9538386c commit https://github.com/vim/vim/commit/8a8199e4a1814b10630a770165502abb1121cd1b
Christian Brabandt <cb@256bit.org>
parents: 10406
diff changeset
4032 ++part;
56cb9538386c commit https://github.com/vim/vim/commit/8a8199e4a1814b10630a770165502abb1121cd1b
Christian Brabandt <cb@256bit.org>
parents: 10406
diff changeset
4033 else
56cb9538386c commit https://github.com/vim/vim/commit/8a8199e4a1814b10630a770165502abb1121cd1b
Christian Brabandt <cb@256bit.org>
parents: 10406
diff changeset
4034 {
56cb9538386c commit https://github.com/vim/vim/commit/8a8199e4a1814b10630a770165502abb1121cd1b
Christian Brabandt <cb@256bit.org>
parents: 10406
diff changeset
4035 channel = channel->ch_next;
56cb9538386c commit https://github.com/vim/vim/commit/8a8199e4a1814b10630a770165502abb1121cd1b
Christian Brabandt <cb@256bit.org>
parents: 10406
diff changeset
4036 part = PART_SOCK;
56cb9538386c commit https://github.com/vim/vim/commit/8a8199e4a1814b10630a770165502abb1121cd1b
Christian Brabandt <cb@256bit.org>
parents: 10406
diff changeset
4037 }
56cb9538386c commit https://github.com/vim/vim/commit/8a8199e4a1814b10630a770165502abb1121cd1b
Christian Brabandt <cb@256bit.org>
parents: 10406
diff changeset
4038 }
56cb9538386c commit https://github.com/vim/vim/commit/8a8199e4a1814b10630a770165502abb1121cd1b
Christian Brabandt <cb@256bit.org>
parents: 10406
diff changeset
4039 return FALSE;
56cb9538386c commit https://github.com/vim/vim/commit/8a8199e4a1814b10630a770165502abb1121cd1b
Christian Brabandt <cb@256bit.org>
parents: 10406
diff changeset
4040 }
56cb9538386c commit https://github.com/vim/vim/commit/8a8199e4a1814b10630a770165502abb1121cd1b
Christian Brabandt <cb@256bit.org>
parents: 10406
diff changeset
4041
56cb9538386c commit https://github.com/vim/vim/commit/8a8199e4a1814b10630a770165502abb1121cd1b
Christian Brabandt <cb@256bit.org>
parents: 10406
diff changeset
4042 /*
7961
a7e58c6e4e9a commit https://github.com/vim/vim/commit/fbc4b4db3a9690906a96e16724350a6241cf32a5
Christian Brabandt <cb@256bit.org>
parents: 7945
diff changeset
4043 * Mark references to lists used in channels.
a7e58c6e4e9a commit https://github.com/vim/vim/commit/fbc4b4db3a9690906a96e16724350a6241cf32a5
Christian Brabandt <cb@256bit.org>
parents: 7945
diff changeset
4044 */
7931
2679e636e862 commit https://github.com/vim/vim/commit/4b6a6dcbe7bd13170c4884cc17acb1eac2c633d1
Christian Brabandt <cb@256bit.org>
parents: 7929
diff changeset
4045 int
2679e636e862 commit https://github.com/vim/vim/commit/4b6a6dcbe7bd13170c4884cc17acb1eac2c633d1
Christian Brabandt <cb@256bit.org>
parents: 7929
diff changeset
4046 set_ref_in_channel(int copyID)
2679e636e862 commit https://github.com/vim/vim/commit/4b6a6dcbe7bd13170c4884cc17acb1eac2c633d1
Christian Brabandt <cb@256bit.org>
parents: 7929
diff changeset
4047 {
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
4048 int abort = FALSE;
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
4049 channel_T *channel;
9058
87c2e43a4a12 commit https://github.com/vim/vim/commit/b8d4905592fc26fcd09180d7d6bfefd899f2f6c6
Christian Brabandt <cb@256bit.org>
parents: 9050
diff changeset
4050 typval_T tv;
7931
2679e636e862 commit https://github.com/vim/vim/commit/4b6a6dcbe7bd13170c4884cc17acb1eac2c633d1
Christian Brabandt <cb@256bit.org>
parents: 7929
diff changeset
4051
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
4052 for (channel = first_channel; channel != NULL; channel = channel->ch_next)
9058
87c2e43a4a12 commit https://github.com/vim/vim/commit/b8d4905592fc26fcd09180d7d6bfefd899f2f6c6
Christian Brabandt <cb@256bit.org>
parents: 9050
diff changeset
4053 if (channel_still_useful(channel))
7931
2679e636e862 commit https://github.com/vim/vim/commit/4b6a6dcbe7bd13170c4884cc17acb1eac2c633d1
Christian Brabandt <cb@256bit.org>
parents: 7929
diff changeset
4054 {
9058
87c2e43a4a12 commit https://github.com/vim/vim/commit/b8d4905592fc26fcd09180d7d6bfefd899f2f6c6
Christian Brabandt <cb@256bit.org>
parents: 9050
diff changeset
4055 tv.v_type = VAR_CHANNEL;
87c2e43a4a12 commit https://github.com/vim/vim/commit/b8d4905592fc26fcd09180d7d6bfefd899f2f6c6
Christian Brabandt <cb@256bit.org>
parents: 9050
diff changeset
4056 tv.vval.v_channel = channel;
87c2e43a4a12 commit https://github.com/vim/vim/commit/b8d4905592fc26fcd09180d7d6bfefd899f2f6c6
Christian Brabandt <cb@256bit.org>
parents: 9050
diff changeset
4057 abort = abort || set_ref_in_item(&tv, copyID, NULL, NULL);
7931
2679e636e862 commit https://github.com/vim/vim/commit/4b6a6dcbe7bd13170c4884cc17acb1eac2c633d1
Christian Brabandt <cb@256bit.org>
parents: 7929
diff changeset
4058 }
2679e636e862 commit https://github.com/vim/vim/commit/4b6a6dcbe7bd13170c4884cc17acb1eac2c633d1
Christian Brabandt <cb@256bit.org>
parents: 7929
diff changeset
4059 return abort;
2679e636e862 commit https://github.com/vim/vim/commit/4b6a6dcbe7bd13170c4884cc17acb1eac2c633d1
Christian Brabandt <cb@256bit.org>
parents: 7929
diff changeset
4060 }
7986
8e0d4cd8157a commit https://github.com/vim/vim/commit/ae8eb3ca927f1b0ac2a6643da8699538cdc380f6
Christian Brabandt <cb@256bit.org>
parents: 7982
diff changeset
4061
8e0d4cd8157a commit https://github.com/vim/vim/commit/ae8eb3ca927f1b0ac2a6643da8699538cdc380f6
Christian Brabandt <cb@256bit.org>
parents: 7982
diff changeset
4062 /*
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
4063 * Return the "part" to write to for "channel".
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
4064 */
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
4065 ch_part_T
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
4066 channel_part_send(channel_T *channel)
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
4067 {
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
4068 if (channel->CH_SOCK_FD == INVALID_FD)
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
4069 return PART_IN;
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
4070 return PART_SOCK;
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
4071 }
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
4072
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
4073 /*
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
4074 * Return the default "part" to read from for "channel".
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
4075 */
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
4076 ch_part_T
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
4077 channel_part_read(channel_T *channel)
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
4078 {
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
4079 if (channel->CH_SOCK_FD == INVALID_FD)
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
4080 return PART_OUT;
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
4081 return PART_SOCK;
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
4082 }
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
4083
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
4084 /*
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
4085 * Return the mode of "channel"/"part"
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
4086 * If "channel" is invalid returns MODE_JSON.
7986
8e0d4cd8157a commit https://github.com/vim/vim/commit/ae8eb3ca927f1b0ac2a6643da8699538cdc380f6
Christian Brabandt <cb@256bit.org>
parents: 7982
diff changeset
4087 */
8e0d4cd8157a commit https://github.com/vim/vim/commit/ae8eb3ca927f1b0ac2a6643da8699538cdc380f6
Christian Brabandt <cb@256bit.org>
parents: 7982
diff changeset
4088 ch_mode_T
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
4089 channel_get_mode(channel_T *channel, ch_part_T part)
7986
8e0d4cd8157a commit https://github.com/vim/vim/commit/ae8eb3ca927f1b0ac2a6643da8699538cdc380f6
Christian Brabandt <cb@256bit.org>
parents: 7982
diff changeset
4090 {
8041
c6443e78cf2d commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents: 8039
diff changeset
4091 if (channel == NULL)
7986
8e0d4cd8157a commit https://github.com/vim/vim/commit/ae8eb3ca927f1b0ac2a6643da8699538cdc380f6
Christian Brabandt <cb@256bit.org>
parents: 7982
diff changeset
4092 return MODE_JSON;
8151
aa845d10c6fb commit https://github.com/vim/vim/commit/42d38a2db17e70312d073095257555c27a5f9443
Christian Brabandt <cb@256bit.org>
parents: 8134
diff changeset
4093 return channel->ch_part[part].ch_mode;
7986
8e0d4cd8157a commit https://github.com/vim/vim/commit/ae8eb3ca927f1b0ac2a6643da8699538cdc380f6
Christian Brabandt <cb@256bit.org>
parents: 7982
diff changeset
4094 }
8e0d4cd8157a commit https://github.com/vim/vim/commit/ae8eb3ca927f1b0ac2a6643da8699538cdc380f6
Christian Brabandt <cb@256bit.org>
parents: 7982
diff changeset
4095
8157
74b44d06d3c7 commit https://github.com/vim/vim/commit/6f3a544228c1faf92211cbaf8bbedb1dff883f90
Christian Brabandt <cb@256bit.org>
parents: 8155
diff changeset
4096 /*
74b44d06d3c7 commit https://github.com/vim/vim/commit/6f3a544228c1faf92211cbaf8bbedb1dff883f90
Christian Brabandt <cb@256bit.org>
parents: 8155
diff changeset
4097 * Return the timeout of "channel"/"part"
74b44d06d3c7 commit https://github.com/vim/vim/commit/6f3a544228c1faf92211cbaf8bbedb1dff883f90
Christian Brabandt <cb@256bit.org>
parents: 8155
diff changeset
4098 */
74b44d06d3c7 commit https://github.com/vim/vim/commit/6f3a544228c1faf92211cbaf8bbedb1dff883f90
Christian Brabandt <cb@256bit.org>
parents: 8155
diff changeset
4099 int
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
4100 channel_get_timeout(channel_T *channel, ch_part_T part)
8157
74b44d06d3c7 commit https://github.com/vim/vim/commit/6f3a544228c1faf92211cbaf8bbedb1dff883f90
Christian Brabandt <cb@256bit.org>
parents: 8155
diff changeset
4101 {
74b44d06d3c7 commit https://github.com/vim/vim/commit/6f3a544228c1faf92211cbaf8bbedb1dff883f90
Christian Brabandt <cb@256bit.org>
parents: 8155
diff changeset
4102 return channel->ch_part[part].ch_timeout;
74b44d06d3c7 commit https://github.com/vim/vim/commit/6f3a544228c1faf92211cbaf8bbedb1dff883f90
Christian Brabandt <cb@256bit.org>
parents: 8155
diff changeset
4103 }
74b44d06d3c7 commit https://github.com/vim/vim/commit/6f3a544228c1faf92211cbaf8bbedb1dff883f90
Christian Brabandt <cb@256bit.org>
parents: 8155
diff changeset
4104
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4105 static int
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4106 handle_mode(typval_T *item, jobopt_T *opt, ch_mode_T *modep, int jo)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4107 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4108 char_u *val = get_tv_string(item);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4109
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4110 opt->jo_set |= jo;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4111 if (STRCMP(val, "nl") == 0)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4112 *modep = MODE_NL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4113 else if (STRCMP(val, "raw") == 0)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4114 *modep = MODE_RAW;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4115 else if (STRCMP(val, "js") == 0)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4116 *modep = MODE_JS;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4117 else if (STRCMP(val, "json") == 0)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4118 *modep = MODE_JSON;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4119 else
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4120 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4121 EMSG2(_(e_invarg2), val);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4122 return FAIL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4123 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4124 return OK;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4125 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4126
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4127 static int
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
4128 handle_io(typval_T *item, ch_part_T part, jobopt_T *opt)
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4129 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4130 char_u *val = get_tv_string(item);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4131
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4132 opt->jo_set |= JO_OUT_IO << (part - PART_OUT);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4133 if (STRCMP(val, "null") == 0)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4134 opt->jo_io[part] = JIO_NULL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4135 else if (STRCMP(val, "pipe") == 0)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4136 opt->jo_io[part] = JIO_PIPE;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4137 else if (STRCMP(val, "file") == 0)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4138 opt->jo_io[part] = JIO_FILE;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4139 else if (STRCMP(val, "buffer") == 0)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4140 opt->jo_io[part] = JIO_BUFFER;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4141 else if (STRCMP(val, "out") == 0 && part == PART_ERR)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4142 opt->jo_io[part] = JIO_OUT;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4143 else
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4144 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4145 EMSG2(_(e_invarg2), val);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4146 return FAIL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4147 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4148 return OK;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4149 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4150
8859
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
4151 /*
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
4152 * Clear a jobopt_T before using it.
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
4153 */
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4154 void
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4155 clear_job_options(jobopt_T *opt)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4156 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4157 vim_memset(opt, 0, sizeof(jobopt_T));
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4158 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4159
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4160 /*
8859
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
4161 * Free any members of a jobopt_T.
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
4162 */
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
4163 void
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
4164 free_job_options(jobopt_T *opt)
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
4165 {
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
4166 if (opt->jo_partial != NULL)
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
4167 partial_unref(opt->jo_partial);
9723
80ac9cf77c9b commit https://github.com/vim/vim/commit/437bafe4c8a83ed71ee006eda7f54b65a90f0d4c
Christian Brabandt <cb@256bit.org>
parents: 9711
diff changeset
4168 else if (opt->jo_callback != NULL)
80ac9cf77c9b commit https://github.com/vim/vim/commit/437bafe4c8a83ed71ee006eda7f54b65a90f0d4c
Christian Brabandt <cb@256bit.org>
parents: 9711
diff changeset
4169 func_unref(opt->jo_callback);
8859
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
4170 if (opt->jo_out_partial != NULL)
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
4171 partial_unref(opt->jo_out_partial);
9723
80ac9cf77c9b commit https://github.com/vim/vim/commit/437bafe4c8a83ed71ee006eda7f54b65a90f0d4c
Christian Brabandt <cb@256bit.org>
parents: 9711
diff changeset
4172 else if (opt->jo_out_cb != NULL)
80ac9cf77c9b commit https://github.com/vim/vim/commit/437bafe4c8a83ed71ee006eda7f54b65a90f0d4c
Christian Brabandt <cb@256bit.org>
parents: 9711
diff changeset
4173 func_unref(opt->jo_out_cb);
8859
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
4174 if (opt->jo_err_partial != NULL)
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
4175 partial_unref(opt->jo_err_partial);
9723
80ac9cf77c9b commit https://github.com/vim/vim/commit/437bafe4c8a83ed71ee006eda7f54b65a90f0d4c
Christian Brabandt <cb@256bit.org>
parents: 9711
diff changeset
4176 else if (opt->jo_err_cb != NULL)
80ac9cf77c9b commit https://github.com/vim/vim/commit/437bafe4c8a83ed71ee006eda7f54b65a90f0d4c
Christian Brabandt <cb@256bit.org>
parents: 9711
diff changeset
4177 func_unref(opt->jo_err_cb);
8859
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
4178 if (opt->jo_close_partial != NULL)
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
4179 partial_unref(opt->jo_close_partial);
9723
80ac9cf77c9b commit https://github.com/vim/vim/commit/437bafe4c8a83ed71ee006eda7f54b65a90f0d4c
Christian Brabandt <cb@256bit.org>
parents: 9711
diff changeset
4180 else if (opt->jo_close_cb != NULL)
80ac9cf77c9b commit https://github.com/vim/vim/commit/437bafe4c8a83ed71ee006eda7f54b65a90f0d4c
Christian Brabandt <cb@256bit.org>
parents: 9711
diff changeset
4181 func_unref(opt->jo_close_cb);
9151
d0f69d0bea7a commit https://github.com/vim/vim/commit/ef3abc6442260e9a0314970a532400b05571d3fe
Christian Brabandt <cb@256bit.org>
parents: 9149
diff changeset
4182 if (opt->jo_exit_partial != NULL)
d0f69d0bea7a commit https://github.com/vim/vim/commit/ef3abc6442260e9a0314970a532400b05571d3fe
Christian Brabandt <cb@256bit.org>
parents: 9149
diff changeset
4183 partial_unref(opt->jo_exit_partial);
9723
80ac9cf77c9b commit https://github.com/vim/vim/commit/437bafe4c8a83ed71ee006eda7f54b65a90f0d4c
Christian Brabandt <cb@256bit.org>
parents: 9711
diff changeset
4184 else if (opt->jo_exit_cb != NULL)
80ac9cf77c9b commit https://github.com/vim/vim/commit/437bafe4c8a83ed71ee006eda7f54b65a90f0d4c
Christian Brabandt <cb@256bit.org>
parents: 9711
diff changeset
4185 func_unref(opt->jo_exit_cb);
8859
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
4186 }
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
4187
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
4188 /*
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4189 * Get the PART_ number from the first character of an option name.
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4190 */
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4191 static int
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4192 part_from_char(int c)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4193 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4194 return c == 'i' ? PART_IN : c == 'o' ? PART_OUT: PART_ERR;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4195 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4196
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4197 /*
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4198 * Get the option entries from the dict in "tv", parse them and put the result
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4199 * in "opt".
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4200 * Only accept options in "supported".
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4201 * If an option value is invalid return FAIL.
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4202 */
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4203 int
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4204 get_job_options(typval_T *tv, jobopt_T *opt, int supported)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4205 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4206 typval_T *item;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4207 char_u *val;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4208 dict_T *dict;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4209 int todo;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4210 hashitem_T *hi;
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
4211 ch_part_T part;
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4212
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4213 opt->jo_set = 0;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4214 if (tv->v_type == VAR_UNKNOWN)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4215 return OK;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4216 if (tv->v_type != VAR_DICT)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4217 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4218 EMSG(_(e_invarg));
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4219 return FAIL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4220 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4221 dict = tv->vval.v_dict;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4222 if (dict == NULL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4223 return OK;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4224
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4225 todo = (int)dict->dv_hashtab.ht_used;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4226 for (hi = dict->dv_hashtab.ht_array; todo > 0; ++hi)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4227 if (!HASHITEM_EMPTY(hi))
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4228 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4229 item = &dict_lookup(hi)->di_tv;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4230
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4231 if (STRCMP(hi->hi_key, "mode") == 0)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4232 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4233 if (!(supported & JO_MODE))
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4234 break;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4235 if (handle_mode(item, opt, &opt->jo_mode, JO_MODE) == FAIL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4236 return FAIL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4237 }
8540
fec8655cf1bf commit https://github.com/vim/vim/commit/d6c2f0526064eef6f8917d2bad00df707d79ea16
Christian Brabandt <cb@256bit.org>
parents: 8538
diff changeset
4238 else if (STRCMP(hi->hi_key, "in_mode") == 0)
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4239 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4240 if (!(supported & JO_IN_MODE))
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4241 break;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4242 if (handle_mode(item, opt, &opt->jo_in_mode, JO_IN_MODE)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4243 == FAIL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4244 return FAIL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4245 }
8540
fec8655cf1bf commit https://github.com/vim/vim/commit/d6c2f0526064eef6f8917d2bad00df707d79ea16
Christian Brabandt <cb@256bit.org>
parents: 8538
diff changeset
4246 else if (STRCMP(hi->hi_key, "out_mode") == 0)
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4247 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4248 if (!(supported & JO_OUT_MODE))
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4249 break;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4250 if (handle_mode(item, opt, &opt->jo_out_mode, JO_OUT_MODE)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4251 == FAIL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4252 return FAIL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4253 }
8540
fec8655cf1bf commit https://github.com/vim/vim/commit/d6c2f0526064eef6f8917d2bad00df707d79ea16
Christian Brabandt <cb@256bit.org>
parents: 8538
diff changeset
4254 else if (STRCMP(hi->hi_key, "err_mode") == 0)
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4255 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4256 if (!(supported & JO_ERR_MODE))
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4257 break;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4258 if (handle_mode(item, opt, &opt->jo_err_mode, JO_ERR_MODE)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4259 == FAIL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4260 return FAIL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4261 }
8540
fec8655cf1bf commit https://github.com/vim/vim/commit/d6c2f0526064eef6f8917d2bad00df707d79ea16
Christian Brabandt <cb@256bit.org>
parents: 8538
diff changeset
4262 else if (STRCMP(hi->hi_key, "in_io") == 0
fec8655cf1bf commit https://github.com/vim/vim/commit/d6c2f0526064eef6f8917d2bad00df707d79ea16
Christian Brabandt <cb@256bit.org>
parents: 8538
diff changeset
4263 || STRCMP(hi->hi_key, "out_io") == 0
fec8655cf1bf commit https://github.com/vim/vim/commit/d6c2f0526064eef6f8917d2bad00df707d79ea16
Christian Brabandt <cb@256bit.org>
parents: 8538
diff changeset
4264 || STRCMP(hi->hi_key, "err_io") == 0)
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4265 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4266 if (!(supported & JO_OUT_IO))
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4267 break;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4268 if (handle_io(item, part_from_char(*hi->hi_key), opt) == FAIL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4269 return FAIL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4270 }
8540
fec8655cf1bf commit https://github.com/vim/vim/commit/d6c2f0526064eef6f8917d2bad00df707d79ea16
Christian Brabandt <cb@256bit.org>
parents: 8538
diff changeset
4271 else if (STRCMP(hi->hi_key, "in_name") == 0
fec8655cf1bf commit https://github.com/vim/vim/commit/d6c2f0526064eef6f8917d2bad00df707d79ea16
Christian Brabandt <cb@256bit.org>
parents: 8538
diff changeset
4272 || STRCMP(hi->hi_key, "out_name") == 0
fec8655cf1bf commit https://github.com/vim/vim/commit/d6c2f0526064eef6f8917d2bad00df707d79ea16
Christian Brabandt <cb@256bit.org>
parents: 8538
diff changeset
4273 || STRCMP(hi->hi_key, "err_name") == 0)
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4274 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4275 part = part_from_char(*hi->hi_key);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4276
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4277 if (!(supported & JO_OUT_IO))
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4278 break;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4279 opt->jo_set |= JO_OUT_NAME << (part - PART_OUT);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4280 opt->jo_io_name[part] =
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4281 get_tv_string_buf_chk(item, opt->jo_io_name_buf[part]);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4282 }
8540
fec8655cf1bf commit https://github.com/vim/vim/commit/d6c2f0526064eef6f8917d2bad00df707d79ea16
Christian Brabandt <cb@256bit.org>
parents: 8538
diff changeset
4283 else if (STRCMP(hi->hi_key, "in_buf") == 0
fec8655cf1bf commit https://github.com/vim/vim/commit/d6c2f0526064eef6f8917d2bad00df707d79ea16
Christian Brabandt <cb@256bit.org>
parents: 8538
diff changeset
4284 || STRCMP(hi->hi_key, "out_buf") == 0
fec8655cf1bf commit https://github.com/vim/vim/commit/d6c2f0526064eef6f8917d2bad00df707d79ea16
Christian Brabandt <cb@256bit.org>
parents: 8538
diff changeset
4285 || STRCMP(hi->hi_key, "err_buf") == 0)
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4286 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4287 part = part_from_char(*hi->hi_key);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4288
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4289 if (!(supported & JO_OUT_IO))
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4290 break;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4291 opt->jo_set |= JO_OUT_BUF << (part - PART_OUT);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4292 opt->jo_io_buf[part] = get_tv_number(item);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4293 if (opt->jo_io_buf[part] <= 0)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4294 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4295 EMSG2(_(e_invarg2), get_tv_string(item));
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4296 return FAIL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4297 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4298 if (buflist_findnr(opt->jo_io_buf[part]) == NULL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4299 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4300 EMSGN(_(e_nobufnr), (long)opt->jo_io_buf[part]);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4301 return FAIL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4302 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4303 }
9147
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
4304 else if (STRCMP(hi->hi_key, "out_modifiable") == 0
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
4305 || STRCMP(hi->hi_key, "err_modifiable") == 0)
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
4306 {
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
4307 part = part_from_char(*hi->hi_key);
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
4308
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
4309 if (!(supported & JO_OUT_IO))
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
4310 break;
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
4311 opt->jo_set |= JO_OUT_MODIFIABLE << (part - PART_OUT);
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
4312 opt->jo_modifiable[part] = get_tv_number(item);
053bc64433ec commit https://github.com/vim/vim/commit/9f5842e63fc63d438cbffcec503e072a06f74dc2
Christian Brabandt <cb@256bit.org>
parents: 9143
diff changeset
4313 }
10147
65afd399ffa7 commit https://github.com/vim/vim/commit/169ebb080454357279ad5ad21ac532deaec605e8
Christian Brabandt <cb@256bit.org>
parents: 10112
diff changeset
4314 else if (STRCMP(hi->hi_key, "out_msg") == 0
65afd399ffa7 commit https://github.com/vim/vim/commit/169ebb080454357279ad5ad21ac532deaec605e8
Christian Brabandt <cb@256bit.org>
parents: 10112
diff changeset
4315 || STRCMP(hi->hi_key, "err_msg") == 0)
65afd399ffa7 commit https://github.com/vim/vim/commit/169ebb080454357279ad5ad21ac532deaec605e8
Christian Brabandt <cb@256bit.org>
parents: 10112
diff changeset
4316 {
65afd399ffa7 commit https://github.com/vim/vim/commit/169ebb080454357279ad5ad21ac532deaec605e8
Christian Brabandt <cb@256bit.org>
parents: 10112
diff changeset
4317 part = part_from_char(*hi->hi_key);
65afd399ffa7 commit https://github.com/vim/vim/commit/169ebb080454357279ad5ad21ac532deaec605e8
Christian Brabandt <cb@256bit.org>
parents: 10112
diff changeset
4318
65afd399ffa7 commit https://github.com/vim/vim/commit/169ebb080454357279ad5ad21ac532deaec605e8
Christian Brabandt <cb@256bit.org>
parents: 10112
diff changeset
4319 if (!(supported & JO_OUT_IO))
65afd399ffa7 commit https://github.com/vim/vim/commit/169ebb080454357279ad5ad21ac532deaec605e8
Christian Brabandt <cb@256bit.org>
parents: 10112
diff changeset
4320 break;
65afd399ffa7 commit https://github.com/vim/vim/commit/169ebb080454357279ad5ad21ac532deaec605e8
Christian Brabandt <cb@256bit.org>
parents: 10112
diff changeset
4321 opt->jo_set2 |= JO2_OUT_MSG << (part - PART_OUT);
65afd399ffa7 commit https://github.com/vim/vim/commit/169ebb080454357279ad5ad21ac532deaec605e8
Christian Brabandt <cb@256bit.org>
parents: 10112
diff changeset
4322 opt->jo_message[part] = get_tv_number(item);
65afd399ffa7 commit https://github.com/vim/vim/commit/169ebb080454357279ad5ad21ac532deaec605e8
Christian Brabandt <cb@256bit.org>
parents: 10112
diff changeset
4323 }
8540
fec8655cf1bf commit https://github.com/vim/vim/commit/d6c2f0526064eef6f8917d2bad00df707d79ea16
Christian Brabandt <cb@256bit.org>
parents: 8538
diff changeset
4324 else if (STRCMP(hi->hi_key, "in_top") == 0
fec8655cf1bf commit https://github.com/vim/vim/commit/d6c2f0526064eef6f8917d2bad00df707d79ea16
Christian Brabandt <cb@256bit.org>
parents: 8538
diff changeset
4325 || STRCMP(hi->hi_key, "in_bot") == 0)
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4326 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4327 linenr_T *lp;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4328
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4329 if (!(supported & JO_OUT_IO))
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4330 break;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4331 if (hi->hi_key[3] == 't')
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4332 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4333 lp = &opt->jo_in_top;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4334 opt->jo_set |= JO_IN_TOP;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4335 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4336 else
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4337 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4338 lp = &opt->jo_in_bot;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4339 opt->jo_set |= JO_IN_BOT;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4340 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4341 *lp = get_tv_number(item);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4342 if (*lp < 0)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4343 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4344 EMSG2(_(e_invarg2), get_tv_string(item));
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4345 return FAIL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4346 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4347 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4348 else if (STRCMP(hi->hi_key, "channel") == 0)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4349 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4350 if (!(supported & JO_OUT_IO))
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4351 break;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4352 opt->jo_set |= JO_CHANNEL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4353 if (item->v_type != VAR_CHANNEL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4354 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4355 EMSG2(_(e_invarg2), "channel");
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4356 return FAIL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4357 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4358 opt->jo_channel = item->vval.v_channel;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4359 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4360 else if (STRCMP(hi->hi_key, "callback") == 0)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4361 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4362 if (!(supported & JO_CALLBACK))
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4363 break;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4364 opt->jo_set |= JO_CALLBACK;
8538
c337c813c64d commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents: 8508
diff changeset
4365 opt->jo_callback = get_callback(item, &opt->jo_partial);
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4366 if (opt->jo_callback == NULL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4367 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4368 EMSG2(_(e_invarg2), "callback");
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4369 return FAIL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4370 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4371 }
8540
fec8655cf1bf commit https://github.com/vim/vim/commit/d6c2f0526064eef6f8917d2bad00df707d79ea16
Christian Brabandt <cb@256bit.org>
parents: 8538
diff changeset
4372 else if (STRCMP(hi->hi_key, "out_cb") == 0)
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4373 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4374 if (!(supported & JO_OUT_CALLBACK))
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4375 break;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4376 opt->jo_set |= JO_OUT_CALLBACK;
8538
c337c813c64d commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents: 8508
diff changeset
4377 opt->jo_out_cb = get_callback(item, &opt->jo_out_partial);
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4378 if (opt->jo_out_cb == NULL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4379 {
8540
fec8655cf1bf commit https://github.com/vim/vim/commit/d6c2f0526064eef6f8917d2bad00df707d79ea16
Christian Brabandt <cb@256bit.org>
parents: 8538
diff changeset
4380 EMSG2(_(e_invarg2), "out_cb");
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4381 return FAIL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4382 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4383 }
8540
fec8655cf1bf commit https://github.com/vim/vim/commit/d6c2f0526064eef6f8917d2bad00df707d79ea16
Christian Brabandt <cb@256bit.org>
parents: 8538
diff changeset
4384 else if (STRCMP(hi->hi_key, "err_cb") == 0)
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4385 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4386 if (!(supported & JO_ERR_CALLBACK))
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4387 break;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4388 opt->jo_set |= JO_ERR_CALLBACK;
8538
c337c813c64d commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents: 8508
diff changeset
4389 opt->jo_err_cb = get_callback(item, &opt->jo_err_partial);
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4390 if (opt->jo_err_cb == NULL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4391 {
8540
fec8655cf1bf commit https://github.com/vim/vim/commit/d6c2f0526064eef6f8917d2bad00df707d79ea16
Christian Brabandt <cb@256bit.org>
parents: 8538
diff changeset
4392 EMSG2(_(e_invarg2), "err_cb");
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4393 return FAIL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4394 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4395 }
8540
fec8655cf1bf commit https://github.com/vim/vim/commit/d6c2f0526064eef6f8917d2bad00df707d79ea16
Christian Brabandt <cb@256bit.org>
parents: 8538
diff changeset
4396 else if (STRCMP(hi->hi_key, "close_cb") == 0)
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4397 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4398 if (!(supported & JO_CLOSE_CALLBACK))
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4399 break;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4400 opt->jo_set |= JO_CLOSE_CALLBACK;
8538
c337c813c64d commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents: 8508
diff changeset
4401 opt->jo_close_cb = get_callback(item, &opt->jo_close_partial);
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4402 if (opt->jo_close_cb == NULL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4403 {
8540
fec8655cf1bf commit https://github.com/vim/vim/commit/d6c2f0526064eef6f8917d2bad00df707d79ea16
Christian Brabandt <cb@256bit.org>
parents: 8538
diff changeset
4404 EMSG2(_(e_invarg2), "close_cb");
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4405 return FAIL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4406 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4407 }
10426
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
4408 else if (STRCMP(hi->hi_key, "drop") == 0)
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
4409 {
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
4410 int never = FALSE;
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
4411 val = get_tv_string(item);
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
4412
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
4413 if (STRCMP(val, "never") == 0)
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
4414 never = TRUE;
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
4415 else if (STRCMP(val, "auto") != 0)
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
4416 {
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
4417 EMSG2(_(e_invarg2), "drop");
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
4418 return FAIL;
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
4419 }
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
4420 opt->jo_drop_never = never;
acfc83aca8ee commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents: 10422
diff changeset
4421 }
9151
d0f69d0bea7a commit https://github.com/vim/vim/commit/ef3abc6442260e9a0314970a532400b05571d3fe
Christian Brabandt <cb@256bit.org>
parents: 9149
diff changeset
4422 else if (STRCMP(hi->hi_key, "exit_cb") == 0)
d0f69d0bea7a commit https://github.com/vim/vim/commit/ef3abc6442260e9a0314970a532400b05571d3fe
Christian Brabandt <cb@256bit.org>
parents: 9149
diff changeset
4423 {
d0f69d0bea7a commit https://github.com/vim/vim/commit/ef3abc6442260e9a0314970a532400b05571d3fe
Christian Brabandt <cb@256bit.org>
parents: 9149
diff changeset
4424 if (!(supported & JO_EXIT_CB))
d0f69d0bea7a commit https://github.com/vim/vim/commit/ef3abc6442260e9a0314970a532400b05571d3fe
Christian Brabandt <cb@256bit.org>
parents: 9149
diff changeset
4425 break;
d0f69d0bea7a commit https://github.com/vim/vim/commit/ef3abc6442260e9a0314970a532400b05571d3fe
Christian Brabandt <cb@256bit.org>
parents: 9149
diff changeset
4426 opt->jo_set |= JO_EXIT_CB;
d0f69d0bea7a commit https://github.com/vim/vim/commit/ef3abc6442260e9a0314970a532400b05571d3fe
Christian Brabandt <cb@256bit.org>
parents: 9149
diff changeset
4427 opt->jo_exit_cb = get_callback(item, &opt->jo_exit_partial);
d0f69d0bea7a commit https://github.com/vim/vim/commit/ef3abc6442260e9a0314970a532400b05571d3fe
Christian Brabandt <cb@256bit.org>
parents: 9149
diff changeset
4428 if (opt->jo_exit_cb == NULL)
d0f69d0bea7a commit https://github.com/vim/vim/commit/ef3abc6442260e9a0314970a532400b05571d3fe
Christian Brabandt <cb@256bit.org>
parents: 9149
diff changeset
4429 {
d0f69d0bea7a commit https://github.com/vim/vim/commit/ef3abc6442260e9a0314970a532400b05571d3fe
Christian Brabandt <cb@256bit.org>
parents: 9149
diff changeset
4430 EMSG2(_(e_invarg2), "exit_cb");
d0f69d0bea7a commit https://github.com/vim/vim/commit/ef3abc6442260e9a0314970a532400b05571d3fe
Christian Brabandt <cb@256bit.org>
parents: 9149
diff changeset
4431 return FAIL;
d0f69d0bea7a commit https://github.com/vim/vim/commit/ef3abc6442260e9a0314970a532400b05571d3fe
Christian Brabandt <cb@256bit.org>
parents: 9149
diff changeset
4432 }
d0f69d0bea7a commit https://github.com/vim/vim/commit/ef3abc6442260e9a0314970a532400b05571d3fe
Christian Brabandt <cb@256bit.org>
parents: 9149
diff changeset
4433 }
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4434 else if (STRCMP(hi->hi_key, "waittime") == 0)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4435 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4436 if (!(supported & JO_WAITTIME))
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4437 break;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4438 opt->jo_set |= JO_WAITTIME;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4439 opt->jo_waittime = get_tv_number(item);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4440 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4441 else if (STRCMP(hi->hi_key, "timeout") == 0)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4442 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4443 if (!(supported & JO_TIMEOUT))
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4444 break;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4445 opt->jo_set |= JO_TIMEOUT;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4446 opt->jo_timeout = get_tv_number(item);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4447 }
8540
fec8655cf1bf commit https://github.com/vim/vim/commit/d6c2f0526064eef6f8917d2bad00df707d79ea16
Christian Brabandt <cb@256bit.org>
parents: 8538
diff changeset
4448 else if (STRCMP(hi->hi_key, "out_timeout") == 0)
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4449 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4450 if (!(supported & JO_OUT_TIMEOUT))
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4451 break;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4452 opt->jo_set |= JO_OUT_TIMEOUT;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4453 opt->jo_out_timeout = get_tv_number(item);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4454 }
8540
fec8655cf1bf commit https://github.com/vim/vim/commit/d6c2f0526064eef6f8917d2bad00df707d79ea16
Christian Brabandt <cb@256bit.org>
parents: 8538
diff changeset
4455 else if (STRCMP(hi->hi_key, "err_timeout") == 0)
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4456 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4457 if (!(supported & JO_ERR_TIMEOUT))
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4458 break;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4459 opt->jo_set |= JO_ERR_TIMEOUT;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4460 opt->jo_err_timeout = get_tv_number(item);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4461 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4462 else if (STRCMP(hi->hi_key, "part") == 0)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4463 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4464 if (!(supported & JO_PART))
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4465 break;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4466 opt->jo_set |= JO_PART;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4467 val = get_tv_string(item);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4468 if (STRCMP(val, "err") == 0)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4469 opt->jo_part = PART_ERR;
10233
d709622a18c9 commit https://github.com/vim/vim/commit/7ef3810d28b7ab2edbfcafab3fe8ad8bc2c2f138
Christian Brabandt <cb@256bit.org>
parents: 10147
diff changeset
4470 else if (STRCMP(val, "out") == 0)
d709622a18c9 commit https://github.com/vim/vim/commit/7ef3810d28b7ab2edbfcafab3fe8ad8bc2c2f138
Christian Brabandt <cb@256bit.org>
parents: 10147
diff changeset
4471 opt->jo_part = PART_OUT;
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4472 else
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4473 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4474 EMSG2(_(e_invarg2), val);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4475 return FAIL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4476 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4477 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4478 else if (STRCMP(hi->hi_key, "id") == 0)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4479 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4480 if (!(supported & JO_ID))
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4481 break;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4482 opt->jo_set |= JO_ID;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4483 opt->jo_id = get_tv_number(item);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4484 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4485 else if (STRCMP(hi->hi_key, "stoponexit") == 0)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4486 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4487 if (!(supported & JO_STOPONEXIT))
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4488 break;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4489 opt->jo_set |= JO_STOPONEXIT;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4490 opt->jo_stoponexit = get_tv_string_buf_chk(item,
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4491 opt->jo_soe_buf);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4492 if (opt->jo_stoponexit == NULL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4493 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4494 EMSG2(_(e_invarg2), "stoponexit");
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4495 return FAIL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4496 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4497 }
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
4498 else if (STRCMP(hi->hi_key, "block_write") == 0)
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
4499 {
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
4500 if (!(supported & JO_BLOCK_WRITE))
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
4501 break;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
4502 opt->jo_set |= JO_BLOCK_WRITE;
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
4503 opt->jo_block_write = get_tv_number(item);
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
4504 }
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4505 else
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4506 break;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4507 --todo;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4508 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4509 if (todo > 0)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4510 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4511 EMSG2(_(e_invarg2), hi->hi_key);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4512 return FAIL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4513 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4514
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4515 return OK;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4516 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4517
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4518 /*
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4519 * Get the channel from the argument.
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4520 * Returns NULL if the handle is invalid.
9007
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
4521 * When "check_open" is TRUE check that the channel can be used.
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
4522 * When "reading" is TRUE "check_open" considers typeahead useful.
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
4523 * "part" is used to check typeahead, when PART_COUNT use the default part.
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4524 */
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4525 channel_T *
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
4526 get_channel_arg(typval_T *tv, int check_open, int reading, ch_part_T part)
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4527 {
9007
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
4528 channel_T *channel = NULL;
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
4529 int has_readahead = FALSE;
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4530
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4531 if (tv->v_type == VAR_JOB)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4532 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4533 if (tv->vval.v_job != NULL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4534 channel = tv->vval.v_job->jv_channel;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4535 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4536 else if (tv->v_type == VAR_CHANNEL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4537 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4538 channel = tv->vval.v_channel;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4539 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4540 else
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4541 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4542 EMSG2(_(e_invarg2), get_tv_string(tv));
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4543 return NULL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4544 }
9007
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
4545 if (channel != NULL && reading)
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
4546 has_readahead = channel_has_readahead(channel,
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
4547 part != PART_COUNT ? part : channel_part_read(channel));
9007
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
4548
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
4549 if (check_open && (channel == NULL || (!channel_is_open(channel)
d5c6f1c5cd28 commit https://github.com/vim/vim/commit/437905c25d4cedfa16d0f87392e4a000d22362b7
Christian Brabandt <cb@256bit.org>
parents: 9003
diff changeset
4550 && !(reading && has_readahead))))
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4551 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4552 EMSG(_("E906: not an open channel"));
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4553 return NULL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4554 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4555 return channel;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4556 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4557
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4558 static job_T *first_job = NULL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4559
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4560 static void
8863
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4561 job_free_contents(job_T *job)
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4562 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4563 ch_log(job->jv_channel, "Freeing job");
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4564 if (job->jv_channel != NULL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4565 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4566 /* The link from the channel to the job doesn't count as a reference,
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4567 * thus don't decrement the refcount of the job. The reference from
9355
40c8a8b012b5 commit https://github.com/vim/vim/commit/aad30bbcde2b268e2fffb6fd1443f27ebda9d1ff
Christian Brabandt <cb@256bit.org>
parents: 9282
diff changeset
4568 * the job to the channel does count the reference, decrement it and
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4569 * NULL the reference. We don't set ch_job_killed, unreferencing the
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4570 * job doesn't mean it stops running. */
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4571 job->jv_channel->ch_job = NULL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4572 channel_unref(job->jv_channel);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4573 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4574 mch_clear_job(job);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4575
8863
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4576 vim_free(job->jv_stoponexit);
9491
404de131cff9 commit https://github.com/vim/vim/commit/1436d8d51cce114be56209924fc71376407e5bad
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
4577 free_callback(job->jv_exit_cb, job->jv_exit_partial);
8863
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4578 }
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4579
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4580 static void
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4581 job_free_job(job_T *job)
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4582 {
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4583 if (job->jv_next != NULL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4584 job->jv_next->jv_prev = job->jv_prev;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4585 if (job->jv_prev == NULL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4586 first_job = job->jv_next;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4587 else
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4588 job->jv_prev->jv_next = job->jv_next;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4589 vim_free(job);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4590 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4591
8863
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4592 static void
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4593 job_free(job_T *job)
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4594 {
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4595 if (!in_free_unref_items)
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4596 {
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4597 job_free_contents(job);
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4598 job_free_job(job);
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4599 }
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4600 }
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4601
10386
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4602 #if defined(EXITFREE) || defined(PROTO)
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4603 void
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4604 job_free_all(void)
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4605 {
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4606 while (first_job != NULL)
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4607 job_free(first_job);
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4608 }
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4609 #endif
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4610
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4611 /*
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4612 * Return TRUE if we need to check if the process of "job" has ended.
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4613 */
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4614 static int
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4615 job_need_end_check(job_T *job)
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4616 {
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4617 return job->jv_status == JOB_STARTED
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4618 && (job->jv_stoponexit != NULL || job->jv_exit_cb != NULL);
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4619 }
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4620
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4621 /*
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4622 * Return TRUE if the channel of "job" is still useful.
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4623 */
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4624 static int
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4625 job_channel_still_useful(job_T *job)
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4626 {
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4627 return job->jv_channel != NULL && channel_still_useful(job->jv_channel);
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4628 }
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4629
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4630 /*
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4631 * Return TRUE if the job should not be freed yet. Do not free the job when
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4632 * it has not ended yet and there is a "stoponexit" flag, an exit callback
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4633 * or when the associated channel will do something with the job output.
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4634 */
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4635 static int
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4636 job_still_useful(job_T *job)
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4637 {
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4638 return job_need_end_check(job) || job_channel_still_useful(job);
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4639 }
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4640
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4641 /*
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4642 * NOTE: Must call job_cleanup() only once right after the status of "job"
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4643 * changed to JOB_ENDED (i.e. after job_status() returned "dead" first or
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4644 * mch_detect_ended_job() returned non-NULL).
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4645 */
10279
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
4646 static void
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
4647 job_cleanup(job_T *job)
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
4648 {
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
4649 if (job->jv_status != JOB_ENDED)
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
4650 return;
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
4651
10386
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4652 /* Ready to cleanup the job. */
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4653 job->jv_status = JOB_FINISHED;
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4654
10279
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
4655 if (job->jv_exit_cb != NULL)
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
4656 {
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
4657 typval_T argv[3];
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
4658 typval_T rettv;
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
4659 int dummy;
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
4660
10386
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4661 /* Invoke the exit callback. Make sure the refcount is > 0. */
10279
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
4662 ++job->jv_refcount;
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
4663 argv[0].v_type = VAR_JOB;
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
4664 argv[0].vval.v_job = job;
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
4665 argv[1].v_type = VAR_NUMBER;
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
4666 argv[1].vval.v_number = job->jv_exitval;
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
4667 call_func(job->jv_exit_cb, (int)STRLEN(job->jv_exit_cb),
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
4668 &rettv, 2, argv, NULL, 0L, 0L, &dummy, TRUE,
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
4669 job->jv_exit_partial, NULL);
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
4670 clear_tv(&rettv);
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
4671 --job->jv_refcount;
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
4672 channel_need_redraw = TRUE;
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
4673 }
10386
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4674
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4675 /* Do not free the job in case the close callback of the associated channel
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4676 * isn't invoked yet and may get information by job_info(). */
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4677 if (job->jv_refcount == 0 && !job_channel_still_useful(job))
10279
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
4678 {
10386
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4679 /* The job was already unreferenced and the associated channel was
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4680 * detached, now that it ended it can be freed. Careful: caller must
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4681 * not use "job" after this! */
10279
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
4682 job_free(job);
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
4683 }
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
4684 }
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
4685
9058
87c2e43a4a12 commit https://github.com/vim/vim/commit/b8d4905592fc26fcd09180d7d6bfefd899f2f6c6
Christian Brabandt <cb@256bit.org>
parents: 9050
diff changeset
4686 /*
87c2e43a4a12 commit https://github.com/vim/vim/commit/b8d4905592fc26fcd09180d7d6bfefd899f2f6c6
Christian Brabandt <cb@256bit.org>
parents: 9050
diff changeset
4687 * Mark references in jobs that are still useful.
87c2e43a4a12 commit https://github.com/vim/vim/commit/b8d4905592fc26fcd09180d7d6bfefd899f2f6c6
Christian Brabandt <cb@256bit.org>
parents: 9050
diff changeset
4688 */
87c2e43a4a12 commit https://github.com/vim/vim/commit/b8d4905592fc26fcd09180d7d6bfefd899f2f6c6
Christian Brabandt <cb@256bit.org>
parents: 9050
diff changeset
4689 int
87c2e43a4a12 commit https://github.com/vim/vim/commit/b8d4905592fc26fcd09180d7d6bfefd899f2f6c6
Christian Brabandt <cb@256bit.org>
parents: 9050
diff changeset
4690 set_ref_in_job(int copyID)
87c2e43a4a12 commit https://github.com/vim/vim/commit/b8d4905592fc26fcd09180d7d6bfefd899f2f6c6
Christian Brabandt <cb@256bit.org>
parents: 9050
diff changeset
4691 {
87c2e43a4a12 commit https://github.com/vim/vim/commit/b8d4905592fc26fcd09180d7d6bfefd899f2f6c6
Christian Brabandt <cb@256bit.org>
parents: 9050
diff changeset
4692 int abort = FALSE;
87c2e43a4a12 commit https://github.com/vim/vim/commit/b8d4905592fc26fcd09180d7d6bfefd899f2f6c6
Christian Brabandt <cb@256bit.org>
parents: 9050
diff changeset
4693 job_T *job;
87c2e43a4a12 commit https://github.com/vim/vim/commit/b8d4905592fc26fcd09180d7d6bfefd899f2f6c6
Christian Brabandt <cb@256bit.org>
parents: 9050
diff changeset
4694 typval_T tv;
87c2e43a4a12 commit https://github.com/vim/vim/commit/b8d4905592fc26fcd09180d7d6bfefd899f2f6c6
Christian Brabandt <cb@256bit.org>
parents: 9050
diff changeset
4695
87c2e43a4a12 commit https://github.com/vim/vim/commit/b8d4905592fc26fcd09180d7d6bfefd899f2f6c6
Christian Brabandt <cb@256bit.org>
parents: 9050
diff changeset
4696 for (job = first_job; job != NULL; job = job->jv_next)
10386
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4697 if (job_still_useful(job))
9058
87c2e43a4a12 commit https://github.com/vim/vim/commit/b8d4905592fc26fcd09180d7d6bfefd899f2f6c6
Christian Brabandt <cb@256bit.org>
parents: 9050
diff changeset
4698 {
87c2e43a4a12 commit https://github.com/vim/vim/commit/b8d4905592fc26fcd09180d7d6bfefd899f2f6c6
Christian Brabandt <cb@256bit.org>
parents: 9050
diff changeset
4699 tv.v_type = VAR_JOB;
87c2e43a4a12 commit https://github.com/vim/vim/commit/b8d4905592fc26fcd09180d7d6bfefd899f2f6c6
Christian Brabandt <cb@256bit.org>
parents: 9050
diff changeset
4700 tv.vval.v_job = job;
87c2e43a4a12 commit https://github.com/vim/vim/commit/b8d4905592fc26fcd09180d7d6bfefd899f2f6c6
Christian Brabandt <cb@256bit.org>
parents: 9050
diff changeset
4701 abort = abort || set_ref_in_item(&tv, copyID, NULL, NULL);
87c2e43a4a12 commit https://github.com/vim/vim/commit/b8d4905592fc26fcd09180d7d6bfefd899f2f6c6
Christian Brabandt <cb@256bit.org>
parents: 9050
diff changeset
4702 }
87c2e43a4a12 commit https://github.com/vim/vim/commit/b8d4905592fc26fcd09180d7d6bfefd899f2f6c6
Christian Brabandt <cb@256bit.org>
parents: 9050
diff changeset
4703 return abort;
87c2e43a4a12 commit https://github.com/vim/vim/commit/b8d4905592fc26fcd09180d7d6bfefd899f2f6c6
Christian Brabandt <cb@256bit.org>
parents: 9050
diff changeset
4704 }
87c2e43a4a12 commit https://github.com/vim/vim/commit/b8d4905592fc26fcd09180d7d6bfefd899f2f6c6
Christian Brabandt <cb@256bit.org>
parents: 9050
diff changeset
4705
10386
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4706 /*
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4707 * Dereference "job". Note that after this "job" may have been freed.
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4708 */
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4709 void
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4710 job_unref(job_T *job)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4711 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4712 if (job != NULL && --job->jv_refcount <= 0)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4713 {
10386
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4714 /* Do not free the job if there is a channel where the close callback
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4715 * may get the job info. */
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4716 if (!job_channel_still_useful(job))
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4717 {
10386
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4718 /* Do not free the job when it has not ended yet and there is a
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4719 * "stoponexit" flag or an exit callback. */
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4720 if (!job_need_end_check(job))
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4721 {
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4722 job_free(job);
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4723 }
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4724 else if (job->jv_channel != NULL)
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4725 {
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4726 /* Do remove the link to the channel, otherwise it hangs
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4727 * around until Vim exits. See job_free() for refcount. */
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4728 ch_log(job->jv_channel, "detaching channel from job");
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4729 job->jv_channel->ch_job = NULL;
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4730 channel_unref(job->jv_channel);
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4731 job->jv_channel = NULL;
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4732 }
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4733 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4734 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4735 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4736
8863
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4737 int
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4738 free_unused_jobs_contents(int copyID, int mask)
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4739 {
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4740 int did_free = FALSE;
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4741 job_T *job;
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4742
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4743 for (job = first_job; job != NULL; job = job->jv_next)
8881
ed0b39dd7fd6 commit https://github.com/vim/vim/commit/ebf7dfa6f121c82f97d2adca3d45fbaba9ad8f7e
Christian Brabandt <cb@256bit.org>
parents: 8863
diff changeset
4744 if ((job->jv_copyID & mask) != (copyID & mask)
10386
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4745 && !job_still_useful(job))
8863
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4746 {
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4747 /* Free the channel and ordinary items it contains, but don't
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4748 * recurse into Lists, Dictionaries etc. */
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4749 job_free_contents(job);
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4750 did_free = TRUE;
9079
2cd83c854073 commit https://github.com/vim/vim/commit/36e0f7da9bc4a6ee8a7b17df503542a339e034c8
Christian Brabandt <cb@256bit.org>
parents: 9064
diff changeset
4751 }
8863
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4752 return did_free;
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4753 }
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4754
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4755 void
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4756 free_unused_jobs(int copyID, int mask)
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4757 {
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4758 job_T *job;
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4759 job_T *job_next;
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4760
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4761 for (job = first_job; job != NULL; job = job_next)
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4762 {
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4763 job_next = job->jv_next;
8881
ed0b39dd7fd6 commit https://github.com/vim/vim/commit/ebf7dfa6f121c82f97d2adca3d45fbaba9ad8f7e
Christian Brabandt <cb@256bit.org>
parents: 8863
diff changeset
4764 if ((job->jv_copyID & mask) != (copyID & mask)
10386
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4765 && !job_still_useful(job))
8863
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4766 {
8881
ed0b39dd7fd6 commit https://github.com/vim/vim/commit/ebf7dfa6f121c82f97d2adca3d45fbaba9ad8f7e
Christian Brabandt <cb@256bit.org>
parents: 8863
diff changeset
4767 /* Free the job struct itself. */
8863
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4768 job_free_job(job);
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4769 }
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4770 }
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4771 }
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8859
diff changeset
4772
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4773 /*
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4774 * Allocate a job. Sets the refcount to one and sets options default.
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4775 */
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4776 static job_T *
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4777 job_alloc(void)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4778 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4779 job_T *job;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4780
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4781 job = (job_T *)alloc_clear(sizeof(job_T));
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4782 if (job != NULL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4783 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4784 job->jv_refcount = 1;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4785 job->jv_stoponexit = vim_strsave((char_u *)"term");
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4786
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4787 if (first_job != NULL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4788 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4789 first_job->jv_prev = job;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4790 job->jv_next = first_job;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4791 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4792 first_job = job;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4793 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4794 return job;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4795 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4796
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4797 void
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4798 job_set_options(job_T *job, jobopt_T *opt)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4799 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4800 if (opt->jo_set & JO_STOPONEXIT)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4801 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4802 vim_free(job->jv_stoponexit);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4803 if (opt->jo_stoponexit == NULL || *opt->jo_stoponexit == NUL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4804 job->jv_stoponexit = NULL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4805 else
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4806 job->jv_stoponexit = vim_strsave(opt->jo_stoponexit);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4807 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4808 if (opt->jo_set & JO_EXIT_CB)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4809 {
9491
404de131cff9 commit https://github.com/vim/vim/commit/1436d8d51cce114be56209924fc71376407e5bad
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
4810 free_callback(job->jv_exit_cb, job->jv_exit_partial);
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4811 if (opt->jo_exit_cb == NULL || *opt->jo_exit_cb == NUL)
8538
c337c813c64d commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents: 8508
diff changeset
4812 {
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4813 job->jv_exit_cb = NULL;
8538
c337c813c64d commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents: 8508
diff changeset
4814 job->jv_exit_partial = NULL;
c337c813c64d commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents: 8508
diff changeset
4815 }
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4816 else
8538
c337c813c64d commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents: 8508
diff changeset
4817 {
c337c813c64d commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents: 8508
diff changeset
4818 job->jv_exit_partial = opt->jo_exit_partial;
c337c813c64d commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents: 8508
diff changeset
4819 if (job->jv_exit_partial != NULL)
9711
b74515b8f3d4 commit https://github.com/vim/vim/commit/57e69ff2cca9edee3546373d04e0dde6810309e5
Christian Brabandt <cb@256bit.org>
parents: 9626
diff changeset
4820 {
b74515b8f3d4 commit https://github.com/vim/vim/commit/57e69ff2cca9edee3546373d04e0dde6810309e5
Christian Brabandt <cb@256bit.org>
parents: 9626
diff changeset
4821 job->jv_exit_cb = opt->jo_exit_cb;
8538
c337c813c64d commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents: 8508
diff changeset
4822 ++job->jv_exit_partial->pt_refcount;
9711
b74515b8f3d4 commit https://github.com/vim/vim/commit/57e69ff2cca9edee3546373d04e0dde6810309e5
Christian Brabandt <cb@256bit.org>
parents: 9626
diff changeset
4823 }
b74515b8f3d4 commit https://github.com/vim/vim/commit/57e69ff2cca9edee3546373d04e0dde6810309e5
Christian Brabandt <cb@256bit.org>
parents: 9626
diff changeset
4824 else
9723
80ac9cf77c9b commit https://github.com/vim/vim/commit/437bafe4c8a83ed71ee006eda7f54b65a90f0d4c
Christian Brabandt <cb@256bit.org>
parents: 9711
diff changeset
4825 {
9711
b74515b8f3d4 commit https://github.com/vim/vim/commit/57e69ff2cca9edee3546373d04e0dde6810309e5
Christian Brabandt <cb@256bit.org>
parents: 9626
diff changeset
4826 job->jv_exit_cb = vim_strsave(opt->jo_exit_cb);
9723
80ac9cf77c9b commit https://github.com/vim/vim/commit/437bafe4c8a83ed71ee006eda7f54b65a90f0d4c
Christian Brabandt <cb@256bit.org>
parents: 9711
diff changeset
4827 func_ref(job->jv_exit_cb);
80ac9cf77c9b commit https://github.com/vim/vim/commit/437bafe4c8a83ed71ee006eda7f54b65a90f0d4c
Christian Brabandt <cb@256bit.org>
parents: 9711
diff changeset
4828 }
8538
c337c813c64d commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents: 8508
diff changeset
4829 }
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4830 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4831 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4832
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4833 /*
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4834 * Called when Vim is exiting: kill all jobs that have the "stoponexit" flag.
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4835 */
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4836 void
9282
9f97a6290c63 commit https://github.com/vim/vim/commit/cf089463492fab53b2a5d81517829d22f882f82e
Christian Brabandt <cb@256bit.org>
parents: 9246
diff changeset
4837 job_stop_on_exit(void)
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4838 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4839 job_T *job;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4840
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4841 for (job = first_job; job != NULL; job = job->jv_next)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4842 if (job->jv_status == JOB_STARTED && job->jv_stoponexit != NULL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4843 mch_stop_job(job, job->jv_stoponexit);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4844 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4845
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4846 /*
10309
88331ee68367 commit https://github.com/vim/vim/commit/01688ad545ff0809ddad5c8fa6b149dc5d67312b
Christian Brabandt <cb@256bit.org>
parents: 10279
diff changeset
4847 * Return TRUE when there is any job that has an exit callback and might exit,
88331ee68367 commit https://github.com/vim/vim/commit/01688ad545ff0809ddad5c8fa6b149dc5d67312b
Christian Brabandt <cb@256bit.org>
parents: 10279
diff changeset
4848 * which means job_check_ended() should be called more often.
9189
4b55d8e162d4 commit https://github.com/vim/vim/commit/cf7c11a9479ba7ce775b86c7a846fae48321d260
Christian Brabandt <cb@256bit.org>
parents: 9151
diff changeset
4849 */
4b55d8e162d4 commit https://github.com/vim/vim/commit/cf7c11a9479ba7ce775b86c7a846fae48321d260
Christian Brabandt <cb@256bit.org>
parents: 9151
diff changeset
4850 int
9282
9f97a6290c63 commit https://github.com/vim/vim/commit/cf089463492fab53b2a5d81517829d22f882f82e
Christian Brabandt <cb@256bit.org>
parents: 9246
diff changeset
4851 has_pending_job(void)
9189
4b55d8e162d4 commit https://github.com/vim/vim/commit/cf7c11a9479ba7ce775b86c7a846fae48321d260
Christian Brabandt <cb@256bit.org>
parents: 9151
diff changeset
4852 {
4b55d8e162d4 commit https://github.com/vim/vim/commit/cf7c11a9479ba7ce775b86c7a846fae48321d260
Christian Brabandt <cb@256bit.org>
parents: 9151
diff changeset
4853 job_T *job;
4b55d8e162d4 commit https://github.com/vim/vim/commit/cf7c11a9479ba7ce775b86c7a846fae48321d260
Christian Brabandt <cb@256bit.org>
parents: 9151
diff changeset
4854
4b55d8e162d4 commit https://github.com/vim/vim/commit/cf7c11a9479ba7ce775b86c7a846fae48321d260
Christian Brabandt <cb@256bit.org>
parents: 9151
diff changeset
4855 for (job = first_job; job != NULL; job = job->jv_next)
10309
88331ee68367 commit https://github.com/vim/vim/commit/01688ad545ff0809ddad5c8fa6b149dc5d67312b
Christian Brabandt <cb@256bit.org>
parents: 10279
diff changeset
4856 /* Only should check if the channel has been closed, if the channel is
88331ee68367 commit https://github.com/vim/vim/commit/01688ad545ff0809ddad5c8fa6b149dc5d67312b
Christian Brabandt <cb@256bit.org>
parents: 10279
diff changeset
4857 * open the job won't exit. */
88331ee68367 commit https://github.com/vim/vim/commit/01688ad545ff0809ddad5c8fa6b149dc5d67312b
Christian Brabandt <cb@256bit.org>
parents: 10279
diff changeset
4858 if (job->jv_status == JOB_STARTED && job->jv_exit_cb != NULL
10386
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4859 && !job_channel_still_useful(job))
9189
4b55d8e162d4 commit https://github.com/vim/vim/commit/cf7c11a9479ba7ce775b86c7a846fae48321d260
Christian Brabandt <cb@256bit.org>
parents: 9151
diff changeset
4860 return TRUE;
4b55d8e162d4 commit https://github.com/vim/vim/commit/cf7c11a9479ba7ce775b86c7a846fae48321d260
Christian Brabandt <cb@256bit.org>
parents: 9151
diff changeset
4861 return FALSE;
4b55d8e162d4 commit https://github.com/vim/vim/commit/cf7c11a9479ba7ce775b86c7a846fae48321d260
Christian Brabandt <cb@256bit.org>
parents: 9151
diff changeset
4862 }
4b55d8e162d4 commit https://github.com/vim/vim/commit/cf7c11a9479ba7ce775b86c7a846fae48321d260
Christian Brabandt <cb@256bit.org>
parents: 9151
diff changeset
4863
10279
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
4864 #define MAX_CHECK_ENDED 8
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
4865
9189
4b55d8e162d4 commit https://github.com/vim/vim/commit/cf7c11a9479ba7ce775b86c7a846fae48321d260
Christian Brabandt <cb@256bit.org>
parents: 9151
diff changeset
4866 /*
9079
2cd83c854073 commit https://github.com/vim/vim/commit/36e0f7da9bc4a6ee8a7b17df503542a339e034c8
Christian Brabandt <cb@256bit.org>
parents: 9064
diff changeset
4867 * Called once in a while: check if any jobs that seem useful have ended.
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4868 */
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4869 void
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4870 job_check_ended(void)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4871 {
10279
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
4872 int i;
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
4873
10386
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4874 if (first_job == NULL)
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4875 return;
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4876
10279
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
4877 for (i = 0; i < MAX_CHECK_ENDED; ++i)
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4878 {
10386
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4879 /* NOTE: mch_detect_ended_job() must only return a job of which the
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4880 * status was just set to JOB_ENDED. */
10279
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
4881 job_T *job = mch_detect_ended_job(first_job);
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
4882
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
4883 if (job == NULL)
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
4884 break;
10386
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
4885 job_cleanup(job); /* may free "job" */
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4886 }
10279
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
4887
9189
4b55d8e162d4 commit https://github.com/vim/vim/commit/cf7c11a9479ba7ce775b86c7a846fae48321d260
Christian Brabandt <cb@256bit.org>
parents: 9151
diff changeset
4888 if (channel_need_redraw)
4b55d8e162d4 commit https://github.com/vim/vim/commit/cf7c11a9479ba7ce775b86c7a846fae48321d260
Christian Brabandt <cb@256bit.org>
parents: 9151
diff changeset
4889 {
4b55d8e162d4 commit https://github.com/vim/vim/commit/cf7c11a9479ba7ce775b86c7a846fae48321d260
Christian Brabandt <cb@256bit.org>
parents: 9151
diff changeset
4890 channel_need_redraw = FALSE;
4b55d8e162d4 commit https://github.com/vim/vim/commit/cf7c11a9479ba7ce775b86c7a846fae48321d260
Christian Brabandt <cb@256bit.org>
parents: 9151
diff changeset
4891 redraw_after_callback();
4b55d8e162d4 commit https://github.com/vim/vim/commit/cf7c11a9479ba7ce775b86c7a846fae48321d260
Christian Brabandt <cb@256bit.org>
parents: 9151
diff changeset
4892 }
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4893 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4894
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4895 /*
11690
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11672
diff changeset
4896 * Create a job and return it. Implements job_start().
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11672
diff changeset
4897 * The returned job has a refcount of one.
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11672
diff changeset
4898 * Returns NULL when out of memory.
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4899 */
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4900 job_T *
11670
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11666
diff changeset
4901 job_start(typval_T *argvars, jobopt_T *opt_arg)
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4902 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4903 job_T *job;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4904 char_u *cmd = NULL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4905 #if defined(UNIX)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4906 # define USE_ARGV
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4907 char **argv = NULL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4908 int argc = 0;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4909 #else
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4910 garray_T ga;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4911 #endif
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4912 jobopt_T opt;
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
4913 ch_part_T part;
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4914
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4915 job = job_alloc();
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4916 if (job == NULL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4917 return NULL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4918
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4919 job->jv_status = JOB_FAILED;
8859
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
4920 #ifndef USE_ARGV
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
4921 ga_init2(&ga, (int)sizeof(char*), 20);
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
4922 #endif
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4923
11670
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11666
diff changeset
4924 if (opt_arg != NULL)
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11666
diff changeset
4925 opt = *opt_arg;
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11666
diff changeset
4926 else
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11666
diff changeset
4927 {
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11666
diff changeset
4928 /* Default mode is NL. */
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11666
diff changeset
4929 clear_job_options(&opt);
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11666
diff changeset
4930 opt.jo_mode = MODE_NL;
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11666
diff changeset
4931 if (get_job_options(&argvars[1], &opt,
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
4932 JO_MODE_ALL + JO_CB_ALL + JO_TIMEOUT_ALL + JO_STOPONEXIT
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8759
diff changeset
4933 + JO_EXIT_CB + JO_OUT_IO + JO_BLOCK_WRITE) == FAIL)
8859
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
4934 goto theend;
11670
3b2afa2b77b3 patch 8.0.0718: output of job in terminal is not displayed
Christian Brabandt <cb@256bit.org>
parents: 11666
diff changeset
4935 }
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4936
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4937 /* Check that when io is "file" that there is a file name. */
10259
a09db7a4afe0 commit https://github.com/vim/vim/commit/dc0ccaee68ca24d10050117fbec757ad33590a17
Christian Brabandt <cb@256bit.org>
parents: 10253
diff changeset
4938 for (part = PART_OUT; part < PART_COUNT; ++part)
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4939 if ((opt.jo_set & (JO_OUT_IO << (part - PART_OUT)))
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4940 && opt.jo_io[part] == JIO_FILE
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4941 && (!(opt.jo_set & (JO_OUT_NAME << (part - PART_OUT)))
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4942 || *opt.jo_io_name[part] == NUL))
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4943 {
8540
fec8655cf1bf commit https://github.com/vim/vim/commit/d6c2f0526064eef6f8917d2bad00df707d79ea16
Christian Brabandt <cb@256bit.org>
parents: 8538
diff changeset
4944 EMSG(_("E920: _io file requires _name to be set"));
8859
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
4945 goto theend;
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4946 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4947
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4948 if ((opt.jo_set & JO_IN_IO) && opt.jo_io[PART_IN] == JIO_BUFFER)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4949 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4950 buf_T *buf = NULL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4951
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4952 /* check that we can find the buffer before starting the job */
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4953 if (opt.jo_set & JO_IN_BUF)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4954 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4955 buf = buflist_findnr(opt.jo_io_buf[PART_IN]);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4956 if (buf == NULL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4957 EMSGN(_(e_nobufnr), (long)opt.jo_io_buf[PART_IN]);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4958 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4959 else if (!(opt.jo_set & JO_IN_NAME))
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4960 {
8540
fec8655cf1bf commit https://github.com/vim/vim/commit/d6c2f0526064eef6f8917d2bad00df707d79ea16
Christian Brabandt <cb@256bit.org>
parents: 8538
diff changeset
4961 EMSG(_("E915: in_io buffer requires in_buf or in_name to be set"));
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4962 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4963 else
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4964 buf = buflist_find_by_name(opt.jo_io_name[PART_IN], FALSE);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4965 if (buf == NULL)
8859
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
4966 goto theend;
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4967 if (buf->b_ml.ml_mfp == NULL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4968 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4969 char_u numbuf[NUMBUFLEN];
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4970 char_u *s;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4971
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4972 if (opt.jo_set & JO_IN_BUF)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4973 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4974 sprintf((char *)numbuf, "%d", opt.jo_io_buf[PART_IN]);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4975 s = numbuf;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4976 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4977 else
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4978 s = opt.jo_io_name[PART_IN];
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4979 EMSG2(_("E918: buffer must be loaded: %s"), s);
8859
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
4980 goto theend;
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4981 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4982 job->jv_in_buf = buf;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4983 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4984
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4985 job_set_options(job, &opt);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4986
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4987 if (argvars[0].v_type == VAR_STRING)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4988 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4989 /* Command is a string. */
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4990 cmd = argvars[0].vval.v_string;
8753
df91c8263f04 commit https://github.com/vim/vim/commit/8038568722a0aad72d001edf4972c29abab57f8f
Christian Brabandt <cb@256bit.org>
parents: 8746
diff changeset
4991 if (cmd == NULL || *cmd == NUL)
df91c8263f04 commit https://github.com/vim/vim/commit/8038568722a0aad72d001edf4972c29abab57f8f
Christian Brabandt <cb@256bit.org>
parents: 8746
diff changeset
4992 {
df91c8263f04 commit https://github.com/vim/vim/commit/8038568722a0aad72d001edf4972c29abab57f8f
Christian Brabandt <cb@256bit.org>
parents: 8746
diff changeset
4993 EMSG(_(e_invarg));
8859
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
4994 goto theend;
8753
df91c8263f04 commit https://github.com/vim/vim/commit/8038568722a0aad72d001edf4972c29abab57f8f
Christian Brabandt <cb@256bit.org>
parents: 8746
diff changeset
4995 }
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4996 #ifdef USE_ARGV
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4997 if (mch_parse_cmd(cmd, FALSE, &argv, &argc) == FAIL)
8859
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
4998 goto theend;
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
4999 argv[argc] = NULL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5000 #endif
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5001 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5002 else if (argvars[0].v_type != VAR_LIST
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5003 || argvars[0].vval.v_list == NULL
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5004 || argvars[0].vval.v_list->lv_len < 1)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5005 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5006 EMSG(_(e_invarg));
8859
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
5007 goto theend;
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5008 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5009 else
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5010 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5011 list_T *l = argvars[0].vval.v_list;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5012 listitem_T *li;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5013 char_u *s;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5014
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5015 #ifdef USE_ARGV
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5016 /* Pass argv[] to mch_call_shell(). */
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5017 argv = (char **)alloc(sizeof(char *) * (l->lv_len + 1));
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5018 if (argv == NULL)
8859
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
5019 goto theend;
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5020 #endif
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5021 for (li = l->lv_first; li != NULL; li = li->li_next)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5022 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5023 s = get_tv_string_chk(&li->li_tv);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5024 if (s == NULL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5025 goto theend;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5026 #ifdef USE_ARGV
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5027 argv[argc++] = (char *)s;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5028 #else
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5029 /* Only escape when needed, double quotes are not always allowed. */
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5030 if (li != l->lv_first && vim_strpbrk(s, (char_u *)" \t\"") != NULL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5031 {
8508
13e5a1f02be4 commit https://github.com/vim/vim/commit/583c1f14a4e1d89fe029b1c134d405357468ece7
Christian Brabandt <cb@256bit.org>
parents: 8502
diff changeset
5032 # ifdef WIN32
13e5a1f02be4 commit https://github.com/vim/vim/commit/583c1f14a4e1d89fe029b1c134d405357468ece7
Christian Brabandt <cb@256bit.org>
parents: 8502
diff changeset
5033 int old_ssl = p_ssl;
13e5a1f02be4 commit https://github.com/vim/vim/commit/583c1f14a4e1d89fe029b1c134d405357468ece7
Christian Brabandt <cb@256bit.org>
parents: 8502
diff changeset
5034
13e5a1f02be4 commit https://github.com/vim/vim/commit/583c1f14a4e1d89fe029b1c134d405357468ece7
Christian Brabandt <cb@256bit.org>
parents: 8502
diff changeset
5035 /* This is using CreateProcess, not cmd.exe. Always use
13e5a1f02be4 commit https://github.com/vim/vim/commit/583c1f14a4e1d89fe029b1c134d405357468ece7
Christian Brabandt <cb@256bit.org>
parents: 8502
diff changeset
5036 * double quote and backslashes. */
13e5a1f02be4 commit https://github.com/vim/vim/commit/583c1f14a4e1d89fe029b1c134d405357468ece7
Christian Brabandt <cb@256bit.org>
parents: 8502
diff changeset
5037 p_ssl = 0;
13e5a1f02be4 commit https://github.com/vim/vim/commit/583c1f14a4e1d89fe029b1c134d405357468ece7
Christian Brabandt <cb@256bit.org>
parents: 8502
diff changeset
5038 # endif
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5039 s = vim_strsave_shellescape(s, FALSE, TRUE);
8508
13e5a1f02be4 commit https://github.com/vim/vim/commit/583c1f14a4e1d89fe029b1c134d405357468ece7
Christian Brabandt <cb@256bit.org>
parents: 8502
diff changeset
5040 # ifdef WIN32
13e5a1f02be4 commit https://github.com/vim/vim/commit/583c1f14a4e1d89fe029b1c134d405357468ece7
Christian Brabandt <cb@256bit.org>
parents: 8502
diff changeset
5041 p_ssl = old_ssl;
13e5a1f02be4 commit https://github.com/vim/vim/commit/583c1f14a4e1d89fe029b1c134d405357468ece7
Christian Brabandt <cb@256bit.org>
parents: 8502
diff changeset
5042 # endif
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5043 if (s == NULL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5044 goto theend;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5045 ga_concat(&ga, s);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5046 vim_free(s);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5047 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5048 else
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5049 ga_concat(&ga, s);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5050 if (li->li_next != NULL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5051 ga_append(&ga, ' ');
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5052 #endif
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5053 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5054 #ifdef USE_ARGV
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5055 argv[argc] = NULL;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5056 #else
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5057 cmd = ga.ga_data;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5058 #endif
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5059 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5060
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5061 #ifdef USE_ARGV
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5062 if (ch_log_active())
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5063 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5064 garray_T ga;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5065 int i;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5066
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5067 ga_init2(&ga, (int)sizeof(char), 200);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5068 for (i = 0; i < argc; ++i)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5069 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5070 if (i > 0)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5071 ga_concat(&ga, (char_u *)" ");
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5072 ga_concat(&ga, (char_u *)argv[i]);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5073 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5074 ch_logs(NULL, "Starting job: %s", (char *)ga.ga_data);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5075 ga_clear(&ga);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5076 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5077 mch_start_job(argv, job, &opt);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5078 #else
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5079 ch_logs(NULL, "Starting job: %s", (char *)cmd);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5080 mch_start_job((char *)cmd, job, &opt);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5081 #endif
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5082
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5083 /* If the channel is reading from a buffer, write lines now. */
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5084 if (job->jv_channel != NULL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5085 channel_write_in(job->jv_channel);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5086
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5087 theend:
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5088 #ifdef USE_ARGV
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5089 vim_free(argv);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5090 #else
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5091 vim_free(ga.ga_data);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5092 #endif
8859
03250bc0c63a commit https://github.com/vim/vim/commit/0e4c1de5560c7f8b4cae539ec8cff0949daba3fc
Christian Brabandt <cb@256bit.org>
parents: 8798
diff changeset
5093 free_job_options(&opt);
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5094 return job;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5095 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5096
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5097 /*
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5098 * Get the status of "job" and invoke the exit callback when needed.
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5099 * The returned string is not allocated.
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5100 */
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5101 char *
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5102 job_status(job_T *job)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5103 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5104 char *result;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5105
10386
d3f0946b4a80 commit https://github.com/vim/vim/commit/7df915d113ac1981792c50e8b000c9f5f784b78b
Christian Brabandt <cb@256bit.org>
parents: 10375
diff changeset
5106 if (job->jv_status >= JOB_ENDED)
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5107 /* No need to check, dead is dead. */
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5108 result = "dead";
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5109 else if (job->jv_status == JOB_FAILED)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5110 result = "fail";
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5111 else
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5112 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5113 result = mch_job_status(job);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5114 if (job->jv_status == JOB_ENDED)
10279
c5c15c818bda commit https://github.com/vim/vim/commit/97792de2762cc79cc365a8a0b858f27753179577
Christian Brabandt <cb@256bit.org>
parents: 10259
diff changeset
5115 job_cleanup(job);
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5116 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5117 return result;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5118 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5119
8502
ee5cb2e9ed5a commit https://github.com/vim/vim/commit/8950a563b306ce76f259573d91c2ddccdf52e32e
Christian Brabandt <cb@256bit.org>
parents: 8498
diff changeset
5120 /*
ee5cb2e9ed5a commit https://github.com/vim/vim/commit/8950a563b306ce76f259573d91c2ddccdf52e32e
Christian Brabandt <cb@256bit.org>
parents: 8498
diff changeset
5121 * Implementation of job_info().
ee5cb2e9ed5a commit https://github.com/vim/vim/commit/8950a563b306ce76f259573d91c2ddccdf52e32e
Christian Brabandt <cb@256bit.org>
parents: 8498
diff changeset
5122 */
ee5cb2e9ed5a commit https://github.com/vim/vim/commit/8950a563b306ce76f259573d91c2ddccdf52e32e
Christian Brabandt <cb@256bit.org>
parents: 8498
diff changeset
5123 void
ee5cb2e9ed5a commit https://github.com/vim/vim/commit/8950a563b306ce76f259573d91c2ddccdf52e32e
Christian Brabandt <cb@256bit.org>
parents: 8498
diff changeset
5124 job_info(job_T *job, dict_T *dict)
ee5cb2e9ed5a commit https://github.com/vim/vim/commit/8950a563b306ce76f259573d91c2ddccdf52e32e
Christian Brabandt <cb@256bit.org>
parents: 8498
diff changeset
5125 {
ee5cb2e9ed5a commit https://github.com/vim/vim/commit/8950a563b306ce76f259573d91c2ddccdf52e32e
Christian Brabandt <cb@256bit.org>
parents: 8498
diff changeset
5126 dictitem_T *item;
ee5cb2e9ed5a commit https://github.com/vim/vim/commit/8950a563b306ce76f259573d91c2ddccdf52e32e
Christian Brabandt <cb@256bit.org>
parents: 8498
diff changeset
5127 varnumber_T nr;
ee5cb2e9ed5a commit https://github.com/vim/vim/commit/8950a563b306ce76f259573d91c2ddccdf52e32e
Christian Brabandt <cb@256bit.org>
parents: 8498
diff changeset
5128
ee5cb2e9ed5a commit https://github.com/vim/vim/commit/8950a563b306ce76f259573d91c2ddccdf52e32e
Christian Brabandt <cb@256bit.org>
parents: 8498
diff changeset
5129 dict_add_nr_str(dict, "status", 0L, (char_u *)job_status(job));
ee5cb2e9ed5a commit https://github.com/vim/vim/commit/8950a563b306ce76f259573d91c2ddccdf52e32e
Christian Brabandt <cb@256bit.org>
parents: 8498
diff changeset
5130
ee5cb2e9ed5a commit https://github.com/vim/vim/commit/8950a563b306ce76f259573d91c2ddccdf52e32e
Christian Brabandt <cb@256bit.org>
parents: 8498
diff changeset
5131 item = dictitem_alloc((char_u *)"channel");
ee5cb2e9ed5a commit https://github.com/vim/vim/commit/8950a563b306ce76f259573d91c2ddccdf52e32e
Christian Brabandt <cb@256bit.org>
parents: 8498
diff changeset
5132 if (item == NULL)
ee5cb2e9ed5a commit https://github.com/vim/vim/commit/8950a563b306ce76f259573d91c2ddccdf52e32e
Christian Brabandt <cb@256bit.org>
parents: 8498
diff changeset
5133 return;
ee5cb2e9ed5a commit https://github.com/vim/vim/commit/8950a563b306ce76f259573d91c2ddccdf52e32e
Christian Brabandt <cb@256bit.org>
parents: 8498
diff changeset
5134 item->di_tv.v_lock = 0;
ee5cb2e9ed5a commit https://github.com/vim/vim/commit/8950a563b306ce76f259573d91c2ddccdf52e32e
Christian Brabandt <cb@256bit.org>
parents: 8498
diff changeset
5135 item->di_tv.v_type = VAR_CHANNEL;
ee5cb2e9ed5a commit https://github.com/vim/vim/commit/8950a563b306ce76f259573d91c2ddccdf52e32e
Christian Brabandt <cb@256bit.org>
parents: 8498
diff changeset
5136 item->di_tv.vval.v_channel = job->jv_channel;
ee5cb2e9ed5a commit https://github.com/vim/vim/commit/8950a563b306ce76f259573d91c2ddccdf52e32e
Christian Brabandt <cb@256bit.org>
parents: 8498
diff changeset
5137 if (job->jv_channel != NULL)
ee5cb2e9ed5a commit https://github.com/vim/vim/commit/8950a563b306ce76f259573d91c2ddccdf52e32e
Christian Brabandt <cb@256bit.org>
parents: 8498
diff changeset
5138 ++job->jv_channel->ch_refcount;
ee5cb2e9ed5a commit https://github.com/vim/vim/commit/8950a563b306ce76f259573d91c2ddccdf52e32e
Christian Brabandt <cb@256bit.org>
parents: 8498
diff changeset
5139 if (dict_add(dict, item) == FAIL)
ee5cb2e9ed5a commit https://github.com/vim/vim/commit/8950a563b306ce76f259573d91c2ddccdf52e32e
Christian Brabandt <cb@256bit.org>
parents: 8498
diff changeset
5140 dictitem_free(item);
ee5cb2e9ed5a commit https://github.com/vim/vim/commit/8950a563b306ce76f259573d91c2ddccdf52e32e
Christian Brabandt <cb@256bit.org>
parents: 8498
diff changeset
5141
ee5cb2e9ed5a commit https://github.com/vim/vim/commit/8950a563b306ce76f259573d91c2ddccdf52e32e
Christian Brabandt <cb@256bit.org>
parents: 8498
diff changeset
5142 #ifdef UNIX
ee5cb2e9ed5a commit https://github.com/vim/vim/commit/8950a563b306ce76f259573d91c2ddccdf52e32e
Christian Brabandt <cb@256bit.org>
parents: 8498
diff changeset
5143 nr = job->jv_pid;
ee5cb2e9ed5a commit https://github.com/vim/vim/commit/8950a563b306ce76f259573d91c2ddccdf52e32e
Christian Brabandt <cb@256bit.org>
parents: 8498
diff changeset
5144 #else
ee5cb2e9ed5a commit https://github.com/vim/vim/commit/8950a563b306ce76f259573d91c2ddccdf52e32e
Christian Brabandt <cb@256bit.org>
parents: 8498
diff changeset
5145 nr = job->jv_proc_info.dwProcessId;
ee5cb2e9ed5a commit https://github.com/vim/vim/commit/8950a563b306ce76f259573d91c2ddccdf52e32e
Christian Brabandt <cb@256bit.org>
parents: 8498
diff changeset
5146 #endif
ee5cb2e9ed5a commit https://github.com/vim/vim/commit/8950a563b306ce76f259573d91c2ddccdf52e32e
Christian Brabandt <cb@256bit.org>
parents: 8498
diff changeset
5147 dict_add_nr_str(dict, "process", nr, NULL);
ee5cb2e9ed5a commit https://github.com/vim/vim/commit/8950a563b306ce76f259573d91c2ddccdf52e32e
Christian Brabandt <cb@256bit.org>
parents: 8498
diff changeset
5148
ee5cb2e9ed5a commit https://github.com/vim/vim/commit/8950a563b306ce76f259573d91c2ddccdf52e32e
Christian Brabandt <cb@256bit.org>
parents: 8498
diff changeset
5149 dict_add_nr_str(dict, "exitval", job->jv_exitval, NULL);
8540
fec8655cf1bf commit https://github.com/vim/vim/commit/d6c2f0526064eef6f8917d2bad00df707d79ea16
Christian Brabandt <cb@256bit.org>
parents: 8538
diff changeset
5150 dict_add_nr_str(dict, "exit_cb", 0L, job->jv_exit_cb);
8502
ee5cb2e9ed5a commit https://github.com/vim/vim/commit/8950a563b306ce76f259573d91c2ddccdf52e32e
Christian Brabandt <cb@256bit.org>
parents: 8498
diff changeset
5151 dict_add_nr_str(dict, "stoponexit", 0L, job->jv_stoponexit);
ee5cb2e9ed5a commit https://github.com/vim/vim/commit/8950a563b306ce76f259573d91c2ddccdf52e32e
Christian Brabandt <cb@256bit.org>
parents: 8498
diff changeset
5152 }
ee5cb2e9ed5a commit https://github.com/vim/vim/commit/8950a563b306ce76f259573d91c2ddccdf52e32e
Christian Brabandt <cb@256bit.org>
parents: 8498
diff changeset
5153
11690
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11672
diff changeset
5154 /*
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11672
diff changeset
5155 * Send a signal to "job". Implements job_stop().
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11672
diff changeset
5156 * When "type" is not NULL use this for the type.
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11672
diff changeset
5157 * Otherwise use argvars[1] for the type.
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11672
diff changeset
5158 */
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5159 int
11690
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11672
diff changeset
5160 job_stop(job_T *job, typval_T *argvars, char *type)
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5161 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5162 char_u *arg;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5163
11690
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11672
diff changeset
5164 if (type != NULL)
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11672
diff changeset
5165 arg = (char_u *)type;
ce434212d682 patch 8.0.0728: the terminal structure is never freed
Christian Brabandt <cb@256bit.org>
parents: 11672
diff changeset
5166 else if (argvars[1].v_type == VAR_UNKNOWN)
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5167 arg = (char_u *)"";
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5168 else
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5169 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5170 arg = get_tv_string_chk(&argvars[1]);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5171 if (arg == NULL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5172 {
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5173 EMSG(_(e_invarg));
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5174 return 0;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5175 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5176 }
11408
c9924ea60cc7 patch 8.0.0588: job_stop() often assumes the channel will be closed
Christian Brabandt <cb@256bit.org>
parents: 11317
diff changeset
5177 if (job->jv_status == JOB_ENDED)
c9924ea60cc7 patch 8.0.0588: job_stop() often assumes the channel will be closed
Christian Brabandt <cb@256bit.org>
parents: 11317
diff changeset
5178 {
c9924ea60cc7 patch 8.0.0588: job_stop() often assumes the channel will be closed
Christian Brabandt <cb@256bit.org>
parents: 11317
diff changeset
5179 ch_log(job->jv_channel, "Job has already ended, job_stop() skipped");
c9924ea60cc7 patch 8.0.0588: job_stop() often assumes the channel will be closed
Christian Brabandt <cb@256bit.org>
parents: 11317
diff changeset
5180 return 0;
c9924ea60cc7 patch 8.0.0588: job_stop() often assumes the channel will be closed
Christian Brabandt <cb@256bit.org>
parents: 11317
diff changeset
5181 }
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5182 ch_logs(job->jv_channel, "Stopping job with '%s'", (char *)arg);
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5183 if (mch_stop_job(job, arg) == FAIL)
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5184 return 0;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5185
11408
c9924ea60cc7 patch 8.0.0588: job_stop() often assumes the channel will be closed
Christian Brabandt <cb@256bit.org>
parents: 11317
diff changeset
5186 /* Assume that only "kill" will kill the job. */
c9924ea60cc7 patch 8.0.0588: job_stop() often assumes the channel will be closed
Christian Brabandt <cb@256bit.org>
parents: 11317
diff changeset
5187 if (job->jv_channel != NULL && STRCMP(arg, "kill") == 0)
8498
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5188 job->jv_channel->ch_job_killed = TRUE;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5189
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5190 /* We don't try freeing the job, obviously the caller still has a
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5191 * reference to it. */
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5192 return 1;
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5193 }
42277980a76d commit https://github.com/vim/vim/commit/8e2c942ce49f2555d7dc2088cf3aa856820c5e32
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5194
8493
caed4b2d305f commit https://github.com/vim/vim/commit/509ce2a558e7e0c03242e32e844255af52f1c821
Christian Brabandt <cb@256bit.org>
parents: 8491
diff changeset
5195 #endif /* FEAT_JOB_CHANNEL */