Patch 7.4.1524
Problem: Channel test fails on BSD.
Solution: Break out of the loop when connect() succeeds. (Ozaki Kiichi)
Files: src/channel.c
*** ../vim-7.4.1523/src/channel.c 2016-03-08 20:12:40.919638594 +0100
--- src/channel.c 2016-03-08 22:30:05.709000950 +0100
***************
*** 587,593 ****
u_long val = 1;
#else
int port = port_in;
- struct timeval start_tv;
#endif
channel_T *channel;
int ret;
--- 587,592 ----
***************
*** 629,634 ****
--- 628,637 ----
*/
while (TRUE)
{
+ #ifndef WIN32
+ long elapsed_msec = 0;
+ #endif
+
if (sd >= 0)
sock_close(sd);
sd = socket(AF_INET, SOCK_STREAM, 0);
***************
*** 664,691 ****
ch_logsn(channel, "Connecting to %s port %d", hostname, port);
ret = connect(sd, (struct sockaddr *)&server, sizeof(server));
SOCK_ERRNO;
! if (ret < 0)
! {
! if (errno != EWOULDBLOCK
! && errno != ECONNREFUSED
#ifdef EINPROGRESS
! && errno != EINPROGRESS
#endif
! )
! {
! ch_errorn(channel,
! "channel_open: Connect failed with errno %d", errno);
! PERROR(_(e_cannot_connect));
! sock_close(sd);
! channel_free(channel);
! return NULL;
! }
}
! /* If we don't block and connect() failed then try using select() to
! * wait for the connection to be made. */
! if (waittime >= 0 && ret < 0)
{
struct timeval tv;
fd_set rfds;
--- 667,697 ----
ch_logsn(channel, "Connecting to %s port %d", hostname, port);
ret = connect(sd, (struct sockaddr *)&server, sizeof(server));
+ if (ret == 0)
+ /* The connection could be established. */
+ break;
+
SOCK_ERRNO;
! if (waittime < 0 || (errno != EWOULDBLOCK
! && errno != ECONNREFUSED
#ifdef EINPROGRESS
! && errno != EINPROGRESS
#endif
! ))
! {
! ch_errorn(channel,
! "channel_open: Connect failed with errno %d", errno);
! PERROR(_(e_cannot_connect));
! sock_close(sd);
! channel_free(channel);
! return NULL;
}
! /* If connect() didn't finish then try using select() to wait for the
! * connection to be made. */
! #ifndef WIN32
! if (errno != ECONNREFUSED)
! #endif
{
struct timeval tv;
fd_set rfds;
***************
*** 693,698 ****
--- 699,706 ----
#ifndef WIN32
int so_error = 0;
socklen_t so_error_len = sizeof(so_error);
+ struct timeval start_tv;
+ struct timeval end_tv;
#endif
FD_ZERO(&rfds);
***************
*** 723,741 ****
#ifdef WIN32
/* On Win32: select() is expected to work and wait for up to the
* waittime for the socket to be open. */
! if (!FD_ISSET(sd, &wfds) || ret == 0)
#else
/* On Linux-like systems: See socket(7) for the behavior
* After putting the socket in non-blocking mode, connect() will
* return EINPROGRESS, select() will not wait (as if writing is
* possible), need to use getsockopt() to check if the socket is
* actually able to connect.
! * We detect an failure to connect when either read and write fds
* are set. Use getsockopt() to find out what kind of failure. */
if (FD_ISSET(sd, &rfds) || FD_ISSET(sd, &wfds))
{
ret = getsockopt(sd,
! SOL_SOCKET, SO_ERROR, &so_error, &so_error_len);
if (ret < 0 || (so_error != 0
&& so_error != EWOULDBLOCK
&& so_error != ECONNREFUSED
--- 731,750 ----
#ifdef WIN32
/* On Win32: select() is expected to work and wait for up to the
* waittime for the socket to be open. */
! if (FD_ISSET(sd, &wfds))
! break;
#else
/* On Linux-like systems: See socket(7) for the behavior
* After putting the socket in non-blocking mode, connect() will
* return EINPROGRESS, select() will not wait (as if writing is
* possible), need to use getsockopt() to check if the socket is
* actually able to connect.
! * We detect a failure to connect when either read and write fds
* are set. Use getsockopt() to find out what kind of failure. */
if (FD_ISSET(sd, &rfds) || FD_ISSET(sd, &wfds))
{
ret = getsockopt(sd,
! SOL_SOCKET, SO_ERROR, &so_error, &so_error_len);
if (ret < 0 || (so_error != 0
&& so_error != EWOULDBLOCK
&& so_error != ECONNREFUSED
***************
*** 754,802 ****
}
}
! if (!FD_ISSET(sd, &wfds) || so_error != 0)
#endif
! {
! #ifndef WIN32
! struct timeval end_tv;
! long elapsed_msec;
! gettimeofday(&end_tv, NULL);
! elapsed_msec = (end_tv.tv_sec - start_tv.tv_sec) * 1000
! + (end_tv.tv_usec - start_tv.tv_usec) / 1000;
! if (waittime > 1 && elapsed_msec < waittime)
! {
! /* The port isn't ready but we also didn't get an error.
! * This happens when the server didn't open the socket
! * yet. Wait a bit and try again. */
! mch_delay(waittime < 50 ? (long)waittime : 50L, TRUE);
! ui_breakcheck();
! if (!got_int)
! {
! /* reduce the waittime by the elapsed time and the 50
! * msec delay (or a bit more) */
! waittime -= elapsed_msec;
! if (waittime > 50)
! waittime -= 50;
! else
! waittime = 1;
! continue;
! }
! /* we were interrupted, behave as if timed out */
! }
! #endif
! /* We timed out. */
! ch_error(channel, "Connection timed out");
! sock_close(sd);
! channel_free(channel);
! return NULL;
}
!
! ch_log(channel, "Connection made");
! break;
}
}
if (waittime >= 0)
{
#ifdef _WIN32
--- 763,810 ----
}
}
! if (FD_ISSET(sd, &wfds) && so_error == 0)
! /* Did not detect an error, connection is established. */
! break;
!
! gettimeofday(&end_tv, NULL);
! elapsed_msec = (end_tv.tv_sec - start_tv.tv_sec) * 1000
! + (end_tv.tv_usec - start_tv.tv_usec) / 1000;
#endif
! }
! #ifndef WIN32
! if (waittime > 1 && elapsed_msec < waittime)
! {
! /* The port isn't ready but we also didn't get an error.
! * This happens when the server didn't open the socket
! * yet. Wait a bit and try again. */
! mch_delay(waittime < 50 ? (long)waittime : 50L, TRUE);
! ui_breakcheck();
! if (!got_int)
! {
! /* reduce the waittime by the elapsed time and the 50
! * msec delay (or a bit more) */
! waittime -= elapsed_msec;
! if (waittime > 50)
! waittime -= 50;
! else
! waittime = 1;
! continue;
}
! /* we were interrupted, behave as if timed out */
}
+ #endif
+
+ /* We timed out. */
+ ch_error(channel, "Connection timed out");
+ sock_close(sd);
+ channel_free(channel);
+ return NULL;
}
+ ch_log(channel, "Connection made");
+
if (waittime >= 0)
{
#ifdef _WIN32
*** ../vim-7.4.1523/src/version.c 2016-03-08 20:58:25.066925814 +0100
--- src/version.c 2016-03-08 22:31:55.107837134 +0100
***************
*** 745,746 ****
--- 745,748 ----
{ /* Add new patch number below this line */
+ /**/
+ 1524,
/**/
--
Shift happens.
-- Doppler
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.