xref: /reactos/dll/win32/rasadhlp/winsock.c (revision 4561998a)
1 /*
2  * COPYRIGHT:   See COPYING in the top level directory
3  * PROJECT:     ReactOS Winsock 2 SPI
4  * FILE:        lib/mswsock/lib/init.c
5  * PURPOSE:     DLL Initialization
6  */
7 
8 #include "precomp.h"
9 
10 #include <winnls.h>
11 #include <nsp_dns.h>
12 
13 /* FUNCTIONS *****************************************************************/
14 
15 /*
16  * @implemented
17  */
18 BOOL
19 WINAPI
20 WSAttemptAutodialAddr(IN CONST SOCKADDR FAR *Name,
21                       IN INT NameLength)
22 {
23     PSOCKADDR_IN Ip = (PSOCKADDR_IN)Name;
24     PSOCKADDR_NB NetBios = (PSOCKADDR_NB)Name;
25     AUTODIAL_ADDR AutodialAddress;
26 
27     /* Check the family type */
28     switch (Name->sa_family)
29     {
30         case AF_INET:
31             /* Normal IPv4, set the Autodial Address Data */
32             AutodialAddress.Family = AutoDialIp;
33             AutodialAddress.Ip4Address = Ip->sin_addr;
34             break;
35 
36         case AF_NETBIOS:
37             /* NetBIOS, set the Autodial Address Data*/
38             AutodialAddress.Family = AutoDialNetBios;
39             RtlCopyMemory(&AutodialAddress.NetBiosAddress,
40                           NetBios->snb_name,
41                           NETBIOS_NAME_LENGTH);
42             break;
43 
44         default:
45             /* Unsupported family type */
46             return FALSE;
47     }
48 
49     /* Call the public routine */
50     return AcsHlpAttemptConnection(&AutodialAddress);
51 }
52 
53 /*
54  * @implemented
55  */
56 BOOL
57 WINAPI
58 WSAttemptAutodialName(IN CONST LPWSAQUERYSETW Restrictions)
59 {
60     AUTODIAL_ADDR AutodialAddress;
61     CHAR AnsiIp[17];
62     LPGUID Guid = Restrictions->lpServiceClassId;
63 
64     /* Make sure we actually have a name */
65     if (!Restrictions->lpszServiceInstanceName) return FALSE;
66 
67     /* Check if this is the Hostname GUID */
68     if (!memcmp(Guid, &HostnameGuid, sizeof(GUID)))
69     {
70         /* It is. Set up the Autodial Address Data */
71         AutodialAddress.Family = AutoDialIpHost;
72         WideCharToMultiByte(CP_ACP,
73                             0,
74                             Restrictions->lpszServiceInstanceName,
75                             -1,
76                             AutodialAddress.HostName,
77                             INTERNET_MAX_PATH_LENGTH - 1,
78                             0,
79                             0);
80 
81         /* Call the public routine */
82         return AcsHlpAttemptConnection(&AutodialAddress);
83     }
84     else if (!memcmp(Guid, &AddressGuid, sizeof(GUID)))
85     {
86         /* It's actually the IP String GUID */
87         AutodialAddress.Family = AutoDialIp;
88 
89         /* Convert the IP String to ANSI and then convert it to IP */
90         WideCharToMultiByte(CP_ACP,
91                             0,
92                             Restrictions->lpszServiceInstanceName,
93                             -1,
94                             AnsiIp,
95                             sizeof(AnsiIp) - 1,
96                             0,
97                             0);
98         _strlwr(AnsiIp);
99         AutodialAddress.Ip4Address.S_un.S_addr = inet_addr(AnsiIp);
100 
101         /* Make sure the IP is valid */
102         if (AutodialAddress.Ip4Address.S_un.S_addr == -1) return FALSE;
103 
104         /* Call the public routine */
105         return AcsHlpAttemptConnection(&AutodialAddress);
106     }
107     else
108     {
109         /* Unknown GUID type */
110         return FALSE;
111     }
112 }
113 
114 /*
115  * @implemented
116  */
117 VOID
118 WINAPI
119 WSNoteSuccessfulHostentLookup(IN CONST CHAR FAR *Name,
120                               IN CONST ULONG Address)
121 {
122     AUTODIAL_ADDR AutodialAddress;
123     AUTODIAL_CONN AutodialConnection;
124 
125     /* Make sure there actually is a name */
126     if (!(Name) || !strlen(Name)) return;
127 
128     /* Setup the Address */
129     AutodialAddress.Family = AutoDialIpHost;
130     strcpy(AutodialAddress.HostName, Name);
131 
132     /* Setup the new connection */
133     AutodialConnection.Family = ConnectionIp;
134     AutodialConnection.Ip4Address = Address;
135     AcsHlpNoteNewConnection(&AutodialAddress, &AutodialConnection);
136 }
137