|
|
/*++
Copyright (c) 1996 Microsoft Corporation
MODULE NAME
winsock.c
ABSTRACT
This module contains support for the Winsock2 Autodial callout.
AUTHOR
Anthony Discolo (adiscolo) 15-May-1996
REVISION HISTORY
--*/
#define UNICODE
#define _UNICODE
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <stdlib.h>
#include <windows.h>
#include <acd.h>
#include <debug.h>
#include <winsock2.h>
#include <svcguid.h>
#include <wsipx.h>
#include <wsnetbs.h>
#include "autodial.h"
#define GuidEqual(g1, g2) RtlEqualMemory((g1), (g2), sizeof (GUID))
//
// GUIDs we know about.
//
GUID HostnameGuid = SVCID_INET_HOSTADDRBYNAME; GUID AddressGuid = SVCID_INET_HOSTADDRBYINETSTRING;
BOOL WSAttemptAutodialAddr( IN const struct sockaddr FAR *name, IN int namelen ) { struct sockaddr_in *sin; struct sockaddr_ipx *sipx; struct sockaddr_nb *snb; ACD_ADDR addr;
RtlZeroMemory(&addr, sizeof(ACD_ADDR));
//
// We only know about a few address families.
//
switch (name->sa_family) { case AF_INET: sin = (struct sockaddr_in *)name; addr.fType = ACD_ADDR_IP; addr.ulIpaddr = sin->sin_addr.s_addr; break; case AF_IPX: sipx = (struct sockaddr_ipx *)name; return FALSE; break; case AF_NETBIOS: snb = (struct sockaddr_nb *)name; addr.fType = ACD_ADDR_NB; RtlCopyMemory(&addr.cNetbios, snb->snb_name, NETBIOS_NAME_LENGTH); break; default: return FALSE; }
return AcsHlpAttemptConnection(&addr); } // WSAttemptAutodialAddr
BOOL WSAttemptAutodialName( IN const LPWSAQUERYSETW lpqsRestrictions ) { ACD_ADDR addr;
RtlZeroMemory(&addr, sizeof(ACD_ADDR));
//
// If there is no address, then
// we're done.
//
if (lpqsRestrictions->lpszServiceInstanceName == NULL) return FALSE;
if (GuidEqual(lpqsRestrictions->lpServiceClassId, &HostnameGuid)) { //
// This is a hostname.
//
addr.fType = ACD_ADDR_INET; if (!WideCharToMultiByte( CP_ACP, 0, lpqsRestrictions->lpszServiceInstanceName, -1, addr.szInet, ACD_ADDR_INET_LEN - 1, 0, 0)) { return FALSE; } return AcsHlpAttemptConnection(&addr); } else if (GuidEqual(lpqsRestrictions->lpServiceClassId, &AddressGuid)) { CHAR szIpAddress[17];
//
// This is an IP address.
//
addr.fType = ACD_ADDR_IP; if (!WideCharToMultiByte( CP_ACP, 0, lpqsRestrictions->lpszServiceInstanceName, -1, szIpAddress, sizeof (szIpAddress) - 1, 0, 0)) { return FALSE; }
_strlwr(szIpAddress); addr.ulIpaddr = inet_addr(szIpAddress); if (addr.ulIpaddr == INADDR_NONE) return FALSE; return AcsHlpAttemptConnection(&addr); }
return FALSE; } // WSAttemptAutodialName
VOID WSNoteSuccessfulHostentLookup( IN const char FAR *name, IN const ULONG ipaddr ) { ACD_ADDR addr; ACD_ADAPTER adapter;
//
// If there is no address, then
// we're done.
//
if (name == NULL || !strlen(name)) return;
addr.fType = ACD_ADDR_INET; strcpy((PCHAR)&addr.szInet, name); adapter.fType = ACD_ADAPTER_IP; adapter.ulIpaddr = ipaddr; AcsHlpNoteNewConnection(&addr, &adapter); } // WSNoteSuccessfulHostentLookup
|