From ef2e944ed33347fd4c7f82c31e63f3747b62e29e Mon Sep 17 00:00:00 2001
From: Frediano Ziglio <freddy77@gmail.com>
Date: Wed, 11 Dec 2024 06:11:17 +0000
Subject: [PATCH] tds: Use inline for tds_socket_init and tds_socket_done

For historical reasons a lot of macros were used instead of
inline functions.
We already use in other places inline functions so it's no
more a portable issue.
The implementation of these function is small and we don't
need additional headers.
This allows reuse in code not linking all libtds library (like
ODBC tests).

Signed-off-by: Frediano Ziglio <freddy77@gmail.com>
---
 include/freetds/sysdep_private.h | 36 ++++++++++++++++++++++----------
 src/apps/tsql.c                  |  4 ++--
 src/odbc/unittests/freeclose.c   |  5 +----
 src/odbc/unittests/timeout3.c    |  5 +----
 src/odbc/winsetup.c              |  6 +++---
 src/tds/mem.c                    |  3 +--
 src/tds/net.c                    | 16 --------------
 win32/initnet.c                  |  2 +-
 8 files changed, 34 insertions(+), 43 deletions(-)

diff --git a/include/freetds/sysdep_private.h b/include/freetds/sysdep_private.h
index f5edeee5a4..be6bfb49f6 100644
--- a/include/freetds/sysdep_private.h
+++ b/include/freetds/sysdep_private.h
@@ -60,10 +60,19 @@ typedef int pid_t;
 #define CLOSESOCKET(a)		closesocket((a))
 #define IOCTLSOCKET(a,b,c)	ioctlsocket((a), (b), (c))
 #define SOCKLEN_T int
-TDS_EXTERN_C int  tds_socket_init(void);
-#define INITSOCKET()	tds_socket_init()
-TDS_EXTERN_C void tds_socket_done(void);
-#define DONESOCKET()	tds_socket_done()
+static inline int
+tds_socket_init(void)
+{
+	WSADATA wsadata;
+
+	return WSAStartup(MAKEWORD(2, 2), &wsadata);
+}
+
+static inline void
+tds_socket_done(void)
+{
+	WSACleanup();
+}
 #define NETDB_REENTRANT 1	/* BSD-style netdb interface is reentrant */
 
 #define TDSSOCK_EINTR WSAEINTR
@@ -153,13 +162,18 @@ typedef DWORD pid_t;
 #define TDSSOCK_ECONNRESET ECONNRESET
 #endif
 
-#ifndef INITSOCKET
-#define INITSOCKET()	0
-#endif /* !INITSOCKET */
-
-#ifndef DONESOCKET
-#define DONESOCKET()	do { } while(0)
-#endif /* !DONESOCKET */
+#ifndef _WIN32
+static inline int
+tds_socket_init(void)
+{
+	return 0;
+}
+
+static inline void
+tds_socket_done(void)
+{
+}
+#endif
 
 #ifndef READSOCKET
 # ifdef MSG_NOSIGNAL
diff --git a/src/apps/tsql.c b/src/apps/tsql.c
index 1cc0b40dfb..c0a0927e5c 100644
--- a/src/apps/tsql.c
+++ b/src/apps/tsql.c
@@ -763,7 +763,7 @@ main(int argc, char **argv)
 
 	istty = isatty(0);
 
-	if (INITSOCKET()) {
+	if (tds_socket_init()) {
 		fprintf(stderr, "Unable to initialize sockets\n");
 		return 1;
 	}
@@ -957,7 +957,7 @@ main(int argc, char **argv)
 	tds_free_socket(tds);
 	tds_free_login(login);
 	tds_free_context(context);
-	DONESOCKET();
+	tds_socket_done();
 
 	return 0;
 }
diff --git a/src/odbc/unittests/freeclose.c b/src/odbc/unittests/freeclose.c
index 757bf0b2b6..f66c02ceac 100644
--- a/src/odbc/unittests/freeclose.c
+++ b/src/odbc/unittests/freeclose.c
@@ -284,10 +284,7 @@ main(void)
 	const int num_inserts = 20;
 	int is_freetds;
 
-#ifdef _WIN32
-	WSADATA wsaData;
-	WSAStartup(MAKEWORD(2, 2), &wsaData);
-#endif
+	tds_socket_init();
 
 	if (tds_mutex_init(&mtx))
 		return 1;
diff --git a/src/odbc/unittests/timeout3.c b/src/odbc/unittests/timeout3.c
index 5e912edea1..1c403b9c41 100644
--- a/src/odbc/unittests/timeout3.c
+++ b/src/odbc/unittests/timeout3.c
@@ -135,10 +135,7 @@ main(void)
 	int port;
 	time_t start_time, end_time;
 
-#ifdef _WIN32
-	WSADATA wsaData;
-	WSAStartup(MAKEWORD(2, 2), &wsaData);
-#endif
+	tds_socket_init();
 
 	if (tds_mutex_init(&mtx))
 		return 1;
diff --git a/src/odbc/winsetup.c b/src/odbc/winsetup.c
index b451529c9e..ce67b497dd 100644
--- a/src/odbc/winsetup.c
+++ b/src/odbc/winsetup.c
@@ -306,7 +306,7 @@ ConfigDSN(HWND hwndParent, WORD fRequest, LPCSTR lpszDriver, LPCSTR lpszAttribut
 	 * ConfigDSN() only looks up addresses and names, and never actually
 	 * uses any sockets.
 	 */
-	INITSOCKET();
+	tds_socket_init();
 
 	/* Create a blank login struct */
 	di = alloc_dsninfo();
@@ -378,12 +378,12 @@ ConfigDSN(HWND hwndParent, WORD fRequest, LPCSTR lpszDriver, LPCSTR lpszAttribut
 
 	/* Clean up and return TRUE, indicating that the change took place */
 	free_dsninfo(di);
-	DONESOCKET();
+	tds_socket_done();
 	return TRUE;
 
       Fail:
 	free_dsninfo(di);
-	DONESOCKET();
+	tds_socket_done();
 	return FALSE;
 }
 
diff --git a/src/tds/mem.c b/src/tds/mem.c
index f5ae1b8488..33f7c4c376 100644
--- a/src/tds/mem.c
+++ b/src/tds/mem.c
@@ -687,7 +687,6 @@ winsock_initialized(void)
 	static bool initialized = false;
 	static tds_mutex mtx = TDS_MUTEX_INITIALIZER;
 
-	WSADATA wsa_data;
 	int erc;
 
 	if (initialized)
@@ -701,7 +700,7 @@ winsock_initialized(void)
 	}
 
 	/* initialize the socket layer */
-	erc = WSAStartup(MAKEWORD(2, 2), &wsa_data);
+	erc = tds_socket_init();
 	initialized = (erc == 0);
 	tds_mutex_unlock(&mtx);
 
diff --git a/src/tds/net.c b/src/tds/net.c
index 9bb985e7a4..b2fe03327d 100644
--- a/src/tds/net.c
+++ b/src/tds/net.c
@@ -106,22 +106,6 @@ static void tds_check_cancel(TDSCONNECTION *conn);
  * @{ 
  */
 
-#ifdef _WIN32
-int
-tds_socket_init(void)
-{
-	WSADATA wsadata;
-
-	return WSAStartup(MAKEWORD(2, 2), &wsadata);
-}
-
-void
-tds_socket_done(void)
-{
-	WSACleanup();
-}
-#endif
-
 #if !defined(SOL_TCP) && (defined(IPPROTO_TCP) || defined(_WIN32))
 /* fix incompatibility between MS headers */
 # ifndef IPPROTO_TCP
diff --git a/win32/initnet.c b/win32/initnet.c
index c460e9c9aa..1fd8542cbd 100644
--- a/win32/initnet.c
+++ b/win32/initnet.c
@@ -33,7 +33,7 @@ DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved TDS_UNUSED)
 		_CrtSetDbgFlag(_CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_LEAK_CHECK_DF | _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG));
 #endif
 
-		if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
+		if (tds_socket_init() != 0)
 			return FALSE;
 
 		DisableThreadLibraryCalls(hinstDLL);