Zebediah Figura : ws2_32: Move service lookup functions to protocol.c.
Alexandre Julliard
julliard at winehq.org
Mon May 3 16:37:06 CDT 2021
Module: wine
Branch: master
Commit: cfdaa7fdaf8f102d5eb9482ef0d18be615fe2684
URL: https://source.winehq.org/git/wine.git/?a=commit;h=cfdaa7fdaf8f102d5eb9482ef0d18be615fe2684
Author: Zebediah Figura <z.figura12 at gmail.com>
Date: Fri Apr 30 19:10:02 2021 -0500
ws2_32: Move service lookup functions to protocol.c.
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ws2_32/protocol.c | 121 +++++++++++++++++++++++++++++++++++++
dlls/ws2_32/socket.c | 160 -------------------------------------------------
2 files changed, 121 insertions(+), 160 deletions(-)
diff --git a/dlls/ws2_32/protocol.c b/dlls/ws2_32/protocol.c
index ad840aaeb6f..2cb6ef4be1c 100644
--- a/dlls/ws2_32/protocol.c
+++ b/dlls/ws2_32/protocol.c
@@ -1532,3 +1532,124 @@ struct WS_protoent * WINAPI WS_getprotobynumber( int number )
TRACE( "%d ret %p\n", number, retval );
return retval;
}
+
+
+static char *strdup_lower( const char *str )
+{
+ char *ret = HeapAlloc( GetProcessHeap(), 0, strlen(str) + 1 );
+ int i;
+
+ if (ret)
+ {
+ for (i = 0; str[i]; i++) ret[i] = tolower( str[i] );
+ ret[i] = 0;
+ }
+ else SetLastError( WSAENOBUFS );
+ return ret;
+}
+
+static struct WS_servent *get_servent_buffer( int size )
+{
+ struct per_thread_data *data = get_per_thread_data();
+ if (data->se_buffer)
+ {
+ if (data->se_len >= size) return data->se_buffer;
+ HeapFree( GetProcessHeap(), 0, data->se_buffer );
+ }
+ data->se_len = size;
+ data->se_buffer = HeapAlloc( GetProcessHeap(), 0, size );
+ if (!data->se_buffer) SetLastError( WSAENOBUFS );
+ return data->se_buffer;
+}
+
+static struct WS_servent *servent_from_unix( const struct servent *p_se )
+{
+ char *p;
+ struct WS_servent *p_to;
+
+ int size = (sizeof(*p_se) +
+ strlen(p_se->s_proto) + 1 +
+ strlen(p_se->s_name) + 1 +
+ list_size(p_se->s_aliases, 0));
+
+ if (!(p_to = get_servent_buffer( size ))) return NULL;
+ p_to->s_port = p_se->s_port;
+
+ p = (char *)(p_to + 1);
+ p_to->s_name = p;
+ strcpy( p, p_se->s_name );
+ p += strlen(p) + 1;
+
+ p_to->s_proto = p;
+ strcpy( p, p_se->s_proto );
+ p += strlen(p) + 1;
+
+ p_to->s_aliases = (char **)p;
+ list_dup( p_se->s_aliases, p_to->s_aliases, 0 );
+ return p_to;
+}
+
+
+/***********************************************************************
+ * getservbyname (ws2_32.55)
+ */
+struct WS_servent * WINAPI WS_getservbyname( const char *name, const char *proto )
+{
+ struct WS_servent *retval = NULL;
+ struct servent *serv;
+ char *name_str;
+ char *proto_str = NULL;
+
+ if (!(name_str = strdup_lower( name ))) return NULL;
+
+ if (proto && *proto)
+ {
+ if (!(proto_str = strdup_lower( proto )))
+ {
+ HeapFree( GetProcessHeap(), 0, name_str );
+ return NULL;
+ }
+ }
+
+ EnterCriticalSection( &csWSgetXXXbyYYY );
+ serv = getservbyname( name_str, proto_str );
+ if (serv)
+ retval = servent_from_unix( serv );
+ else
+ SetLastError( WSANO_DATA );
+ LeaveCriticalSection( &csWSgetXXXbyYYY );
+
+ HeapFree( GetProcessHeap(), 0, proto_str );
+ HeapFree( GetProcessHeap(), 0, name_str );
+ TRACE( "%s, %s ret %p\n", debugstr_a(name), debugstr_a(proto), retval );
+ return retval;
+}
+
+
+/***********************************************************************
+ * getservbyport (ws2_32.56)
+ */
+struct WS_servent * WINAPI WS_getservbyport( int port, const char *proto )
+{
+ struct WS_servent *retval = NULL;
+#ifdef HAVE_GETSERVBYPORT
+ struct servent *serv;
+ char *proto_str = NULL;
+
+ if (proto && *proto)
+ {
+ if (!(proto_str = strdup_lower( proto ))) return NULL;
+ }
+
+ EnterCriticalSection( &csWSgetXXXbyYYY );
+ if ((serv = getservbyport( port, proto_str )))
+ retval = servent_from_unix( serv );
+ else
+ SetLastError( WSANO_DATA );
+ LeaveCriticalSection( &csWSgetXXXbyYYY );
+
+ HeapFree( GetProcessHeap(), 0, proto_str );
+#endif
+ TRACE( "%d (i.e. port %d), %s ret %p\n", port, (int)ntohl(port), debugstr_a(proto), retval );
+ return retval;
+}
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index c3c73568c83..2776e2f0014 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -225,7 +225,6 @@ static int WS2_recv_base( SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
LPWSABUF lpControlBuffer );
-DECLARE_CRITICAL_SECTION(csWSgetXXXbyYYY);
DECLARE_CRITICAL_SECTION(cs_if_addr_cache);
DECLARE_CRITICAL_SECTION(cs_socket_list);
@@ -609,7 +608,6 @@ int num_startup;
static FARPROC blocking_hook = (FARPROC)WSA_DefaultBlockingHook;
/* function prototypes */
-static struct WS_servent *WS_dup_se(const struct servent* p_se);
static int ws_protocol_info(SOCKET s, int unicode, WSAPROTOCOL_INFOW *buffer, int *size);
int WSAIOCTL_GetInterfaceCount(void);
@@ -1340,22 +1338,6 @@ static int convert_sockopt(INT *level, INT *optname)
return 0;
}
-/* ----------------------------------- Per-thread info (or per-process?) */
-
-static char *strdup_lower(const char *str)
-{
- int i;
- char *ret = HeapAlloc( GetProcessHeap(), 0, strlen(str) + 1 );
-
- if (ret)
- {
- for (i = 0; str[i]; i++) ret[i] = tolower(str[i]);
- ret[i] = 0;
- }
- else SetLastError(WSAENOBUFS);
- return ret;
-}
-
/* Utility: get the SO_RCVTIMEO or SO_SNDTIMEO socket option
* from an fd and return the value converted to milli seconds
* or 0 if there is an infinite time out */
@@ -1564,19 +1546,6 @@ void WINAPI WSASetLastError(INT iError) {
SetLastError(iError);
}
-static struct WS_servent *check_buffer_se(int size)
-{
- struct per_thread_data * ptb = get_per_thread_data();
- if (ptb->se_buffer)
- {
- if (ptb->se_len >= size ) return ptb->se_buffer;
- HeapFree( GetProcessHeap(), 0, ptb->se_buffer );
- }
- ptb->se_buffer = HeapAlloc( GetProcessHeap(), 0, (ptb->se_len = size) );
- if (!ptb->se_buffer) SetLastError(WSAENOBUFS);
- return ptb->se_buffer;
-}
-
static inline BOOL supported_pf(int pf)
{
switch (pf)
@@ -5721,68 +5690,6 @@ SOCKET WINAPI WS_socket(int af, int type, int protocol)
}
-/***********************************************************************
- * getservbyname (WS2_32.55)
- */
-struct WS_servent* WINAPI WS_getservbyname(const char *name, const char *proto)
-{
- struct WS_servent* retval = NULL;
- struct servent* serv;
- char *name_str;
- char *proto_str = NULL;
-
- if (!(name_str = strdup_lower(name))) return NULL;
-
- if (proto && *proto)
- {
- if (!(proto_str = strdup_lower(proto)))
- {
- HeapFree( GetProcessHeap(), 0, name_str );
- return NULL;
- }
- }
-
- EnterCriticalSection( &csWSgetXXXbyYYY );
- serv = getservbyname(name_str, proto_str);
- if( serv != NULL )
- {
- retval = WS_dup_se(serv);
- }
- else SetLastError(WSANO_DATA);
- LeaveCriticalSection( &csWSgetXXXbyYYY );
- HeapFree( GetProcessHeap(), 0, proto_str );
- HeapFree( GetProcessHeap(), 0, name_str );
- TRACE( "%s, %s ret %p\n", debugstr_a(name), debugstr_a(proto), retval );
- return retval;
-}
-
-/***********************************************************************
- * getservbyport (WS2_32.56)
- */
-struct WS_servent* WINAPI WS_getservbyport(int port, const char *proto)
-{
- struct WS_servent* retval = NULL;
-#ifdef HAVE_GETSERVBYPORT
- struct servent* serv;
- char *proto_str = NULL;
-
- if (proto && *proto)
- {
- if (!(proto_str = strdup_lower(proto))) return NULL;
- }
- EnterCriticalSection( &csWSgetXXXbyYYY );
- if( (serv = getservbyport(port, proto_str)) != NULL ) {
- retval = WS_dup_se(serv);
- }
- else SetLastError(WSANO_DATA);
- LeaveCriticalSection( &csWSgetXXXbyYYY );
- HeapFree( GetProcessHeap(), 0, proto_str );
-#endif
- TRACE("%d (i.e. port %d), %s ret %p\n", port, (int)ntohl(port), debugstr_a(proto), retval);
- return retval;
-}
-
-
/***********************************************************************
* WSAEnumNetworkEvents (WS2_32.36)
*/
@@ -6187,73 +6094,6 @@ INT WINAPI WSAUnhookBlockingHook(void)
}
-/* ----------------------------------- end of API stuff */
-
-/* ----------------------------------- helper functions -
- *
- * TODO: Merge WS_dup_..() stuff into one function that
- * would operate with a generic structure containing internal
- * pointers (via a template of some kind).
- */
-
-static int list_size(char** l, int item_size)
-{
- int i,j = 0;
- if(l)
- { for(i=0;l[i];i++)
- j += (item_size) ? item_size : strlen(l[i]) + 1;
- j += (i + 1) * sizeof(char*); }
- return j;
-}
-
-static int list_dup(char** l_src, char** l_to, int item_size)
-{
- char *p;
- int i;
-
- for (i = 0; l_src[i]; i++) ;
- p = (char *)(l_to + i + 1);
- for (i = 0; l_src[i]; i++)
- {
- int count = ( item_size ) ? item_size : strlen(l_src[i]) + 1;
- memcpy(p, l_src[i], count);
- l_to[i] = p;
- p += count;
- }
- l_to[i] = NULL;
- return p - (char *)l_to;
-}
-
-/* ----- servent */
-
-static struct WS_servent *WS_dup_se(const struct servent* p_se)
-{
- char *p;
- struct WS_servent *p_to;
-
- int size = (sizeof(*p_se) +
- strlen(p_se->s_proto) + 1 +
- strlen(p_se->s_name) + 1 +
- list_size(p_se->s_aliases, 0));
-
- if (!(p_to = check_buffer_se(size))) return NULL;
- p_to->s_port = p_se->s_port;
-
- p = (char *)(p_to + 1);
- p_to->s_name = p;
- strcpy(p, p_se->s_name);
- p += strlen(p) + 1;
-
- p_to->s_proto = p;
- strcpy(p, p_se->s_proto);
- p += strlen(p) + 1;
-
- p_to->s_aliases = (char **)p;
- list_dup(p_se->s_aliases, p_to->s_aliases, 0);
- return p_to;
-}
-
-
/***********************************************************************
* WSARecv (WS2_32.67)
*/
More information about the wine-cvs
mailing list