2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS WinSock 2 DLL
5 * PURPOSE: Namespace APIs
6 * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
8 * CSH 01/09-2000 Created
10 #define __NO_CTYPE_INLINES
19 #ifndef MAX_HOSTNAME_LEN
20 #define MAX_HOSTNAME_LEN 256
23 /* Name resolution APIs */
31 IN LPSOCKADDR lpsaAddress
,
32 IN DWORD dwAddressLength
,
33 IN LPWSAPROTOCOL_INFOA lpProtocolInfo
,
34 OUT LPSTR lpszAddressString
,
35 IN OUT LPDWORD lpdwAddressStringLength
)
49 IN LPSOCKADDR lpsaAddress
,
50 IN DWORD dwAddressLength
,
51 IN LPWSAPROTOCOL_INFOW lpProtocolInfo
,
52 OUT LPWSTR lpszAddressString
,
53 IN OUT LPDWORD lpdwAddressStringLength
)
66 WSAEnumNameSpaceProvidersA(
67 IN OUT LPDWORD lpdwBufferLength
,
68 OUT LPWSANAMESPACE_INFOA lpnspBuffer
)
81 WSAEnumNameSpaceProvidersW(
82 IN OUT LPDWORD lpdwBufferLength
,
83 OUT LPWSANAMESPACE_INFOW lpnspBuffer
)
96 WSAGetServiceClassInfoA(
97 IN LPGUID lpProviderId
,
98 IN LPGUID lpServiceClassId
,
99 IN OUT LPDWORD lpdwBufferLength
,
100 OUT LPWSASERVICECLASSINFOA lpServiceClassInfo
)
113 WSAGetServiceClassInfoW(
114 IN LPGUID lpProviderId
,
115 IN LPGUID lpServiceClassId
,
116 IN OUT LPDWORD lpdwBufferLength
,
117 OUT LPWSASERVICECLASSINFOW lpServiceClassInfo
)
130 WSAGetServiceClassNameByClassIdA(
131 IN LPGUID lpServiceClassId
,
132 OUT LPSTR lpszServiceClassName
,
133 IN OUT LPDWORD lpdwBufferLength
)
146 WSAGetServiceClassNameByClassIdW(
147 IN LPGUID lpServiceClassId
,
148 OUT LPWSTR lpszServiceClassName
,
149 IN OUT LPDWORD lpdwBufferLength
)
162 WSAInstallServiceClassA(
163 IN LPWSASERVICECLASSINFOA lpServiceClassInfo
)
176 WSAInstallServiceClassW(
177 IN LPWSASERVICECLASSINFOW lpServiceClassInfo
)
190 WSALookupServiceBeginA(
191 IN LPWSAQUERYSETA lpqsRestrictions
,
192 IN DWORD dwControlFlags
,
193 OUT LPHANDLE lphLookup
)
206 WSALookupServiceBeginW(
207 IN LPWSAQUERYSETW lpqsRestrictions
,
208 IN DWORD dwControlFlags
,
209 OUT LPHANDLE lphLookup
)
236 WSALookupServiceNextA(
238 IN DWORD dwControlFlags
,
239 IN OUT LPDWORD lpdwBufferLength
,
240 OUT LPWSAQUERYSETA lpqsResults
)
253 WSALookupServiceNextW(
255 IN DWORD dwControlFlags
,
256 IN OUT LPDWORD lpdwBufferLength
,
257 OUT LPWSAQUERYSETW lpqsResults
)
270 WSARemoveServiceClass(
271 IN LPGUID lpServiceClassId
)
285 IN LPWSAQUERYSETA lpqsRegInfo
,
286 IN WSAESETSERVICEOP essOperation
,
287 IN DWORD dwControlFlags
)
301 IN LPWSAQUERYSETW lpqsRegInfo
,
302 IN WSAESETSERVICEOP essOperation
,
303 IN DWORD dwControlFlags
)
317 IN LPSTR AddressString
,
318 IN INT AddressFamily
,
319 IN LPWSAPROTOCOL_INFOA lpProtocolInfo
,
320 OUT LPSOCKADDR lpAddress
,
321 IN OUT LPINT lpAddressLength
)
325 LPWSAPROTOCOL_INFOW lpProtoInfoW
= NULL
;
327 len
= MultiByteToWideChar( CP_ACP
, 0, AddressString
, -1, NULL
, 0 );
328 szTemp
= HeapAlloc( GetProcessHeap(), 0, len
* sizeof(WCHAR
) );
329 MultiByteToWideChar( CP_ACP
, 0, AddressString
, -1, szTemp
, len
);
333 len
= WSAPROTOCOL_LEN
+1;
334 lpProtoInfoW
= HeapAlloc( GetProcessHeap(), 0, len
* sizeof(WCHAR
) );
336 memcpy( lpProtoInfoW
, lpProtocolInfo
, sizeof(LPWSAPROTOCOL_INFOA
));
338 MultiByteToWideChar( CP_ACP
, 0, lpProtocolInfo
->szProtocol
, -1, lpProtoInfoW
->szProtocol
, len
);
341 ret
= WSAStringToAddressW(szTemp
, AddressFamily
, lpProtoInfoW
, lpAddress
, lpAddressLength
);
343 HeapFree( GetProcessHeap(), 0, szTemp
);
346 HeapFree( GetProcessHeap(), 0, lpProtoInfoW
);
348 WSASetLastError(ret
);
360 IN LPWSTR AddressString
,
361 IN INT AddressFamily
,
362 IN LPWSAPROTOCOL_INFOW lpProtocolInfo
,
363 OUT LPSOCKADDR lpAddress
,
364 IN OUT LPINT lpAddressLength
)
371 SOCKADDR_IN
*sockaddr
= (SOCKADDR_IN
*) lpAddress
;
373 if (!lpAddressLength
|| !lpAddress
)
376 if (AddressString
==NULL
)
379 /* Set right adress family */
380 if (lpProtocolInfo
!=NULL
)
381 sockaddr
->sin_family
= lpProtocolInfo
->iAddressFamily
;
383 else sockaddr
->sin_family
= AddressFamily
;
386 if (AddressFamily
== AF_INET
)
388 if (*lpAddressLength
< (INT
)sizeof(SOCKADDR_IN
))
390 *lpAddressLength
= sizeof(SOCKADDR_IN
);
399 // translate now ip string to ip
401 /* rest sockaddr.sin_addr.s_addr
402 for we need to be sure it is zero when we come to while */
403 memset(lpAddress
,0,sizeof(SOCKADDR_IN
));
405 /* Set right adress family */
406 sockaddr
->sin_family
= AF_INET
;
408 /* Get port number */
409 pos
= wcscspn(AddressString
,L
":") + 1;
410 if (pos
< (int)wcslen(AddressString
))
411 sockaddr
->sin_port
= wcstol(&AddressString
[pos
],bp
,10);
414 sockaddr
->sin_port
= 0;
420 while (pos
< (int)wcslen(AddressString
))
422 inetaddr
= (inetaddr
<<8) + ((UCHAR
)wcstol(&AddressString
[pos
],bp
,10));
423 pos
+= wcscspn( &AddressString
[pos
],L
".") +1 ;
427 sockaddr
->sin_addr
.s_addr
= inetaddr
;
433 WSASetLastError(res
);
438 void check_hostent(struct hostent
**he
) {
439 struct hostent
*new_he
;
440 WS_DbgPrint(MID_TRACE
,("*he: %x\n",*he
));
442 new_he
= HeapAlloc(GlobalHeap
, 0, sizeof(struct hostent
) + MAX_HOSTNAME_LEN
+ 1);
443 new_he
->h_name
= (PCHAR
)(new_he
+ 1);
444 new_he
->h_aliases
= 0;
445 new_he
->h_addrtype
= 0; // AF_INET
446 new_he
->h_length
= 0; // sizeof(in_addr)
447 new_he
->h_addr_list
= HeapAlloc(GlobalHeap
, 0, sizeof(char *) * 2);
448 RtlZeroMemory(new_he
->h_addr_list
, sizeof(char *) * 2);
453 void populate_hostent(struct hostent
*he
, char* name
, DNS_A_DATA addr
) {
455 //he = HeapAlloc(GlobalHeap, 0, sizeof(struct hostent));
456 //he->h_name = HeapAlloc(GlobalHeap, 0, MAX_HOSTNAME_LEN+1);
457 strncpy(he
->h_name
, name
, MAX_HOSTNAME_LEN
);
459 he
->h_addrtype
= AF_INET
;
460 he
->h_length
= sizeof(IN_ADDR
); //sizeof(struct in_addr);
461 if( he
->h_addr_list
[0] ) HeapFree( GlobalHeap
, 0, he
->h_addr_list
[0] );
462 he
->h_addr_list
[0] = HeapAlloc(GlobalHeap
, 0, MAX_HOSTNAME_LEN
+1);
463 WS_DbgPrint(MID_TRACE
,("he->h_addr_list[0] %x\n", he
->h_addr_list
[0]));
464 RtlCopyMemory(he
->h_addr_list
[0], (char*)&addr
.IpAddress
,
465 sizeof(addr
.IpAddress
));
466 he
->h_addr_list
[1] = 0;
470 #define HFREE(x) if(x) { HeapFree(GlobalHeap, 0, (x)); x=0; }
471 void free_hostent(struct hostent
*he
) {
474 char *next
= he
->h_aliases
[0];
475 while(next
) { HFREE(next
); next
++; }
476 next
= he
->h_addr_list
[0];
477 while(next
) { HFREE(next
); next
++; }
478 HFREE(he
->h_addr_list
);
483 /* WinSock 1.1 compatible name resolution APIs */
491 IN CONST CHAR FAR
* addr
,
497 return (LPHOSTENT
)NULL
;
501 Assumes rfc 1123 - adam *
503 addr[0] = inet_addr(name);
504 strcpy( hostname, name );
505 if(addr[0] == 0xffffffff) return NULL;
506 he.h_addr_list = (void *)addr;
507 he.h_name = hostname;
509 he.h_addrtype = AF_INET;
510 he.h_length = sizeof(addr);
514 From the MSDN Platform SDK: Windows Sockets 2
515 "The gethostbyname function cannot resolve IP address strings passed to it.
516 Such a request is treated exactly as if an unknown host name were passed."
519 Defferring to the the documented behaviour, rather than the unix behaviour
520 What if the hostname is in the HOSTS file? see getservbyname
525 /* DnsQuery -- lib/dnsapi/dnsapi/query.c */
526 /* see ws2_32.h, winsock2.h*/
527 /*getnetworkparameters - iphlp api */
531 servent -- w32api/include/winsock2.h
532 PWINSOCK_THREAD_BLOCK -- ws2_32.h
533 dllmain.c -- threadlocal memory allocation / deallocation
538 /* lib/adns/src/adns.h XXX */
548 #define h_addr h_addr_list[0]
558 struct hostent defined in w32api/include/winsock2.h
561 void free_servent(struct servent
* s
) {
563 char* next
= s
->s_aliases
[0];
564 while(next
) { HFREE(next
); next
++; }
575 IN CONST CHAR FAR
* name
)
577 enum addr_type
{ GH_INVALID
, GH_IPV6
, GH_IPV4
, GH_RFC1123_DNS
};
578 typedef enum addr_type addr_type
;
582 DNS_STATUS dns_status
= {0};
583 /* include/WinDNS.h -- look up DNS_RECORD on MSDN */
588 PWINSOCK_THREAD_BLOCK p
= NtCurrentTeb()->WinSockData
;
591 WSASetLastError( WSANOTINITIALISED
);
595 check_hostent(&p
->Hostent
); /*XXX alloc_hostent*/
597 /* Hostname NULL - behave like gethostname */
599 ret
= gethostname(p
->Hostent
->h_name
, MAX_HOSTNAME_LEN
);
604 WSASetLastError( WSAHOST_NOT_FOUND
); //WSANO_DATA ??
608 /* Is it an IPv6 address? */
609 found
= strstr(name
, ":");
610 if( found
!= NULL
) {
615 /* Is it an IPv4 address? */
616 if (!isalpha(name
[0])) {
621 addr
= GH_RFC1123_DNS
;
623 /* Broken out in case we want to get fancy later */
627 WSASetLastError(STATUS_NOT_IMPLEMENTED
);
632 WSASetLastError(WSAEFAULT
);
636 /* Note: If passed an IP address, MSDN says that gethostbyname()
637 treats it as an unknown host.
638 This is different from the unix implementation. Use inet_addr()
642 /* DNS_TYPE_A: include/WinDNS.h */
643 /* DnsQuery -- lib/dnsapi/dnsapi/query.c */
644 dns_status
= DnsQuery_A ( name
, DNS_TYPE_A
, DNS_QUERY_STANDARD
,
645 0, /* extra dns servers */ &dp
, 0 );
647 if(dns_status
== 0) {
648 //ASSERT(dp->wType == DNS_TYPE_A);
649 //ASSERT(dp->wDataLength == sizeof(DNS_A_DATA));
652 curr
!= NULL
&& curr
->wType
!= DNS_TYPE_A
;
653 curr
= curr
->pNext
) {
654 WS_DbgPrint(MID_TRACE
,("wType: %i\n", curr
->wType
));
659 WS_DbgPrint(MID_TRACE
,("populating hostent\n"));
660 WS_DbgPrint(MID_TRACE
,("pName is (%s)\n", curr
->pName
));
661 populate_hostent(p
->Hostent
, (PCHAR
)curr
->pName
, curr
->Data
.A
);
662 DnsRecordListFree(dp
, DnsFreeRecordList
);
665 DnsRecordListFree(dp
, DnsFreeRecordList
);
669 WS_DbgPrint(MID_TRACE
,("Called DnsQuery, but host not found. Err: %i\n",
671 WSASetLastError(WSAHOST_NOT_FOUND
);
677 WSASetLastError(WSANO_RECOVERY
);
682 WSASetLastError(WSANO_RECOVERY
);
695 DWORD size
= namelen
;
697 int ret
= GetComputerNameExA(ComputerNameDnsHostname
, name
, &size
);
699 WSASetLastError(WSAEFAULT
);
702 name
[namelen
-1] = '\0';
709 * XXX arty -- Partial implementation pending a better one. This one will
710 * do for normal purposes.#include <ws2_32.h>
712 * Return the address of a static LPPROTOENT corresponding to the named
713 * protocol. These structs aren't very interesting, so I'm not too ashamed
714 * to have this function work on builtins for now.
721 IN CONST CHAR FAR
* name
)
723 static CHAR
*udp_aliases
= 0;
724 static PROTOENT udp
= { "udp", &udp_aliases
, 17 };
725 static CHAR
*tcp_aliases
= 0;
726 static PROTOENT tcp
= { "tcp", &tcp_aliases
, 6 };
727 if( !_stricmp( name
, "udp" ) ) {
729 } else if( !_stricmp( name
, "tcp" ) ) {
746 return (LPPROTOENT
)NULL
;
749 #define SKIPWS(ptr,act) \
750 {while(*ptr && isspace(*ptr)) ptr++; if(!*ptr) act;}
751 #define SKIPANDMARKSTR(ptr,act) \
752 {while(*ptr && !isspace(*ptr)) ptr++; \
753 if(!*ptr) {act;} else { *ptr = 0; ptr++; }}
756 static BOOL
DecodeServEntFromString( IN PCHAR ServiceString
,
757 OUT PCHAR
*ServiceName
,
758 OUT PCHAR
*PortNumberStr
,
759 OUT PCHAR
*ProtocolStr
,
761 IN DWORD MaxAlias
) {
764 WS_DbgPrint(MAX_TRACE
, ("Parsing service ent [%s]\n", ServiceString
));
766 SKIPWS(ServiceString
, return FALSE
);
767 *ServiceName
= ServiceString
;
768 SKIPANDMARKSTR(ServiceString
, return FALSE
);
769 SKIPWS(ServiceString
, return FALSE
);
770 *PortNumberStr
= ServiceString
;
771 SKIPANDMARKSTR(ServiceString
, ;);
773 while( *ServiceString
&& NAliases
< MaxAlias
- 1 ) {
774 SKIPWS(ServiceString
, break);
775 if( *ServiceString
) {
776 SKIPANDMARKSTR(ServiceString
, ;);
777 if( strlen(ServiceString
) ) {
778 WS_DbgPrint(MAX_TRACE
, ("Alias: %s\n", ServiceString
));
779 *Aliases
++ = ServiceString
;
786 *ProtocolStr
= strchr(*PortNumberStr
,'/');
787 if( !*ProtocolStr
) return FALSE
;
788 **ProtocolStr
= 0; (*ProtocolStr
)++;
790 WS_DbgPrint(MAX_TRACE
, ("Parsing done: %s %s %s %d\n",
791 *ServiceName
, *ProtocolStr
, *PortNumberStr
,
797 #define ADJ_PTR(p,b1,b2) p = (p - b1) + b2
806 IN CONST CHAR FAR
* name
,
807 IN CONST CHAR FAR
* proto
)
811 CHAR ServiceDBData
[BUFSIZ
] = { 0 };
812 PCHAR SystemDirectory
= ServiceDBData
; /* Reuse this stack space */
813 PCHAR ServicesFileLocation
= "\\drivers\\etc\\services";
814 PCHAR ThisLine
= 0, NextLine
= 0, ServiceName
= 0, PortNumberStr
= 0,
815 ProtocolStr
= 0, Comment
= 0;
816 PCHAR Aliases
[WS2_INTERNAL_MAX_ALIAS
] = { 0 };
817 UINT i
,SizeNeeded
= 0,
818 SystemDirSize
= sizeof(ServiceDBData
) - 1;
819 DWORD ReadSize
= 0, ValidData
= 0;
820 PWINSOCK_THREAD_BLOCK p
= NtCurrentTeb()->WinSockData
;
823 WSASetLastError( WSANOTINITIALISED
);
828 WSASetLastError( WSANO_RECOVERY
);
832 if( !GetSystemDirectoryA( SystemDirectory
, SystemDirSize
) ) {
833 WSASetLastError( WSANO_RECOVERY
);
834 WS_DbgPrint(MIN_TRACE
, ("Could not get windows system directory.\n"));
835 return NULL
; /* Can't get system directory */
838 strncat( SystemDirectory
, ServicesFileLocation
, SystemDirSize
);
840 ServicesFile
= CreateFileA( SystemDirectory
,
845 FILE_ATTRIBUTE_NORMAL
|
846 FILE_FLAG_SEQUENTIAL_SCAN
,
849 if( ServicesFile
== INVALID_HANDLE_VALUE
) {
850 WSASetLastError( WSANO_RECOVERY
);
854 /* Scan the services file ...
856 * We will read up to BUFSIZ bytes per pass, until the buffer does not
857 * contain a full line, then we will try to read more.
859 * We fall from the loop if the buffer does not have a line terminator.
864 ReadFile( ServicesFile
, ServiceDBData
+ ValidData
,
865 sizeof( ServiceDBData
) - ValidData
,
866 &ReadSize
, NULL
) ) {
867 ValidData
+= ReadSize
;
869 NextLine
= ThisLine
= ServiceDBData
;
871 /* Find the beginning of the next line */
872 while( NextLine
< ServiceDBData
+ ValidData
&&
873 *NextLine
!= '\r' && *NextLine
!= '\n' ) NextLine
++;
875 /* Zero and skip, so we can treat what we have as a string */
876 if( NextLine
>= ServiceDBData
+ ValidData
)
879 *NextLine
= 0; NextLine
++;
881 Comment
= strchr( ThisLine
, '#' );
882 if( Comment
) *Comment
= 0; /* Terminate at comment start */
884 if( DecodeServEntFromString( ThisLine
,
889 WS2_INTERNAL_MAX_ALIAS
) &&
890 !strcmp( ServiceName
, name
) &&
891 (proto
? !strcmp( ProtocolStr
, proto
) : TRUE
) ) {
893 WS_DbgPrint(MAX_TRACE
,("Found the service entry.\n"));
895 SizeNeeded
= sizeof(WINSOCK_GETSERVBYNAME_CACHE
) +
896 (NextLine
- ThisLine
);
900 /* Get rid of everything we read so far */
901 while( NextLine
<= ServiceDBData
+ ValidData
&&
902 isspace( *NextLine
) ) NextLine
++;
904 WS_DbgPrint(MAX_TRACE
,("About to move %d chars\n",
905 ServiceDBData
+ ValidData
- NextLine
));
907 memmove( ServiceDBData
, NextLine
,
908 ServiceDBData
+ ValidData
- NextLine
);
909 ValidData
-= NextLine
- ServiceDBData
;
910 WS_DbgPrint(MAX_TRACE
,("Valid bytes: %d\n", ValidData
));
913 /* This we'll do no matter what */
914 CloseHandle( ServicesFile
);
917 WS_DbgPrint(MAX_TRACE
,("Not found\n"));
918 WSASetLastError( WSANO_DATA
);
922 if( !p
->Getservbyname
|| p
->Getservbyname
->Size
< SizeNeeded
) {
923 /* Free previous getservbyname buffer, allocate bigger */
924 if( p
->Getservbyname
)
925 HeapFree(GlobalHeap
, 0, p
->Getservbyname
);
926 p
->Getservbyname
= HeapAlloc(GlobalHeap
, 0, SizeNeeded
);
927 if( !p
->Getservbyname
) {
928 WS_DbgPrint(MIN_TRACE
,("Couldn't allocate %d bytes\n",
930 WSASetLastError( WSATRY_AGAIN
);
933 p
->Getservbyname
->Size
= SizeNeeded
;
937 memmove( p
->Getservbyname
->Data
,
939 NextLine
- ThisLine
);
941 ADJ_PTR(ServiceName
,ThisLine
,p
->Getservbyname
->Data
);
942 ADJ_PTR(ProtocolStr
,ThisLine
,p
->Getservbyname
->Data
);
943 WS_DbgPrint(MAX_TRACE
,
944 ("ServiceName: %s, Protocol: %s\n", ServiceName
, ProtocolStr
));
946 for( i
= 0; Aliases
[i
]; i
++ ) {
947 ADJ_PTR(Aliases
[i
],ThisLine
,p
->Getservbyname
->Data
);
948 WS_DbgPrint(MAX_TRACE
,("Aliase %d: %s\n", i
, Aliases
[i
]));
951 memcpy(p
->Getservbyname
,Aliases
,sizeof(Aliases
));
953 /* Create the struct proper */
954 p
->Getservbyname
->ServerEntry
.s_name
= ServiceName
;
955 p
->Getservbyname
->ServerEntry
.s_aliases
= p
->Getservbyname
->Aliases
;
956 p
->Getservbyname
->ServerEntry
.s_port
= htons(atoi(PortNumberStr
));
957 p
->Getservbyname
->ServerEntry
.s_proto
= ProtocolStr
;
959 return &p
->Getservbyname
->ServerEntry
;
970 IN CONST CHAR FAR
* proto
)
974 CHAR ServiceDBData
[BUFSIZ
] = { 0 };
975 PCHAR SystemDirectory
= ServiceDBData
; /* Reuse this stack space */
976 PCHAR ServicesFileLocation
= "\\drivers\\etc\\services";
977 PCHAR ThisLine
= 0, NextLine
= 0, ServiceName
= 0, PortNumberStr
= 0,
978 ProtocolStr
= 0, Comment
= 0;
979 PCHAR Aliases
[WS2_INTERNAL_MAX_ALIAS
] = { 0 };
980 UINT i
,SizeNeeded
= 0,
981 SystemDirSize
= sizeof(ServiceDBData
) - 1;
982 DWORD ReadSize
= 0, ValidData
= 0;
983 PWINSOCK_THREAD_BLOCK p
= NtCurrentTeb()->WinSockData
;
986 WSASetLastError( WSANOTINITIALISED
);
991 WSASetLastError( WSANO_RECOVERY
);
995 if( !GetSystemDirectoryA( SystemDirectory
, SystemDirSize
) ) {
996 WSASetLastError( WSANO_RECOVERY
);
997 WS_DbgPrint(MIN_TRACE
, ("Could not get windows system directory.\n"));
998 return NULL
; /* Can't get system directory */
1001 strncat( SystemDirectory
, ServicesFileLocation
, SystemDirSize
);
1003 ServicesFile
= CreateFileA( SystemDirectory
,
1008 FILE_ATTRIBUTE_NORMAL
|
1009 FILE_FLAG_SEQUENTIAL_SCAN
,
1012 if( ServicesFile
== INVALID_HANDLE_VALUE
) {
1013 WSASetLastError( WSANO_RECOVERY
);
1017 /* Scan the services file ...
1019 * We will read up to BUFSIZ bytes per pass, until the buffer does not
1020 * contain a full line, then we will try to read more.
1022 * We fall from the loop if the buffer does not have a line terminator.
1027 ReadFile( ServicesFile
, ServiceDBData
+ ValidData
,
1028 sizeof( ServiceDBData
) - ValidData
,
1029 &ReadSize
, NULL
) ) {
1030 ValidData
+= ReadSize
;
1032 NextLine
= ThisLine
= ServiceDBData
;
1034 /* Find the beginning of the next line */
1035 while( NextLine
< ServiceDBData
+ ValidData
&&
1036 *NextLine
!= '\r' && *NextLine
!= '\n' ) NextLine
++;
1038 /* Zero and skip, so we can treat what we have as a string */
1039 if( NextLine
>= ServiceDBData
+ ValidData
)
1042 *NextLine
= 0; NextLine
++;
1044 Comment
= strchr( ThisLine
, '#' );
1045 if( Comment
) *Comment
= 0; /* Terminate at comment start */
1047 if( DecodeServEntFromString( ThisLine
,
1052 WS2_INTERNAL_MAX_ALIAS
) &&
1053 (htons(atoi( PortNumberStr
)) == port
) &&
1054 (proto
? !strcmp( ProtocolStr
, proto
) : TRUE
) ) {
1056 WS_DbgPrint(MAX_TRACE
,("Found the port entry.\n"));
1059 SizeNeeded
= sizeof(WINSOCK_GETSERVBYPORT_CACHE
) +
1060 (NextLine
- ThisLine
);
1064 /* Get rid of everything we read so far */
1065 while( NextLine
<= ServiceDBData
+ ValidData
&&
1066 isspace( *NextLine
) ) NextLine
++;
1068 WS_DbgPrint(MAX_TRACE
,("About to move %d chars\n",
1069 ServiceDBData
+ ValidData
- NextLine
));
1071 memmove( ServiceDBData
, NextLine
,
1072 ServiceDBData
+ ValidData
- NextLine
);
1073 ValidData
-= NextLine
- ServiceDBData
;
1074 WS_DbgPrint(MAX_TRACE
,("Valid bytes: %d\n", ValidData
));
1077 /* This we'll do no matter what */
1078 CloseHandle( ServicesFile
);
1081 WS_DbgPrint(MAX_TRACE
,("Not found\n"));
1082 WSASetLastError( WSANO_DATA
);
1086 if( !p
->Getservbyport
|| p
->Getservbyport
->Size
< SizeNeeded
) {
1087 /* Free previous getservbyport buffer, allocate bigger */
1088 if( p
->Getservbyport
)
1089 HeapFree(GlobalHeap
, 0, p
->Getservbyport
);
1090 p
->Getservbyport
= HeapAlloc(GlobalHeap
, 0, SizeNeeded
);
1091 if( !p
->Getservbyport
) {
1092 WS_DbgPrint(MIN_TRACE
,("Couldn't allocate %d bytes\n",
1094 WSASetLastError( WSATRY_AGAIN
);
1097 p
->Getservbyport
->Size
= SizeNeeded
;
1100 memmove( p
->Getservbyport
->Data
,
1102 NextLine
- ThisLine
);
1104 ADJ_PTR(PortNumberStr
,ThisLine
,p
->Getservbyport
->Data
);
1105 ADJ_PTR(ProtocolStr
,ThisLine
,p
->Getservbyport
->Data
);
1106 WS_DbgPrint(MAX_TRACE
,
1107 ("Port Number: %s, Protocol: %s\n", PortNumberStr
, ProtocolStr
));
1109 for( i
= 0; Aliases
[i
]; i
++ ) {
1110 ADJ_PTR(Aliases
[i
],ThisLine
,p
->Getservbyport
->Data
);
1111 WS_DbgPrint(MAX_TRACE
,("Aliases %d: %s\n", i
, Aliases
[i
]));
1114 memcpy(p
->Getservbyport
,Aliases
,sizeof(Aliases
));
1116 /* Create the struct proper */
1117 p
->Getservbyport
->ServerEntry
.s_name
= ServiceName
;
1118 p
->Getservbyport
->ServerEntry
.s_aliases
= p
->Getservbyport
->Aliases
;
1119 p
->Getservbyport
->ServerEntry
.s_port
= port
;
1120 p
->Getservbyport
->ServerEntry
.s_proto
= ProtocolStr
;
1122 WS_DbgPrint(MID_TRACE
,("s_name: %s\n", ServiceName
));
1124 return &p
->Getservbyport
->ServerEntry
;
1135 IN CONST CHAR FAR
* cp
)
1137 * FUNCTION: Converts a string containing an IPv4 address to an unsigned long
1139 * cp = Pointer to string with address to convert
1141 * Binary representation of IPv4 address, or INADDR_NONE
1153 if (strcmp(p
, " ") == 0)
1156 for (i
= 0; i
<= 3; i
++) {
1157 u
+= (strtoul(p
, &p
, 0) << (i
* 8));
1183 p
= ((PWINSOCK_THREAD_BLOCK
)NtCurrentTeb()->WinSockData
)->Intoa
;
1184 _itoa(in
.S_un
.S_addr
& 0xFF, b
, 10);
1186 _itoa((in
.S_un
.S_addr
>> 8) & 0xFF, b
, 10);
1189 _itoa((in
.S_un
.S_addr
>> 16) & 0xFF, b
, 10);
1192 _itoa((in
.S_un
.S_addr
>> 24) & 0xFF, b
, 10);
1195 return (CHAR FAR
*)p
;
1204 WSAAsyncGetHostByAddr(
1207 IN CONST CHAR FAR
* addr
,
1224 WSAAsyncGetHostByName(
1227 IN CONST CHAR FAR
* name
,
1242 WSAAsyncGetProtoByName(
1245 IN CONST CHAR FAR
* name
,
1260 WSAAsyncGetProtoByNumber(
1277 WSAAsyncGetServByName(
1280 IN CONST CHAR FAR
* name
,
1281 IN CONST CHAR FAR
* proto
,
1296 WSAAsyncGetServByPort(
1300 IN CONST CHAR FAR
* proto
,