diff --git a/ChangeLog.txt b/ChangeLog.txt index 4cd3db094c..aa441e6f33 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -7,6 +7,14 @@ Entries may not always be in chronological/commit order. See license at the end of file. */ +2023-01-17 13:10 UTC-0300 Lailton Fernando Mariano (lailton/at/paysoft.com.br) + * include/hbsocket.h + * src/harbour.def + * src/rtl/hbsocket.c + * src/rtl/hbsockhb.c + + added functions: Harbour socket API + HB_SOCKETSETNOSIGPIPE( hSocket, lValue ) --> lSuccess + 2023-01-17 13:00 UTC-0300 Lailton Fernando Mariano (lailton/at/paysoft.com.br) * contrib/hbcurl/hbcurl.hbm * contrib/hbssl/hbssl.hbm diff --git a/include/hbsocket.h b/include/hbsocket.h index a0e4d01165..c14b27069a 100644 --- a/include/hbsocket.h +++ b/include/hbsocket.h @@ -99,6 +99,7 @@ extern HB_EXPORT long hb_socketRecv( HB_SOCKET sd, void * data, long len extern HB_EXPORT long hb_socketRecvFrom( HB_SOCKET sd, void * data, long len, int flags, void ** pSockAddr, unsigned * puiSockLen, HB_MAXINT timeout ); extern HB_EXPORT int hb_socketSetBlockingIO( HB_SOCKET sd, HB_BOOL fBlocking ); extern HB_EXPORT int hb_socketSetNoDelay( HB_SOCKET sd, HB_BOOL fNoDelay ); +extern HB_EXPORT int hb_socketSetNoSigPipe( HB_SOCKET sd, HB_BOOL fNoSigPipe ); extern HB_EXPORT int hb_socketSetExclusiveAddr( HB_SOCKET sd, HB_BOOL fExclusive ); extern HB_EXPORT int hb_socketSetReuseAddr( HB_SOCKET sd, HB_BOOL fReuse ); extern HB_EXPORT int hb_socketSetKeepAlive( HB_SOCKET sd, HB_BOOL fKeepAlive ); diff --git a/src/harbour.def b/src/harbour.def index 967c081fea..a94126ee84 100644 --- a/src/harbour.def +++ b/src/harbour.def @@ -1041,6 +1041,7 @@ HB_FUN_HB_SOCKETSETFILTER HB_FUN_HB_SOCKETSETKEEPALIVE HB_FUN_HB_SOCKETSETMULTICAST HB_FUN_HB_SOCKETSETNODELAY +HB_FUN_HB_SOCKETSETNOSIGPIPE HB_FUN_HB_SOCKETSETRCVBUFSIZE HB_FUN_HB_SOCKETSETREUSEADDR HB_FUN_HB_SOCKETSETSNDBUFSIZE @@ -3305,6 +3306,7 @@ hb_socketSetExclusiveAddr hb_socketSetKeepAlive hb_socketSetMulticast hb_socketSetNoDelay +hb_socketSetNoSigPipe hb_socketSetRcvBufSize hb_socketSetReuseAddr hb_socketSetSndBufSize diff --git a/src/rtl/hbsocket.c b/src/rtl/hbsocket.c index 1605141841..5925d8155f 100644 --- a/src/rtl/hbsocket.c +++ b/src/rtl/hbsocket.c @@ -650,6 +650,14 @@ int hb_socketSetNoDelay( HB_SOCKET sd, HB_BOOL fNoDelay ) return -1; } +int hb_socketSetNoSigPipe( HB_SOCKET sd, HB_BOOL fNoSigPipe ) +{ + HB_SYMBOL_UNUSED( sd ); + HB_SYMBOL_UNUSED( fNoSigPipe ); + hb_socketSetError( HB_SOCKET_ERR_INVALIDHANDLE ); + return -1; +} + int hb_socketSetExclusiveAddr( HB_SOCKET sd, HB_BOOL fExclusive ) { HB_SYMBOL_UNUSED( sd ); @@ -2848,6 +2856,21 @@ int hb_socketSetNoDelay( HB_SOCKET sd, HB_BOOL fNoDelay ) return ret; } +int hb_socketSetNoSigPipe( HB_SOCKET sd, HB_BOOL fNoSigPipe ) +{ +#if defined( SO_NOSIGPIPE ) + int val = fNoSigPipe ? 1 : 0, ret; + ret = setsockopt( sd, SOL_SOCKET, SO_NOSIGPIPE, ( const char * ) &val, sizeof( val ) ); + hb_socketSetOsError( ret != -1 ? 0 : HB_SOCK_GETERROR() ); + return ret; +#else + HB_SYMBOL_UNUSED( sd ); + HB_SYMBOL_UNUSED( fNoSigPipe ); + hb_socketSetError( HB_SOCKET_ERR_NOSUPPORT ); + return -1; +#endif +} + /* NOTE: For notes on Windows, see: https://msdn.microsoft.com/library/ms740621 [vszakats] */ diff --git a/src/rtl/hbsockhb.c b/src/rtl/hbsockhb.c index 19bd881d02..6bf8f0e6f9 100644 --- a/src/rtl/hbsockhb.c +++ b/src/rtl/hbsockhb.c @@ -63,6 +63,7 @@ * hb_socketRecvFrom( hSocket, @cBuffer, [ nLen = Len( cBuffer ) ], [ nFlags = 0 ], @aAddr, [ nTimeout = FOREVER ] ) --> nBytesRecv * hb_socketSetBlockingIO( hSocket, lValue ) --> nSuccess * hb_socketSetNoDelay( hSocket, lValue ) --> lSuccess + * hb_socketSetNoSigPipe( hSocket, lValue ) --> lSuccess * hb_socketSetExclusiveAddr( hSocket, lValue ) --> lSuccess * hb_socketSetReuseAddr( hSocket, lValue ) --> lSuccess * hb_socketSetKeepAlive( hSocket, lValue ) --> lSuccess @@ -1193,6 +1194,14 @@ HB_FUNC( HB_SOCKETSETNODELAY ) hb_retl( hb_socketSetNoDelay( socket, hb_parl( 2 ) ) == 0 ); } +HB_FUNC( HB_SOCKETSETNOSIGPIPE ) +{ + HB_SOCKET socket = hb_socketParam( 1 ); + + if( socket != HB_NO_SOCKET ) + hb_retl( hb_socketSetNoSigPipe( socket, hb_parl( 2 ) ) == 0 ); +} + HB_FUNC( HB_SOCKETSETEXCLUSIVEADDR ) { HB_SOCKET socket = hb_socketParam( 1 );