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
)
335 IN LPWSTR AddressString
,
336 IN INT AddressFamily
,
337 IN LPWSAPROTOCOL_INFOW lpProtocolInfo
,
338 OUT LPSOCKADDR lpAddress
,
339 IN OUT LPINT lpAddressLength
)
346 void check_hostent(struct hostent
**he
) {
347 struct hostent
*new_he
;
348 WS_DbgPrint(MID_TRACE
,("*he: %x\n",*he
));
350 new_he
= HeapAlloc(GlobalHeap
, 0, sizeof(struct hostent
) + MAX_HOSTNAME_LEN
+ 1);
351 new_he
->h_name
= (PCHAR
)(new_he
+ 1);
352 new_he
->h_aliases
= 0;
353 new_he
->h_addrtype
= 0; // AF_INET
354 new_he
->h_length
= 0; // sizeof(in_addr)
355 new_he
->h_addr_list
= HeapAlloc(GlobalHeap
, 0, sizeof(char *) * 2);
356 RtlZeroMemory(new_he
->h_addr_list
, sizeof(char *) * 2);
361 void populate_hostent(struct hostent
*he
, char* name
, DNS_A_DATA addr
) {
363 //he = HeapAlloc(GlobalHeap, 0, sizeof(struct hostent));
364 //he->h_name = HeapAlloc(GlobalHeap, 0, MAX_HOSTNAME_LEN+1);
365 strncpy(he
->h_name
, name
, MAX_HOSTNAME_LEN
);
367 he
->h_addrtype
= AF_INET
;
368 he
->h_length
= sizeof(IN_ADDR
); //sizeof(struct in_addr);
369 if( he
->h_addr_list
[0] ) HeapFree( GlobalHeap
, 0, he
->h_addr_list
[0] );
370 he
->h_addr_list
[0] = HeapAlloc(GlobalHeap
, 0, MAX_HOSTNAME_LEN
+1);
371 WS_DbgPrint(MID_TRACE
,("he->h_addr_list[0] %x\n", he
->h_addr_list
[0]));
372 RtlCopyMemory(he
->h_addr_list
[0], (char*)&addr
.IpAddress
,
373 sizeof(addr
.IpAddress
));
374 he
->h_addr_list
[1] = 0;
378 #define HFREE(x) if(x) { HeapFree(GlobalHeap, 0, (x)); x=0; }
379 void free_hostent(struct hostent
*he
) {
382 char *next
= he
->h_aliases
[0];
383 while(next
) { HFREE(next
); next
++; }
384 next
= he
->h_addr_list
[0];
385 while(next
) { HFREE(next
); next
++; }
386 HFREE(he
->h_addr_list
);
391 /* WinSock 1.1 compatible name resolution APIs */
399 IN CONST CHAR FAR
* addr
,
405 return (LPHOSTENT
)NULL
;
409 Assumes rfc 1123 - adam *
411 addr[0] = inet_addr(name);
412 strcpy( hostname, name );
413 if(addr[0] == 0xffffffff) return NULL;
414 he.h_addr_list = (void *)addr;
415 he.h_name = hostname;
417 he.h_addrtype = AF_INET;
418 he.h_length = sizeof(addr);
422 From the MSDN Platform SDK: Windows Sockets 2
423 "The gethostbyname function cannot resolve IP address strings passed to it.
424 Such a request is treated exactly as if an unknown host name were passed."
427 Defferring to the the documented behaviour, rather than the unix behaviour
428 What if the hostname is in the HOSTS file? see getservbyname
433 /* DnsQuery -- lib/dnsapi/dnsapi/query.c */
434 /* see ws2_32.h, winsock2.h*/
435 /*getnetworkparameters - iphlp api */
439 servent -- w32api/include/winsock2.h
440 PWINSOCK_THREAD_BLOCK -- ws2_32.h
441 dllmain.c -- threadlocal memory allocation / deallocation
446 /* lib/adns/src/adns.h XXX */
456 #define h_addr h_addr_list[0]
466 struct hostent defined in w32api/include/winsock2.h
469 void free_servent(struct servent
* s
) {
471 char* next
= s
->s_aliases
[0];
472 while(next
) { HFREE(next
); next
++; }
483 IN CONST CHAR FAR
* name
)
485 enum addr_type
{ GH_INVALID
, GH_IPV6
, GH_IPV4
, GH_RFC1123_DNS
};
486 typedef enum addr_type addr_type
;
490 DNS_STATUS dns_status
= {0};
491 /* include/WinDNS.h -- look up DNS_RECORD on MSDN */
496 PWINSOCK_THREAD_BLOCK p
= NtCurrentTeb()->WinSockData
;
499 WSASetLastError( WSANOTINITIALISED
);
503 check_hostent(&p
->Hostent
); /*XXX alloc_hostent*/
505 /* Hostname NULL - behave like gethostname */
507 ret
= gethostname(p
->Hostent
->h_name
, MAX_HOSTNAME_LEN
);
512 WSASetLastError( WSAHOST_NOT_FOUND
); //WSANO_DATA ??
516 /* Is it an IPv6 address? */
517 found
= strstr(name
, ":");
518 if( found
!= NULL
) {
523 /* Is it an IPv4 address? */
524 if (!isalpha(name
[0])) {
529 addr
= GH_RFC1123_DNS
;
531 /* Broken out in case we want to get fancy later */
535 WSASetLastError(STATUS_NOT_IMPLEMENTED
);
540 WSASetLastError(WSAEFAULT
);
544 /* Note: If passed an IP address, MSDN says that gethostbyname()
545 treats it as an unknown host.
546 This is different from the unix implementation. Use inet_addr()
550 /* DNS_TYPE_A: include/WinDNS.h */
551 /* DnsQuery -- lib/dnsapi/dnsapi/query.c */
552 dns_status
= DnsQuery_A ( name
, DNS_TYPE_A
, DNS_QUERY_STANDARD
,
553 0, /* extra dns servers */ &dp
, 0 );
555 if(dns_status
== 0) {
556 //ASSERT(dp->wType == DNS_TYPE_A);
557 //ASSERT(dp->wDataLength == sizeof(DNS_A_DATA));
560 curr
!= NULL
&& curr
->wType
!= DNS_TYPE_A
;
561 curr
= curr
->pNext
) {
562 WS_DbgPrint(MID_TRACE
,("wType: %i\n", curr
->wType
));
567 WS_DbgPrint(MID_TRACE
,("populating hostent\n"));
568 WS_DbgPrint(MID_TRACE
,("pName is (%s)\n", curr
->pName
));
569 populate_hostent(p
->Hostent
, (PCHAR
)curr
->pName
, curr
->Data
.A
);
570 DnsRecordListFree(dp
, DnsFreeRecordList
);
573 DnsRecordListFree(dp
, DnsFreeRecordList
);
577 WS_DbgPrint(MID_TRACE
,("Called DnsQuery, but host not found. Err: %i\n",
579 WSASetLastError(WSAHOST_NOT_FOUND
);
585 WSASetLastError(WSANO_RECOVERY
);
590 WSASetLastError(WSANO_RECOVERY
);
603 DWORD size
= namelen
;
605 int ret
= GetComputerNameExA(ComputerNameDnsHostname
, name
, &size
);
607 WSASetLastError(WSAEFAULT
);
610 name
[namelen
-1] = '\0';
617 * XXX arty -- Partial implementation pending a better one. This one will
618 * do for normal purposes.#include <ws2_32.h>
620 * Return the address of a static LPPROTOENT corresponding to the named
621 * protocol. These structs aren't very interesting, so I'm not too ashamed
622 * to have this function work on builtins for now.
629 IN CONST CHAR FAR
* name
)
631 static CHAR
*udp_aliases
= 0;
632 static PROTOENT udp
= { "udp", &udp_aliases
, 17 };
633 static CHAR
*tcp_aliases
= 0;
634 static PROTOENT tcp
= { "tcp", &tcp_aliases
, 6 };
635 if( !_stricmp( name
, "udp" ) ) {
637 } else if( !_stricmp( name
, "tcp" ) ) {
654 return (LPPROTOENT
)NULL
;
657 #define SKIPWS(ptr,act) \
658 {while(*ptr && isspace(*ptr)) ptr++; if(!*ptr) act;}
659 #define SKIPANDMARKSTR(ptr,act) \
660 {while(*ptr && !isspace(*ptr)) ptr++; \
661 if(!*ptr) {act;} else { *ptr = 0; ptr++; }}
664 static BOOL
DecodeServEntFromString( IN PCHAR ServiceString
,
665 OUT PCHAR
*ServiceName
,
666 OUT PCHAR
*PortNumberStr
,
667 OUT PCHAR
*ProtocolStr
,
669 IN DWORD MaxAlias
) {
672 WS_DbgPrint(MAX_TRACE
, ("Parsing service ent [%s]\n", ServiceString
));
674 SKIPWS(ServiceString
, return FALSE
);
675 *ServiceName
= ServiceString
;
676 SKIPANDMARKSTR(ServiceString
, return FALSE
);
677 SKIPWS(ServiceString
, return FALSE
);
678 *PortNumberStr
= ServiceString
;
679 SKIPANDMARKSTR(ServiceString
, ;);
681 while( *ServiceString
&& NAliases
< MaxAlias
- 1 ) {
682 SKIPWS(ServiceString
, break);
683 if( *ServiceString
) {
684 SKIPANDMARKSTR(ServiceString
, ;);
685 if( strlen(ServiceString
) ) {
686 WS_DbgPrint(MAX_TRACE
, ("Alias: %s\n", ServiceString
));
687 *Aliases
++ = ServiceString
;
694 *ProtocolStr
= strchr(*PortNumberStr
,'/');
695 if( !*ProtocolStr
) return FALSE
;
696 **ProtocolStr
= 0; (*ProtocolStr
)++;
698 WS_DbgPrint(MAX_TRACE
, ("Parsing done: %s %s %s %d\n",
699 *ServiceName
, *ProtocolStr
, *PortNumberStr
,
705 #define ADJ_PTR(p,b1,b2) p = (p - b1) + b2
714 IN CONST CHAR FAR
* name
,
715 IN CONST CHAR FAR
* proto
)
719 CHAR ServiceDBData
[BUFSIZ
] = { 0 };
720 PCHAR SystemDirectory
= ServiceDBData
; /* Reuse this stack space */
721 PCHAR ServicesFileLocation
= "\\drivers\\etc\\services";
722 PCHAR ThisLine
= 0, NextLine
= 0, ServiceName
= 0, PortNumberStr
= 0,
723 ProtocolStr
= 0, Comment
= 0;
724 PCHAR Aliases
[WS2_INTERNAL_MAX_ALIAS
] = { 0 };
725 UINT i
,SizeNeeded
= 0,
726 SystemDirSize
= sizeof(ServiceDBData
) - 1;
727 DWORD ReadSize
= 0, ValidData
= 0;
728 PWINSOCK_THREAD_BLOCK p
= NtCurrentTeb()->WinSockData
;
731 WSASetLastError( WSANOTINITIALISED
);
736 WSASetLastError( WSANO_RECOVERY
);
740 if( !GetSystemDirectoryA( SystemDirectory
, SystemDirSize
) ) {
741 WSASetLastError( WSANO_RECOVERY
);
742 WS_DbgPrint(MIN_TRACE
, ("Could not get windows system directory.\n"));
743 return NULL
; /* Can't get system directory */
746 strncat( SystemDirectory
, ServicesFileLocation
, SystemDirSize
);
748 ServicesFile
= CreateFileA( SystemDirectory
,
753 FILE_ATTRIBUTE_NORMAL
|
754 FILE_FLAG_SEQUENTIAL_SCAN
,
757 if( ServicesFile
== INVALID_HANDLE_VALUE
) {
758 WSASetLastError( WSANO_RECOVERY
);
762 /* Scan the services file ...
764 * We will read up to BUFSIZ bytes per pass, until the buffer does not
765 * contain a full line, then we will try to read more.
767 * We fall from the loop if the buffer does not have a line terminator.
772 ReadFile( ServicesFile
, ServiceDBData
+ ValidData
,
773 sizeof( ServiceDBData
) - ValidData
,
774 &ReadSize
, NULL
) ) {
775 ValidData
+= ReadSize
;
777 NextLine
= ThisLine
= ServiceDBData
;
779 /* Find the beginning of the next line */
780 while( NextLine
< ServiceDBData
+ ValidData
&&
781 *NextLine
!= '\r' && *NextLine
!= '\n' ) NextLine
++;
783 /* Zero and skip, so we can treat what we have as a string */
784 if( NextLine
>= ServiceDBData
+ ValidData
)
787 *NextLine
= 0; NextLine
++;
789 Comment
= strchr( ThisLine
, '#' );
790 if( Comment
) *Comment
= 0; /* Terminate at comment start */
792 if( DecodeServEntFromString( ThisLine
,
797 WS2_INTERNAL_MAX_ALIAS
) &&
798 !strcmp( ServiceName
, name
) &&
799 (proto
? !strcmp( ProtocolStr
, proto
) : TRUE
) ) {
801 WS_DbgPrint(MAX_TRACE
,("Found the service entry.\n"));
803 SizeNeeded
= sizeof(WINSOCK_GETSERVBYNAME_CACHE
) +
804 (NextLine
- ThisLine
);
808 /* Get rid of everything we read so far */
809 while( NextLine
<= ServiceDBData
+ ValidData
&&
810 isspace( *NextLine
) ) NextLine
++;
812 WS_DbgPrint(MAX_TRACE
,("About to move %d chars\n",
813 ServiceDBData
+ ValidData
- NextLine
));
815 memmove( ServiceDBData
, NextLine
,
816 ServiceDBData
+ ValidData
- NextLine
);
817 ValidData
-= NextLine
- ServiceDBData
;
818 WS_DbgPrint(MAX_TRACE
,("Valid bytes: %d\n", ValidData
));
821 /* This we'll do no matter what */
822 CloseHandle( ServicesFile
);
825 WS_DbgPrint(MAX_TRACE
,("Not found\n"));
826 WSASetLastError( WSANO_DATA
);
830 if( !p
->Getservbyname
|| p
->Getservbyname
->Size
< SizeNeeded
) {
831 /* Free previous getservbyname buffer, allocate bigger */
832 if( p
->Getservbyname
)
833 HeapFree(GlobalHeap
, 0, p
->Getservbyname
);
834 p
->Getservbyname
= HeapAlloc(GlobalHeap
, 0, SizeNeeded
);
835 if( !p
->Getservbyname
) {
836 WS_DbgPrint(MIN_TRACE
,("Couldn't allocate %d bytes\n",
838 WSASetLastError( WSATRY_AGAIN
);
841 p
->Getservbyname
->Size
= SizeNeeded
;
845 memmove( p
->Getservbyname
->Data
,
847 NextLine
- ThisLine
);
849 ADJ_PTR(ServiceName
,ThisLine
,p
->Getservbyname
->Data
);
850 ADJ_PTR(ProtocolStr
,ThisLine
,p
->Getservbyname
->Data
);
851 WS_DbgPrint(MAX_TRACE
,
852 ("ServiceName: %s, Protocol: %s\n", ServiceName
, ProtocolStr
));
854 for( i
= 0; Aliases
[i
]; i
++ ) {
855 ADJ_PTR(Aliases
[i
],ThisLine
,p
->Getservbyname
->Data
);
856 WS_DbgPrint(MAX_TRACE
,("Aliase %d: %s\n", i
, Aliases
[i
]));
859 memcpy(p
->Getservbyname
,Aliases
,sizeof(Aliases
));
861 /* Create the struct proper */
862 p
->Getservbyname
->ServerEntry
.s_name
= ServiceName
;
863 p
->Getservbyname
->ServerEntry
.s_aliases
= p
->Getservbyname
->Aliases
;
864 p
->Getservbyname
->ServerEntry
.s_port
= htons(atoi(PortNumberStr
));
865 p
->Getservbyname
->ServerEntry
.s_proto
= ProtocolStr
;
867 return &p
->Getservbyname
->ServerEntry
;
878 IN CONST CHAR FAR
* proto
)
882 CHAR ServiceDBData
[BUFSIZ
] = { 0 };
883 PCHAR SystemDirectory
= ServiceDBData
; /* Reuse this stack space */
884 PCHAR ServicesFileLocation
= "\\drivers\\etc\\services";
885 PCHAR ThisLine
= 0, NextLine
= 0, ServiceName
= 0, PortNumberStr
= 0,
886 ProtocolStr
= 0, Comment
= 0;
887 PCHAR Aliases
[WS2_INTERNAL_MAX_ALIAS
] = { 0 };
888 UINT i
,SizeNeeded
= 0,
889 SystemDirSize
= sizeof(ServiceDBData
) - 1;
890 DWORD ReadSize
= 0, ValidData
= 0;
891 PWINSOCK_THREAD_BLOCK p
= NtCurrentTeb()->WinSockData
;
894 WSASetLastError( WSANOTINITIALISED
);
899 WSASetLastError( WSANO_RECOVERY
);
903 if( !GetSystemDirectoryA( SystemDirectory
, SystemDirSize
) ) {
904 WSASetLastError( WSANO_RECOVERY
);
905 WS_DbgPrint(MIN_TRACE
, ("Could not get windows system directory.\n"));
906 return NULL
; /* Can't get system directory */
909 strncat( SystemDirectory
, ServicesFileLocation
, SystemDirSize
);
911 ServicesFile
= CreateFileA( SystemDirectory
,
916 FILE_ATTRIBUTE_NORMAL
|
917 FILE_FLAG_SEQUENTIAL_SCAN
,
920 if( ServicesFile
== INVALID_HANDLE_VALUE
) {
921 WSASetLastError( WSANO_RECOVERY
);
925 /* Scan the services file ...
927 * We will read up to BUFSIZ bytes per pass, until the buffer does not
928 * contain a full line, then we will try to read more.
930 * We fall from the loop if the buffer does not have a line terminator.
935 ReadFile( ServicesFile
, ServiceDBData
+ ValidData
,
936 sizeof( ServiceDBData
) - ValidData
,
937 &ReadSize
, NULL
) ) {
938 ValidData
+= ReadSize
;
940 NextLine
= ThisLine
= ServiceDBData
;
942 /* Find the beginning of the next line */
943 while( NextLine
< ServiceDBData
+ ValidData
&&
944 *NextLine
!= '\r' && *NextLine
!= '\n' ) NextLine
++;
946 /* Zero and skip, so we can treat what we have as a string */
947 if( NextLine
>= ServiceDBData
+ ValidData
)
950 *NextLine
= 0; NextLine
++;
952 Comment
= strchr( ThisLine
, '#' );
953 if( Comment
) *Comment
= 0; /* Terminate at comment start */
955 if( DecodeServEntFromString( ThisLine
,
960 WS2_INTERNAL_MAX_ALIAS
) &&
961 (htons(atoi( PortNumberStr
)) == port
) &&
962 (proto
? !strcmp( ProtocolStr
, proto
) : TRUE
) ) {
964 WS_DbgPrint(MAX_TRACE
,("Found the port entry.\n"));
967 SizeNeeded
= sizeof(WINSOCK_GETSERVBYPORT_CACHE
) +
968 (NextLine
- ThisLine
);
972 /* Get rid of everything we read so far */
973 while( NextLine
<= ServiceDBData
+ ValidData
&&
974 isspace( *NextLine
) ) NextLine
++;
976 WS_DbgPrint(MAX_TRACE
,("About to move %d chars\n",
977 ServiceDBData
+ ValidData
- NextLine
));
979 memmove( ServiceDBData
, NextLine
,
980 ServiceDBData
+ ValidData
- NextLine
);
981 ValidData
-= NextLine
- ServiceDBData
;
982 WS_DbgPrint(MAX_TRACE
,("Valid bytes: %d\n", ValidData
));
985 /* This we'll do no matter what */
986 CloseHandle( ServicesFile
);
989 WS_DbgPrint(MAX_TRACE
,("Not found\n"));
990 WSASetLastError( WSANO_DATA
);
994 if( !p
->Getservbyport
|| p
->Getservbyport
->Size
< SizeNeeded
) {
995 /* Free previous getservbyport buffer, allocate bigger */
996 if( p
->Getservbyport
)
997 HeapFree(GlobalHeap
, 0, p
->Getservbyport
);
998 p
->Getservbyport
= HeapAlloc(GlobalHeap
, 0, SizeNeeded
);
999 if( !p
->Getservbyport
) {
1000 WS_DbgPrint(MIN_TRACE
,("Couldn't allocate %d bytes\n",
1002 WSASetLastError( WSATRY_AGAIN
);
1005 p
->Getservbyport
->Size
= SizeNeeded
;
1008 memmove( p
->Getservbyport
->Data
,
1010 NextLine
- ThisLine
);
1012 ADJ_PTR(PortNumberStr
,ThisLine
,p
->Getservbyport
->Data
);
1013 ADJ_PTR(ProtocolStr
,ThisLine
,p
->Getservbyport
->Data
);
1014 WS_DbgPrint(MAX_TRACE
,
1015 ("Port Number: %s, Protocol: %s\n", PortNumberStr
, ProtocolStr
));
1017 for( i
= 0; Aliases
[i
]; i
++ ) {
1018 ADJ_PTR(Aliases
[i
],ThisLine
,p
->Getservbyport
->Data
);
1019 WS_DbgPrint(MAX_TRACE
,("Aliases %d: %s\n", i
, Aliases
[i
]));
1022 memcpy(p
->Getservbyport
,Aliases
,sizeof(Aliases
));
1024 /* Create the struct proper */
1025 p
->Getservbyport
->ServerEntry
.s_name
= ServiceName
;
1026 p
->Getservbyport
->ServerEntry
.s_aliases
= p
->Getservbyport
->Aliases
;
1027 p
->Getservbyport
->ServerEntry
.s_port
= port
;
1028 p
->Getservbyport
->ServerEntry
.s_proto
= ProtocolStr
;
1030 WS_DbgPrint(MID_TRACE
,("s_name: %s\n", ServiceName
));
1032 return &p
->Getservbyport
->ServerEntry
;
1043 IN CONST CHAR FAR
* cp
)
1045 * FUNCTION: Converts a string containing an IPv4 address to an unsigned long
1047 * cp = Pointer to string with address to convert
1049 * Binary representation of IPv4 address, or INADDR_NONE
1061 if (strcmp(p
, " ") == 0)
1064 for (i
= 0; i
<= 3; i
++) {
1065 u
+= (strtoul(p
, &p
, 0) << (i
* 8));
1091 p
= ((PWINSOCK_THREAD_BLOCK
)NtCurrentTeb()->WinSockData
)->Intoa
;
1092 _itoa(in
.S_un
.S_addr
& 0xFF, b
, 10);
1094 _itoa((in
.S_un
.S_addr
>> 8) & 0xFF, b
, 10);
1097 _itoa((in
.S_un
.S_addr
>> 16) & 0xFF, b
, 10);
1100 _itoa((in
.S_un
.S_addr
>> 24) & 0xFF, b
, 10);
1103 return (CHAR FAR
*)p
;
1112 WSAAsyncGetHostByAddr(
1115 IN CONST CHAR FAR
* addr
,
1132 WSAAsyncGetHostByName(
1135 IN CONST CHAR FAR
* name
,
1150 WSAAsyncGetProtoByName(
1153 IN CONST CHAR FAR
* name
,
1168 WSAAsyncGetProtoByNumber(
1185 WSAAsyncGetServByName(
1188 IN CONST CHAR FAR
* name
,
1189 IN CONST CHAR FAR
* proto
,
1204 WSAAsyncGetServByPort(
1208 IN CONST CHAR FAR
* proto
,