windows-nt/Source/XPSP1/NT/net/rras/netsh/ip/sample/samplegetopt.c

585 lines
17 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1999, Microsoft Corporation
Module Name:
sample\samplegetopt.c
Abstract:
The file contains functions to handle SAMPLE commands.
All command handlers take the following parameters...
pwszMachineName
*ppwcArguments argument array
dwCurrentIndex ppwcArguments[dwCurrentIndex] is the first argument
dwArgCount ppwcArguments[dwArgCount - 1] is the last argument
dwFlags
hMibServer
*pbDone
The handlers return the following values
Success...
NO_ERROR command succeeded, don't display another message.
ERROR_OKAY command succeeded, display "Ok." message.
Failure...
ERROR_SUPPRESS_OUTPUT command failed, don't display another message.
ERROR_SHOW_USAGE display extended help for the command.
ERROR_INVALID_SYNTAX display invalid syntax message and extended help.
The command handlers call the following function to parse arguments
PreprocessCommand(
IN HANDLE hModule, // handle passed to DllMain
IN PCHAR *ppwcArguments, // argument array
IN DWORD dwCurrentIndex, // ppwcArguments[dwCurrentIndex]: first
IN DWORD dwArgCount, // ppwcArguments[dwArgCount-1] : last
IN TAG_TYPE *pttTags, // legal tags
IN DWORD dwTagCount, // # entries in pttTags
IN DWORD dwMinArgs, // min # arguments required
IN DWORD dwMaxArgs, // max # arguments required
OUT DWORD *pdwTagType // output
)
The preprocessor performs the following functions
. ensures the number of tags present is valid.
. ensures there are no duplicate or unrecognized tags.
. ensures every 'required' tag is present.
. leaves the tag index of each argument in pdwTagType.
. removes 'tag=' from each argument.
For tags that take a specific set of values, this function is called
MatchEnumTag(
IN HANDLE hModule, // handle passed to DllMain
IN LPWSTR pwcArgument,// argument to process
IN DWORD dwNumValues,// number of possible values
IN PTOKEN_VALUE pEnumTable, // array of possible values
OUT PDWORD pdwValue // output
)
This performs the following functions
. matches argument with the set of values specified.
. returns corresponding value.
--*/
#include "precomp.h"
#pragma hdrstop
DWORD
WINAPI
HandleSampleSetGlobal(
IN LPCWSTR pwszMachineName,
IN OUT LPWSTR *ppwcArguments,
IN DWORD dwCurrentIndex,
IN DWORD dwArgCount,
IN DWORD dwFlags,
IN MIB_SERVER_HANDLE hMibServer,
IN BOOL *pbDone
)
/*++
Routine Description:
Gets options for SET GLOBAL
--*/
{
DWORD dwErr = NO_ERROR;
TAG_TYPE pttTags[] =
{
{TOKEN_LOGLEVEL, FALSE, FALSE} // LOGLEVEL tag optional
};
DWORD pdwTagType[NUM_TAGS_IN_TABLE(pttTags)];
DWORD dwNumArg;
ULONG i;
IPSAMPLE_GLOBAL_CONFIG igcGlobalConfiguration;
DWORD dwBitVector = 0;
// SAMPLE should be installed for this command to complete
VerifyInstalled(MS_IP_SAMPLE, STRING_PROTO_SAMPLE);
// preprocess the command
dwErr = PreprocessCommand(g_hModule,
ppwcArguments,
dwCurrentIndex,
dwArgCount,
pttTags,
NUM_TAGS_IN_TABLE(pttTags),
0,
NUM_TAGS_IN_TABLE(pttTags),
pdwTagType);
if (dwErr isnot NO_ERROR)
return dwErr;
// process all arguments
dwNumArg = dwArgCount - dwCurrentIndex;
for (i = 0; i < dwNumArg; i++)
{
switch (pdwTagType[i])
{
case 0 :
{
// tag LOGLEVEL
DWORD dwLogLevel;
TOKEN_VALUE rgtvEnums[] =
{
{TOKEN_NONE, IPSAMPLE_LOGGING_NONE},
{TOKEN_ERROR, IPSAMPLE_LOGGING_ERROR},
{TOKEN_WARN, IPSAMPLE_LOGGING_WARN},
{TOKEN_INFO, IPSAMPLE_LOGGING_INFO}
};
dwErr = MatchEnumTag(g_hModule,
ppwcArguments[i + dwCurrentIndex],
NUM_TOKENS_IN_TABLE(rgtvEnums),
rgtvEnums,
&dwLogLevel);
if (dwErr isnot NO_ERROR)
{
dwErr = ERROR_INVALID_PARAMETER;
break;
}
igcGlobalConfiguration.dwLoggingLevel = dwLogLevel;
dwBitVector |= SAMPLE_LOG_MASK;
break;
}
default:
{
dwErr = ERROR_INVALID_SYNTAX;
break;
}
} // switch
if (dwErr isnot NO_ERROR)
break ;
} // for
// process error
if (dwErr isnot NO_ERROR)
{
ProcessError();
return dwErr;
}
// update SAMPLE global configuration
if (dwBitVector)
dwErr = SgcUpdate(&igcGlobalConfiguration, dwBitVector);
return (dwErr is NO_ERROR) ? ERROR_OKAY : dwErr ;
}
DWORD
WINAPI
HandleSampleShowGlobal(
IN LPCWSTR pwszMachine,
IN OUT LPWSTR *ppwcArguments,
IN DWORD dwCurrentIndex,
IN DWORD dwArgCount,
IN DWORD dwFlags,
IN LPCVOID pvData,
OUT BOOL *pbDone
)
/*++
Routine Description:
Gets options for SHOW GLOBAL
--*/
{
// SAMPLE should be installed for this command to complete
VerifyInstalled(MS_IP_SAMPLE, STRING_PROTO_SAMPLE);
// does not expect any arguments. report error if any specified.
if (dwCurrentIndex isnot dwArgCount)
return ERROR_INVALID_SYNTAX;
// show SAMPLE global configuration
return SgcShow(FORMAT_VERBOSE);
}
DWORD
GetInterfaceOptions(
IN PWCHAR *ppwcArguments,
IN DWORD dwCurrentIndex,
IN DWORD dwArgCount,
OUT PWCHAR pwszInterfaceGuid,
OUT PIPSAMPLE_IF_CONFIG piicNew,
OUT DWORD *pdwBitVector
)
/*++
Routine Description:
Gets options for SET INTERFACE and ADD INTERFACE.
Arguments:
pwszInterfaceGuid guid for the specified interface. Size of this
buffer should be
(MAX_INTERFACE_NAME_LEN+1)*sizeof(WCHAR)
piicNew configuration containing changed values
pdwBitVector which values have changed
--*/
{
DWORD dwErr = NO_ERROR;
TAG_TYPE pttTags[] =
{
{TOKEN_NAME, TRUE, FALSE}, // NAME tag required
{TOKEN_METRIC, FALSE, FALSE}, // METRIC tag optional
};
DWORD pdwTagType[NUM_TAGS_IN_TABLE(pttTags)];
DWORD dwNumArg;
DWORD dwBufferSize = MAX_INTERFACE_NAME_LEN + 1;
ULONG i;
// dwBufferSize is the size of the pwszInterfaceGuid buffer.
// All invocations of this api should pass in a
// (MAX_INTERFACE_NAME_LEN+1) element array of WCHARs as
// the pwszInterfaceGuid parameter.
dwBufferSize = (MAX_INTERFACE_NAME_LEN + 1)*sizeof(WCHAR);
// preprocess the command
dwErr = PreprocessCommand(g_hModule,
ppwcArguments,
dwCurrentIndex,
dwArgCount,
pttTags,
NUM_TAGS_IN_TABLE(pttTags),
1,
NUM_TAGS_IN_TABLE(pttTags),
pdwTagType);
if (dwErr isnot NO_ERROR)
return dwErr;
// process all arguments
dwNumArg = dwArgCount - dwCurrentIndex;
for (i = 0; i < dwNumArg; i++)
{
switch (pdwTagType[i])
{
case 0 :
{
// tag NAME
dwErr = InterfaceGuidFromName(
ppwcArguments[i+dwCurrentIndex],
pwszInterfaceGuid,
&dwBufferSize);
break;
}
case 1:
{
// tag METRIC
piicNew->ulMetric = wcstoul(ppwcArguments[i+dwCurrentIndex],
NULL,
10);
*pdwBitVector |= SAMPLE_IF_METRIC_MASK;
break;
}
default:
{
dwErr = ERROR_INVALID_SYNTAX;
break;
}
} // switch
if (dwErr isnot NO_ERROR)
break ;
} // for
// process error
if (dwErr isnot NO_ERROR)
ProcessError();
return dwErr;
}
DWORD
WINAPI
HandleSampleAddIf(
IN PWCHAR pwszMachineName,
IN PWCHAR *ppwcArguments,
IN DWORD dwCurrentIndex,
IN DWORD dwArgCount,
IN DWORD dwFlags,
IN MIB_SERVER_HANDLE hMibServer,
IN BOOL *pbDone
)
/*++
Routine Description:
Gets options for ADD INTERFACE
--*/
{
DWORD dwErr = NO_ERROR;
WCHAR pwszInterfaceGuid[MAX_INTERFACE_NAME_LEN + 1] = L"\0";
IPSAMPLE_IF_CONFIG iicNew;
DWORD dwBitVector = 0;
// SAMPLE should be installed for this command to complete
VerifyInstalled(MS_IP_SAMPLE, STRING_PROTO_SAMPLE);
// get optional parameters that are also being set
dwErr = GetInterfaceOptions(ppwcArguments,
dwCurrentIndex,
dwArgCount,
pwszInterfaceGuid,
&iicNew,
&dwBitVector);
if (dwErr isnot NO_ERROR)
return dwErr;
// make sure that the interface does not already exist in the config
if (IsInterfaceInstalled(pwszInterfaceGuid, MS_IP_SAMPLE))
{
DisplayError(g_hModule, EMSG_INTERFACE_EXISTS, pwszInterfaceGuid);
return ERROR_SUPPRESS_OUTPUT;
}
// add SAMPLE interface configuration
dwErr = SicUpdate(pwszInterfaceGuid, &iicNew, dwBitVector, TRUE);
return (dwErr is NO_ERROR) ? ERROR_OKAY : dwErr;
}
DWORD
WINAPI
HandleSampleDelIf(
IN PWCHAR pwszMachineName,
IN PWCHAR *ppwcArguments,
IN DWORD dwCurrentIndex,
IN DWORD dwArgCount,
IN DWORD dwFlags,
IN MIB_SERVER_HANDLE hMibServer,
IN BOOL *pbDone
)
/*++
Routine Description:
Gets options for DELETE INTERFACE
--*/
{
DWORD dwErr = NO_ERROR;
WCHAR pwszInterfaceGuid[MAX_INTERFACE_NAME_LEN + 1] = L"\0";
IPSAMPLE_IF_CONFIG iicNew;
DWORD dwBitVector = 0;
// SAMPLE should be installed for this command to complete
VerifyInstalled(MS_IP_SAMPLE, STRING_PROTO_SAMPLE);
// get interface name.
dwErr = GetInterfaceOptions(ppwcArguments,
dwCurrentIndex,
dwArgCount,
pwszInterfaceGuid,
&iicNew,
&dwBitVector);
if (dwErr isnot NO_ERROR)
return dwErr ;
if (dwBitVector) // ensure that no other option is set.
return ERROR_INVALID_SYNTAX;
// delete interface
dwErr = DeleteInterfaceConfiguration(pwszInterfaceGuid, MS_IP_SAMPLE);
return (dwErr is NO_ERROR) ? ERROR_OKAY : dwErr;
}
DWORD
WINAPI
HandleSampleSetIf(
IN PWCHAR pwszMachineName,
IN PWCHAR *ppwcArguments,
IN DWORD dwCurrentIndex,
IN DWORD dwArgCount,
IN DWORD dwFlags,
IN MIB_SERVER_HANDLE hMibServer,
IN BOOL *pbDone
)
/*++
Routine Description:
Gets options for SET INTERFACE
--*/
{
DWORD dwErr = NO_ERROR;
WCHAR pwszInterfaceGuid[MAX_INTERFACE_NAME_LEN + 1] = L"\0";
IPSAMPLE_IF_CONFIG iicNew;
DWORD dwBitVector = 0;
// SAMPLE should be installed for this command to complete
VerifyInstalled(MS_IP_SAMPLE, STRING_PROTO_SAMPLE);
// get parameters being set
dwErr = GetInterfaceOptions(ppwcArguments,
dwCurrentIndex,
dwArgCount,
pwszInterfaceGuid,
&iicNew,
&dwBitVector);
if (dwErr isnot NO_ERROR)
return dwErr;
// set SAMPLE interface configuration
dwErr = SicUpdate(pwszInterfaceGuid, &iicNew, dwBitVector, FALSE);
return (dwErr is NO_ERROR) ? ERROR_OKAY : dwErr;
}
DWORD
WINAPI
HandleSampleShowIf(
IN PWCHAR pwszMachineName,
IN PWCHAR *ppwcArguments,
IN DWORD dwCurrentIndex,
IN DWORD dwArgCount,
IN DWORD dwFlags,
IN MIB_SERVER_HANDLE hMibServer,
IN BOOL *pbDone
)
/*++
Routine Description:
Gets options for SHOW INTERFACE
--*/
{
DWORD dwErr = NO_ERROR;
WCHAR pwszInterfaceGuid[MAX_INTERFACE_NAME_LEN + 1] = L"\0";
IPSAMPLE_IF_CONFIG iicNew;
DWORD dwBitVector = 0;
// SAMPLE should be installed for this command to complete
VerifyInstalled(MS_IP_SAMPLE, STRING_PROTO_SAMPLE);
// no interface specified, show SAMPLE configuration for all interfaces
if (dwCurrentIndex is dwArgCount)
return SicShowAll(FORMAT_TABLE) ;
// get interface name.
dwErr = GetInterfaceOptions(ppwcArguments,
dwCurrentIndex,
dwArgCount,
pwszInterfaceGuid,
&iicNew,
&dwBitVector);
if (dwErr isnot NO_ERROR)
return dwErr ;
if (dwBitVector) // ensure that no other option is set.
return ERROR_INVALID_SYNTAX;
// show SAMPLE interface configuration
return SicShow(FORMAT_VERBOSE, pwszInterfaceGuid) ;
}
DWORD
WINAPI
HandleSampleInstall(
IN PWCHAR pwszMachineName,
IN PWCHAR *ppwcArguments,
IN DWORD dwCurrentIndex,
IN DWORD dwArgCount,
IN DWORD dwFlags,
IN MIB_SERVER_HANDLE hMibServer,
IN BOOL *pbDone
)
/*++
Routine Description:
Gets options for INSTALL
--*/
{
DWORD dwErr = NO_ERROR;
PBYTE pbGlobalConfiguration = NULL;
DWORD dwSize;
// no options expected for install command.
if (dwCurrentIndex isnot dwArgCount)
return ERROR_INVALID_SYNTAX;
do // breakout loop
{
dwErr = SgcMake(&pbGlobalConfiguration, &dwSize);
if (dwErr isnot NO_ERROR)
break;
// add SAMPLE global configuration
dwErr = SetGlobalConfiguration(MS_IP_SAMPLE,
pbGlobalConfiguration,
dwSize,
1);
if (dwErr isnot NO_ERROR)
break;
}while (FALSE);
if (pbGlobalConfiguration) FREE(pbGlobalConfiguration);
return (dwErr is NO_ERROR) ? ERROR_OKAY : dwErr;
}
DWORD
WINAPI
HandleSampleUninstall(
IN PWCHAR pwszMachineName,
IN PWCHAR *ppwcArguments,
IN DWORD dwCurrentIndex,
IN DWORD dwArgCount,
IN DWORD dwFlags,
IN MIB_SERVER_HANDLE hMibServer,
IN BOOL *pbDone
)
/*++
Routine Description:
Gets options for UNINSTALL
--*/
{
DWORD dwErr = NO_ERROR;
// no options expected for uninstall command.
if (dwCurrentIndex isnot dwArgCount)
return ERROR_INVALID_SYNTAX;
dwErr = DeleteProtocol(MS_IP_SAMPLE);
return (dwErr is NO_ERROR) ? ERROR_OKAY : dwErr;
}