32
32
# undef EINTR
33
33
# endif
34
34
# define EINTR WSAEINTR
35
- # define sock_write (sd , buf , len ) send(sd, buf, len, 0)
36
- # define sock_read (sd , buf , len ) recv(sd, buf, len, 0)
37
- # define sock_close (sd ) closesocket(sd)
38
- # define sleep (t ) Sleep(t*1000) /* WinAPI Sleep() accepts milliseconds */
35
+ # define sock_write (sd , buf , len ) send((SOCKET)sd, buf, len, 0)
36
+ # define sock_read (sd , buf , len ) recv((SOCKET)sd, buf, len, 0)
37
+ # define sock_close (sd ) closesocket((SOCKET)sd)
39
38
#else
40
39
# include <netdb.h>
41
40
# include <netinet/in.h>
48
47
# define sock_write (sd , buf , len ) write(sd, buf, len)
49
48
# define sock_read (sd , buf , len ) read(sd, buf, len)
50
49
# define sock_close (sd ) close(sd)
50
+ # define fd_read (fd , buf , len , timeout ) read(fd, buf, len)
51
+ # define fd_write (sd , buf , len ) write(sd, buf, len)
52
+ # define fd_close (sd ) close(sd)
51
53
#endif
52
54
53
55
#ifdef FEAT_GUI_W32
54
56
extern HWND s_hwnd ; /* Gvim's Window handle */
55
57
#endif
56
58
59
+ #ifdef WIN32
60
+ static int
61
+ fd_read (sock_T fd , char_u * buf , size_t len , int timeout )
62
+ {
63
+ HANDLE h = (HANDLE )fd ;
64
+ DWORD nread ;
65
+
66
+ if (!ReadFile (h , buf , (DWORD )len , & nread , NULL ))
67
+ return -1 ;
68
+ return (int )nread ;
69
+ }
70
+
71
+ static int
72
+ fd_write (sock_T fd , char_u * buf , size_t len )
73
+ {
74
+ HANDLE h = (HANDLE )fd ;
75
+ DWORD nwrite ;
76
+
77
+ if (!WriteFile (h , buf , (DWORD )len , & nwrite , NULL ))
78
+ return -1 ;
79
+ return (int )nwrite ;
80
+ }
81
+
82
+ static void
83
+ fd_close (sock_T fd )
84
+ {
85
+ HANDLE h = (HANDLE )fd ;
86
+
87
+ CloseHandle (h );
88
+ }
89
+ #endif
57
90
58
91
/* Log file opened with ch_logfile(). */
59
92
static FILE * log_fd = NULL ;
@@ -228,7 +261,7 @@ add_channel(void)
228
261
which = CHAN_SOCK ;
229
262
#endif
230
263
{
231
- channel -> ch_pfd [which ].ch_fd = ( sock_T ) - 1 ;
264
+ channel -> ch_pfd [which ].ch_fd = CHAN_FD_INVALID ;
232
265
#ifdef FEAT_GUI_X11
233
266
channel -> ch_pfd [which ].ch_inputHandler = (XtInputId )NULL ;
234
267
#endif
@@ -363,12 +396,12 @@ channel_gui_register(channel_T *channel)
363
396
if (!CH_HAS_GUI )
364
397
return ;
365
398
366
- if (channel -> CH_SOCK >= 0 )
399
+ if (channel -> CH_SOCK != CHAN_FD_INVALID )
367
400
channel_gui_register_one (channel , CHAN_SOCK );
368
401
# ifdef CHANNEL_PIPES
369
- if (channel -> CH_OUT >= 0 )
402
+ if (channel -> CH_OUT != CHAN_FD_INVALID )
370
403
channel_gui_register_one (channel , CHAN_OUT );
371
- if (channel -> CH_ERR >= 0 )
404
+ if (channel -> CH_ERR != CHAN_FD_INVALID )
372
405
channel_gui_register_one (channel , CHAN_ERR );
373
406
# endif
374
407
}
@@ -457,7 +490,7 @@ channel_open(char *hostname, int port_in, int waittime, void (*close_cb)(void))
457
490
return NULL ;
458
491
}
459
492
460
- if ((sd = ( sock_T ) socket (AF_INET , SOCK_STREAM , 0 )) == ( sock_T ) - 1 )
493
+ if ((sd = socket (AF_INET , SOCK_STREAM , 0 )) == -1 )
461
494
{
462
495
ch_error (NULL , "in socket() in channel_open().\n" );
463
496
PERROR ("E898: socket() in channel_open()" );
@@ -564,7 +597,7 @@ channel_open(char *hostname, int port_in, int waittime, void (*close_cb)(void))
564
597
if (errno == ECONNREFUSED && close_cb != NULL )
565
598
{
566
599
sock_close (sd );
567
- if ((sd = ( sock_T ) socket (AF_INET , SOCK_STREAM , 0 )) == ( sock_T ) - 1 )
600
+ if ((sd = socket (AF_INET , SOCK_STREAM , 0 )) == -1 )
568
601
{
569
602
SOCK_ERRNO ;
570
603
ch_log (NULL , "socket() retry in channel_open()\n" );
@@ -609,7 +642,7 @@ channel_open(char *hostname, int port_in, int waittime, void (*close_cb)(void))
609
642
}
610
643
}
611
644
612
- channel -> CH_SOCK = sd ;
645
+ channel -> CH_SOCK = ( sock_T ) sd ;
613
646
channel -> ch_close_cb = close_cb ;
614
647
615
648
#ifdef FEAT_GUI
@@ -621,7 +654,7 @@ channel_open(char *hostname, int port_in, int waittime, void (*close_cb)(void))
621
654
622
655
#if defined(CHANNEL_PIPES ) || defined(PROTO )
623
656
void
624
- channel_set_pipes (channel_T * channel , int in , int out , int err )
657
+ channel_set_pipes (channel_T * channel , sock_T in , sock_T out , sock_T err )
625
658
{
626
659
channel -> CH_IN = in ;
627
660
channel -> CH_OUT = out ;
@@ -1144,9 +1177,9 @@ may_invoke_callback(channel_T *channel)
1144
1177
int
1145
1178
channel_can_write_to (channel_T * channel )
1146
1179
{
1147
- return channel != NULL && (channel -> CH_SOCK >= 0
1180
+ return channel != NULL && (channel -> CH_SOCK != CHAN_FD_INVALID
1148
1181
#ifdef CHANNEL_PIPES
1149
- || channel -> CH_IN >= 0
1182
+ || channel -> CH_IN != CHAN_FD_INVALID
1150
1183
#endif
1151
1184
);
1152
1185
}
@@ -1158,11 +1191,11 @@ channel_can_write_to(channel_T *channel)
1158
1191
int
1159
1192
channel_is_open (channel_T * channel )
1160
1193
{
1161
- return channel != NULL && (channel -> CH_SOCK >= 0
1194
+ return channel != NULL && (channel -> CH_SOCK != CHAN_FD_INVALID
1162
1195
#ifdef CHANNEL_PIPES
1163
- || channel -> CH_IN >= 0
1164
- || channel -> CH_OUT >= 0
1165
- || channel -> CH_ERR >= 0
1196
+ || channel -> CH_IN != CHAN_FD_INVALID
1197
+ || channel -> CH_OUT != CHAN_FD_INVALID
1198
+ || channel -> CH_ERR != CHAN_FD_INVALID
1166
1199
#endif
1167
1200
);
1168
1201
}
@@ -1193,26 +1226,26 @@ channel_close(channel_T *channel)
1193
1226
channel_gui_unregister (channel );
1194
1227
#endif
1195
1228
1196
- if (channel -> CH_SOCK >= 0 )
1229
+ if (channel -> CH_SOCK != CHAN_FD_INVALID )
1197
1230
{
1198
1231
sock_close (channel -> CH_SOCK );
1199
- channel -> CH_SOCK = -1 ;
1232
+ channel -> CH_SOCK = CHAN_FD_INVALID ;
1200
1233
}
1201
1234
#if defined(CHANNEL_PIPES )
1202
- if (channel -> CH_IN >= 0 )
1235
+ if (channel -> CH_IN != CHAN_FD_INVALID )
1203
1236
{
1204
- close (channel -> CH_IN );
1205
- channel -> CH_IN = -1 ;
1237
+ fd_close (channel -> CH_IN );
1238
+ channel -> CH_IN = CHAN_FD_INVALID ;
1206
1239
}
1207
- if (channel -> CH_OUT >= 0 )
1240
+ if (channel -> CH_OUT != CHAN_FD_INVALID )
1208
1241
{
1209
- close (channel -> CH_OUT );
1210
- channel -> CH_OUT = -1 ;
1242
+ fd_close (channel -> CH_OUT );
1243
+ channel -> CH_OUT = CHAN_FD_INVALID ;
1211
1244
}
1212
- if (channel -> CH_ERR >= 0 )
1245
+ if (channel -> CH_ERR != CHAN_FD_INVALID )
1213
1246
{
1214
- close (channel -> CH_ERR );
1215
- channel -> CH_ERR = -1 ;
1247
+ fd_close (channel -> CH_ERR );
1248
+ channel -> CH_ERR = CHAN_FD_INVALID ;
1216
1249
}
1217
1250
#endif
1218
1251
@@ -1325,7 +1358,7 @@ channel_free_all(void)
1325
1358
* Always returns OK for FEAT_GUI_W32.
1326
1359
*/
1327
1360
static int
1328
- channel_wait (channel_T * channel , int fd , int timeout )
1361
+ channel_wait (channel_T * channel , sock_T fd , int timeout )
1329
1362
{
1330
1363
#if defined(HAVE_SELECT ) && !defined(FEAT_GUI_W32 )
1331
1364
struct timeval tval ;
@@ -1334,13 +1367,38 @@ channel_wait(channel_T *channel, int fd, int timeout)
1334
1367
1335
1368
if (timeout > 0 )
1336
1369
ch_logn (channel , "Waiting for %d msec\n" , timeout );
1370
+
1371
+
1372
+ # ifdef WIN32
1373
+ if (channel -> CH_SOCK == CHAN_FD_INVALID )
1374
+ {
1375
+ DWORD nread ;
1376
+ int diff ;
1377
+ DWORD deadline = GetTickCount () + timeout ;
1378
+
1379
+ /* reading from a pipe, not a socket */
1380
+ while (TRUE)
1381
+ {
1382
+ if (PeekNamedPipe (fd , NULL , 0 , NULL , & nread , NULL ) && nread > 0 )
1383
+ return OK ;
1384
+ diff = deadline - GetTickCount ();
1385
+ if (diff < 0 )
1386
+ break ;
1387
+ /* Wait for 5 msec.
1388
+ * TODO: increase the sleep time when looping more often */
1389
+ Sleep (5 );
1390
+ }
1391
+ return FAIL ;
1392
+ }
1393
+ #endif
1394
+
1337
1395
FD_ZERO (& rfds );
1338
- FD_SET (fd , & rfds );
1396
+ FD_SET (( int ) fd , & rfds );
1339
1397
tval .tv_sec = timeout / 1000 ;
1340
1398
tval .tv_usec = (timeout % 1000 ) * 1000 ;
1341
1399
for (;;)
1342
1400
{
1343
- ret = select (fd + 1 , & rfds , NULL , NULL , & tval );
1401
+ ret = select (( int ) fd + 1 , & rfds , NULL , NULL , & tval );
1344
1402
# ifdef EINTR
1345
1403
if (ret == -1 && errno == EINTR )
1346
1404
continue ;
@@ -1385,17 +1443,17 @@ channel_get_id(void)
1385
1443
* Get the file descriptor to read from, either the socket or stdout.
1386
1444
* TODO: should have a way to read stderr.
1387
1445
*/
1388
- static int
1446
+ static sock_T
1389
1447
get_read_fd (channel_T * channel )
1390
1448
{
1391
- if (channel -> CH_SOCK >= 0 )
1449
+ if (channel -> CH_SOCK != CHAN_FD_INVALID )
1392
1450
return channel -> CH_SOCK ;
1393
1451
#if defined(CHANNEL_PIPES )
1394
- if (channel -> CH_OUT >= 0 )
1452
+ if (channel -> CH_OUT != CHAN_FD_INVALID )
1395
1453
return channel -> CH_OUT ;
1396
1454
#endif
1397
1455
ch_error (channel , "channel_read() called while socket is closed\n" );
1398
- return -1 ;
1456
+ return CHAN_FD_INVALID ;
1399
1457
}
1400
1458
1401
1459
/*
@@ -1410,14 +1468,14 @@ channel_read(channel_T *channel, int which, char *func)
1410
1468
static char_u * buf = NULL ;
1411
1469
int len = 0 ;
1412
1470
int readlen = 0 ;
1413
- int fd ;
1471
+ sock_T fd ;
1414
1472
int use_socket = FALSE;
1415
1473
1416
1474
if (which < 0 )
1417
1475
fd = get_read_fd (channel );
1418
1476
else
1419
1477
fd = channel -> ch_pfd [which ].ch_fd ;
1420
- if (fd < 0 )
1478
+ if (fd == CHAN_FD_INVALID )
1421
1479
return ;
1422
1480
use_socket = fd == channel -> CH_SOCK ;
1423
1481
@@ -1439,7 +1497,7 @@ channel_read(channel_T *channel, int which, char *func)
1439
1497
if (use_socket )
1440
1498
len = sock_read (fd , buf , MAXMSGSIZE );
1441
1499
else
1442
- len = read (fd , buf , MAXMSGSIZE );
1500
+ len = fd_read (fd , buf , MAXMSGSIZE , channel -> ch_timeout );
1443
1501
if (len <= 0 )
1444
1502
break ; /* error or nothing more to read */
1445
1503
@@ -1509,12 +1567,13 @@ channel_read_block(channel_T *channel)
1509
1567
ch_log (channel , "Reading raw\n" );
1510
1568
if (channel_peek (channel ) == NULL )
1511
1569
{
1512
- int fd = get_read_fd (channel );
1570
+ sock_T fd = get_read_fd (channel );
1513
1571
1514
1572
/* TODO: read both out and err if they are different */
1515
1573
ch_log (channel , "No readahead\n" );
1516
1574
/* Wait for up to the channel timeout. */
1517
- if (fd < 0 || channel_wait (channel , fd , channel -> ch_timeout ) == FAIL )
1575
+ if (fd == CHAN_FD_INVALID
1576
+ || channel_wait (channel , fd , channel -> ch_timeout ) == FAIL )
1518
1577
return NULL ;
1519
1578
channel_read (channel , -1 , "channel_read_block" );
1520
1579
}
@@ -1533,7 +1592,7 @@ channel_read_block(channel_T *channel)
1533
1592
channel_read_json_block (channel_T * channel , int id , typval_T * * rettv )
1534
1593
{
1535
1594
int more ;
1536
- int fd ;
1595
+ sock_T fd ;
1537
1596
1538
1597
ch_log (channel , "Reading JSON\n" );
1539
1598
channel -> ch_block_id = id ;
@@ -1557,8 +1616,8 @@ channel_read_json_block(channel_T *channel, int id, typval_T **rettv)
1557
1616
1558
1617
/* Wait for up to the channel timeout. */
1559
1618
fd = get_read_fd (channel );
1560
- if (fd < 0 || channel_wait ( channel , fd , channel -> ch_timeout )
1561
- == FAIL )
1619
+ if (fd == CHAN_FD_INVALID
1620
+ || channel_wait ( channel , fd , channel -> ch_timeout ) == FAIL )
1562
1621
break ;
1563
1622
channel_read (channel , -1 , "channel_read_json_block" );
1564
1623
}
@@ -1578,7 +1637,7 @@ channel_fd2channel(sock_T fd, int *whichp)
1578
1637
channel_T * channel ;
1579
1638
int i ;
1580
1639
1581
- if (fd >= 0 )
1640
+ if (fd != CHAN_FD_INVALID )
1582
1641
for (channel = first_channel ; channel != NULL ;
1583
1642
channel = channel -> ch_next )
1584
1643
{
@@ -1607,19 +1666,19 @@ channel_send(channel_T *channel, char_u *buf, char *fun)
1607
1666
{
1608
1667
int len = (int )STRLEN (buf );
1609
1668
int res ;
1610
- int fd = -1 ;
1669
+ sock_T fd = CHAN_FD_INVALID ;
1611
1670
int use_socket = FALSE;
1612
1671
1613
- if (channel -> CH_SOCK >= 0 )
1672
+ if (channel -> CH_SOCK != CHAN_FD_INVALID )
1614
1673
{
1615
1674
fd = channel -> CH_SOCK ;
1616
1675
use_socket = TRUE;
1617
1676
}
1618
1677
#if defined(CHANNEL_PIPES )
1619
- else if (channel -> CH_IN >= 0 )
1678
+ else if (channel -> CH_IN != CHAN_FD_INVALID )
1620
1679
fd = channel -> CH_IN ;
1621
1680
#endif
1622
- if (fd < 0 )
1681
+ if (fd == CHAN_FD_INVALID )
1623
1682
{
1624
1683
if (!channel -> ch_error && fun != NULL )
1625
1684
{
@@ -1642,7 +1701,7 @@ channel_send(channel_T *channel, char_u *buf, char *fun)
1642
1701
if (use_socket )
1643
1702
res = sock_write (fd , buf , len );
1644
1703
else
1645
- res = write (fd , buf , len );
1704
+ res = fd_write (fd , buf , len );
1646
1705
if (res != len )
1647
1706
{
1648
1707
if (!channel -> ch_error && fun != NULL )
@@ -1680,7 +1739,7 @@ channel_poll_setup(int nfd_in, void *fds_in)
1680
1739
which = CHAN_SOCK ;
1681
1740
# endif
1682
1741
{
1683
- if (channel -> ch_pfd [which ].ch_fd >= 0 )
1742
+ if (channel -> ch_pfd [which ].ch_fd != CHAN_FD_INVALID )
1684
1743
{
1685
1744
channel -> ch_pfd [which ].ch_poll_idx = nfd ;
1686
1745
fds [nfd ].fd = channel -> ch_pfd [which ].ch_fd ;
@@ -1750,11 +1809,11 @@ channel_select_setup(int maxfd_in, void *rfds_in)
1750
1809
{
1751
1810
sock_T fd = channel -> ch_pfd [which ].ch_fd ;
1752
1811
1753
- if (fd >= 0 )
1812
+ if (fd != CHAN_FD_INVALID )
1754
1813
{
1755
- FD_SET (fd , rfds );
1756
- if (maxfd < fd )
1757
- maxfd = fd ;
1814
+ FD_SET (( int ) fd , rfds );
1815
+ if (maxfd < ( int ) fd )
1816
+ maxfd = ( int ) fd ;
1758
1817
}
1759
1818
}
1760
1819
}
@@ -1783,7 +1842,7 @@ channel_select_check(int ret_in, void *rfds_in)
1783
1842
{
1784
1843
sock_T fd = channel -> ch_pfd [which ].ch_fd ;
1785
1844
1786
- if (ret > 0 && fd >= 0 && FD_ISSET (fd , rfds ))
1845
+ if (ret > 0 && fd != CHAN_FD_INVALID && FD_ISSET (fd , rfds ))
1787
1846
{
1788
1847
channel_read (channel , which , "channel_select_check" );
1789
1848
-- ret ;
0 commit comments