Source code of Windows XP (NT5)
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

/*++
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 **************************/