mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
379 lines
7.8 KiB
379 lines
7.8 KiB
/*++
|
|
|
|
Copyright (c) 1994 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
discover.c
|
|
|
|
Abstract:
|
|
|
|
Contains code that implements the service location apis.
|
|
|
|
Author:
|
|
|
|
Madan Appiah (madana) 15-May-1995
|
|
|
|
Environment:
|
|
|
|
User Mode - Win32
|
|
|
|
Revision History:
|
|
MuraliK 11-July-1995 Extended to discover any service besides Gateway
|
|
|
|
--*/
|
|
|
|
#include <windows.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <svcloc.h>
|
|
#include <string.h>
|
|
|
|
// consists of information map from service name to other details
|
|
typedef struct _SERVICE_INFO {
|
|
LPCSTR pszName;
|
|
ULONGLONG ulMask;
|
|
} SERVICE_INFO;
|
|
|
|
SERVICE_INFO g_Services[] = {
|
|
#if 0
|
|
{ "gopher", INET_GOPHER_SERVICE},
|
|
{ "http", INET_W3_SERVICE},
|
|
{ "w3", INET_W3_SERVICE},
|
|
{ "ftp", INET_FTP_SERVICE},
|
|
{ "gate", INET_GATEWAY_SERVICE},
|
|
{ "msn", INET_MSN_SERVICE}
|
|
#else
|
|
// using new service masks
|
|
{ "ftp", INET_FTP_SVCLOC_ID},
|
|
{ "gopher", INET_GOPHER_SVCLOC_ID},
|
|
{ "w3", INET_W3_SVCLOC_ID},
|
|
|
|
#if 0
|
|
// what to do with these?
|
|
{ INET_MW3_SVCLOC_ID},
|
|
{ INET_MFTP_SVCLOC_ID},
|
|
#endif
|
|
|
|
#endif
|
|
};
|
|
|
|
|
|
|
|
#define NUM_SERVICES ( sizeof(g_Services)/ sizeof( SERVICE_INFO))
|
|
|
|
|
|
ULONGLONG GetUlMaskForService( IN LPSTR pszServiceName)
|
|
{
|
|
DWORD i;
|
|
|
|
for ( i = 0; i < NUM_SERVICES; i++) {
|
|
|
|
if ( !_stricmp( pszServiceName, g_Services[i].pszName)) {
|
|
|
|
return ( g_Services[i].ulMask);
|
|
}
|
|
}
|
|
|
|
return ( 0);
|
|
} // GetUlMaskForService()
|
|
|
|
VOID
|
|
PrintServerInfo(
|
|
DWORD Index,
|
|
LPINET_SERVER_INFO ServerInfo
|
|
)
|
|
{
|
|
DWORD j, k;
|
|
INET_VERSION_NUM VersionNumber;
|
|
WORD MajorVersion;
|
|
WORD MinorVersion;
|
|
|
|
printf("%ld. ServerName = %s \n ", Index+1, ServerInfo->ServerName );
|
|
printf(" ServicesMask = %lx \n", (DWORD)ServerInfo->ServicesMask );
|
|
printf(" NumServices = %ld \n", ServerInfo->Services.NumServices );
|
|
|
|
VersionNumber = ServerInfo->VersionNum;
|
|
MajorVersion = VersionNumber.Version.Major;
|
|
MinorVersion = VersionNumber.Version.Minor;
|
|
|
|
printf(" Version = %ld.%ld \n", MajorVersion, MinorVersion);
|
|
|
|
for( j = 0; j < ServerInfo->Services.NumServices; j++ ) {
|
|
|
|
LPINET_SERVICE_INFO ServiceInfo;
|
|
|
|
ServiceInfo = ServerInfo->Services.Services[j];
|
|
|
|
printf("\n");
|
|
printf(" %ld. ServiceMask = %ld \n",
|
|
j+1, (DWORD)ServiceInfo->ServiceMask );
|
|
|
|
printf(" ServiceState = %ld \n",
|
|
(DWORD)ServiceInfo->ServiceState );
|
|
|
|
printf(" ServiceComment = %s \n",
|
|
(DWORD)ServiceInfo->ServiceComment );
|
|
|
|
printf(" NumBindings = %ld \n",
|
|
ServiceInfo->Bindings.NumBindings );
|
|
|
|
for( k = 0; k < ServiceInfo->Bindings.NumBindings; k++) {
|
|
|
|
LPINET_BIND_INFO BindInfo;
|
|
|
|
BindInfo = &ServiceInfo->Bindings.BindingsInfo[k];
|
|
|
|
printf(" %ld. Bind (%ld) = %s\n",
|
|
k+1,
|
|
BindInfo->Length,
|
|
(LPWSTR)BindInfo->BindData );
|
|
}
|
|
|
|
}
|
|
printf("\n");
|
|
|
|
return;
|
|
}
|
|
|
|
VOID
|
|
PrintServersInfoList( IN LPINET_SERVERS_LIST pServersList)
|
|
{
|
|
DWORD i;
|
|
|
|
for( i = 0; i < pServersList->NumServers; i++ ) {
|
|
|
|
PrintServerInfo( i, pServersList->Servers[i] );
|
|
}
|
|
|
|
return;
|
|
} // PrintServersInfoList()
|
|
|
|
|
|
VOID
|
|
PrintUsageMessage(IN LPCSTR pszProgName)
|
|
{
|
|
int i;
|
|
|
|
printf( "Usage: %s [ -tTimeToWait] [ -sServerName] { service-names }\n",
|
|
pszProgName);
|
|
|
|
printf("\t Services supported are:\n");
|
|
for (i = 0; i < NUM_SERVICES; i++) {
|
|
|
|
printf( "\t\t %s\n", g_Services[i].pszName);
|
|
}
|
|
|
|
} // PrintUsageMessage()
|
|
|
|
DWORD
|
|
DiscoverServerInfo(
|
|
LPSTR ServerName,
|
|
ULONGLONG ulMask,
|
|
DWORD dwWaitTime
|
|
)
|
|
{
|
|
DWORD Error;
|
|
LPINET_SERVER_INFO ServerInfo = NULL;
|
|
|
|
if( dwWaitTime == 0 ) {
|
|
|
|
Error = INetGetServerInfo(
|
|
ServerName,
|
|
ulMask,
|
|
SVC_DEFAULT_WAIT_TIME,
|
|
&ServerInfo );
|
|
} else {
|
|
|
|
Error = INetGetServerInfo(
|
|
ServerName,
|
|
ulMask,
|
|
0,
|
|
&ServerInfo );
|
|
|
|
if( (Error != ERROR_BAD_NETPATH ) && (Error != ERROR_SUCCESS) ) {
|
|
return( Error );
|
|
}
|
|
|
|
//
|
|
// display server info if it is found.
|
|
//
|
|
|
|
if( ServerInfo != NULL ) {
|
|
|
|
//
|
|
// display server info.
|
|
//
|
|
|
|
PrintServerInfo( 0, ServerInfo );
|
|
INetFreeServerInfo( &ServerInfo );
|
|
return( ERROR_SUCCESS );
|
|
}
|
|
|
|
//
|
|
// wait for server response.
|
|
//
|
|
|
|
Sleep( dwWaitTime * 1000 );
|
|
|
|
Error = INetGetServerInfo(
|
|
ServerName,
|
|
ulMask,
|
|
0,
|
|
&ServerInfo );
|
|
}
|
|
|
|
if( Error != ERROR_SUCCESS ) {
|
|
return( Error );
|
|
}
|
|
|
|
if( ServerInfo != NULL ) {
|
|
PrintServerInfo( 0, ServerInfo );
|
|
}
|
|
else {
|
|
printf( "INetGetServerInfo found no relevant servers\n");
|
|
}
|
|
|
|
//
|
|
// free server info structure.
|
|
//
|
|
|
|
INetFreeServerInfo( &ServerInfo );
|
|
return( ERROR_SUCCESS );
|
|
}
|
|
|
|
DWORD
|
|
DiscoverInetServers(
|
|
ULONGLONG ulMask,
|
|
DWORD dwWaitTime
|
|
)
|
|
{
|
|
DWORD Error;
|
|
LPINET_SERVERS_LIST ServersList = NULL;
|
|
|
|
if( dwWaitTime == 0 ) {
|
|
|
|
Error = INetDiscoverServers(
|
|
ulMask,
|
|
SVC_DEFAULT_WAIT_TIME,
|
|
&ServersList );
|
|
} else {
|
|
|
|
Error = INetDiscoverServers(
|
|
ulMask,
|
|
0,
|
|
&ServersList );
|
|
|
|
if( Error != ERROR_SUCCESS ) {
|
|
return( Error );
|
|
}
|
|
|
|
//
|
|
// ignore first enum, must have zero entry.
|
|
//
|
|
|
|
INetFreeDiscoverServersList( &ServersList );
|
|
|
|
Sleep( dwWaitTime * 1000 );
|
|
|
|
Error = INetDiscoverServers(
|
|
ulMask,
|
|
0,
|
|
&ServersList );
|
|
}
|
|
|
|
if( Error != ERROR_SUCCESS ) {
|
|
return( Error );
|
|
}
|
|
|
|
//
|
|
// list server info.
|
|
//
|
|
|
|
if ( ServersList->NumServers != 0) {
|
|
|
|
PrintServersInfoList( ServersList );
|
|
} else {
|
|
|
|
printf( "INetDiscoverServers() found no relevant servers\n");
|
|
}
|
|
|
|
//
|
|
// free server info structure.
|
|
//
|
|
|
|
INetFreeDiscoverServersList( &ServersList );
|
|
return( ERROR_SUCCESS );
|
|
}
|
|
|
|
VOID __cdecl
|
|
main(
|
|
int argc,
|
|
char *argv[]
|
|
)
|
|
{
|
|
DWORD Error;
|
|
ULONGLONG ulMask = 0;
|
|
int iArgs = 1;
|
|
DWORD dwWaitTime = 0;
|
|
LPSTR ServerName = NULL;
|
|
|
|
while ( argv[iArgs] != NULL ){
|
|
|
|
if( argv[iArgs][0] == '-' ) {
|
|
|
|
switch ( argv[iArgs][1] ) {
|
|
case 't':
|
|
// get the wait time
|
|
dwWaitTime = strtoul( argv[iArgs] + 2, NULL, 0);
|
|
break;
|
|
|
|
case 's':
|
|
// get the server name.
|
|
ServerName = argv[iArgs] + 2;
|
|
break;
|
|
|
|
default:
|
|
PrintUsageMessage(argv[0]);
|
|
exit(1);
|
|
}
|
|
}
|
|
|
|
iArgs++; // skip one more argument
|
|
}
|
|
|
|
//
|
|
// form the mask for all services
|
|
//
|
|
|
|
for ( iArgs = 1; iArgs < argc; iArgs++) {
|
|
|
|
ulMask = ulMask | GetUlMaskForService( argv[iArgs]);
|
|
} // for
|
|
|
|
if ( ulMask == 0) {
|
|
|
|
PrintUsageMessage(argv[0]);
|
|
exit(1);
|
|
}
|
|
|
|
if( ServerName != NULL ) {
|
|
Error = DiscoverServerInfo( ServerName, ulMask, dwWaitTime );
|
|
}
|
|
else {
|
|
Error = DiscoverInetServers( ulMask, dwWaitTime );
|
|
}
|
|
|
|
if( Error != ERROR_SUCCESS ) {
|
|
printf("%s failed with error, %ld.\n", argv[0], Error );
|
|
return;
|
|
}
|
|
|
|
printf( "Command completed successfully.\n" );
|
|
return;
|
|
|
|
} // main()
|
|
|
|
/*************************** End Of File **************************/
|
|
|
|
|