From ad8961511ad34e6159db092bde052a4fab4375c7 Mon Sep 17 00:00:00 2001 From: Takeshi Abe Date: Wed, 28 Mar 2018 23:50:08 +0900 Subject: osl: Remember the last error before returning osl_Socket_Error This prevents from e.g. com.sun.star.bridge.UnoUrlResolver's emitting confusing messages, when trying to connect to a port on which no LibreOffice process is listening, like: > Traceback (most recent call last): > File "", line 1, in > __main__.NoConnectException: Connector : couldn't connect to socket (Success) ^^^^^^^ After applying this patch: > Traceback (most recent call last): > File "", line 1, in > __main__.NoConnectException: Connector : couldn't connect to socket (Connection refused) You can see the above behavior with the following python code: import uno x = uno.getComponentContext() y = x.ServiceManager z = y.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", x) url = "uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext" a = z.resolve(url) ... provided that no process is waiting on port 2002. Change-Id: Id094cf9271fe77d84f2284d91a0e452448de2bc2 Reviewed-on: https://gerrit.libreoffice.org/52018 Tested-by: Jenkins Reviewed-by: Noel Grandin --- sal/osl/unx/socket.cxx | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) (limited to 'sal') diff --git a/sal/osl/unx/socket.cxx b/sal/osl/unx/socket.cxx index 347c3e915686..dcd7b5509aba 100644 --- a/sal/osl/unx/socket.cxx +++ b/sal/osl/unx/socket.cxx @@ -1401,7 +1401,6 @@ oslSocketResult SAL_CALL osl_connectSocketTo(oslSocket pSocket, fd_set ExcptSet; int ReadyHandles; struct timeval tv; - oslSocketResult Result= osl_Socket_Ok; SAL_WARN_IF( !pSocket, "sal.osl", "undefined socket" ); @@ -1490,13 +1489,19 @@ oslSocketResult SAL_CALL osl_connectSocketTo(oslSocket pSocket, nSockOpt = getsockopt ( pSocket->m_Socket, SOL_SOCKET, SO_ERROR, &nErrorCode, &nErrorSize ); if ( (nSockOpt == 0) && (nErrorCode == 0)) - Result = osl_Socket_Ok; + { + osl_enableNonBlockingMode(pSocket, false); + return osl_Socket_Ok; + } else - Result = osl_Socket_Error; + { + pSocket->m_nLastError = (nSockOpt == 0) ? nErrorCode : errno; + return osl_Socket_Error; + } } else { - Result= osl_Socket_Error; + return osl_Socket_Error; } } else if (ReadyHandles < 0) /* error */ @@ -1508,17 +1513,13 @@ oslSocketResult SAL_CALL osl_connectSocketTo(oslSocket pSocket, return osl_Socket_Interrupted; } pSocket->m_nLastError=errno; - Result= osl_Socket_Error; + return osl_Socket_Error; } else /* timeout */ { pSocket->m_nLastError=errno; - Result= osl_Socket_TimedOut; + return osl_Socket_TimedOut; } - - osl_enableNonBlockingMode(pSocket, false); - - return Result; } oslSocket SAL_CALL osl_acceptConnectionOnSocket(oslSocket pSocket, -- cgit