windows-nt/Source/XPSP1/NT/net/layer2svc/zeroconf/cmdtool/wzctool.c
2020-09-26 16:20:57 +08:00

99 lines
2.2 KiB
C

#include <precomp.h>
#include "ErrCtrl.h"
#include "wzcutil.h"
#include "cmde.h"
#include "cmdq.h"
#include "cmds.h"
#include "cmdr.h"
// define the command handler prototype
typedef void (*pfnCmdHandler)(int argc, char *argv[]);
// dispatch the command
void cmdDispatch(int argc, char *argv[], pfnCmdHandler pCommand)
{
if (argc >= 1 && _stricmp(argv[0], "any") == 0)
{
DWORD rpcStatus = RPC_S_OK;
INTFS_KEY_TABLE IntfsTable;
char * origIntf = argv[0];
IntfsTable.dwNumIntfs = 0;
IntfsTable.pIntfs = NULL;
rpcStatus = WZCEnumInterfaces(NULL, &IntfsTable);
if (rpcStatus != RPC_S_OK)
{
printf("retrieving intf list failed with rpcStatus=%d.\n", rpcStatus);
}
else
{
UINT i;
CHAR szGuid[64] = "";
// print GUIDs
for (i = 0; i < IntfsTable.dwNumIntfs; i++)
{
WideCharToMultiByte(
CP_ACP,
0,
IntfsTable.pIntfs[i].wszGuid,
min(wcslen(IntfsTable.pIntfs[i].wszGuid), 64),
szGuid,
64,
NULL,
NULL);
argv[0] = szGuid;
printf("~~~~~~~~~~~~~~~~~~~ %s\n", argv[0]);
pCommand(argc, argv);
printf("\n");
// free the GUID after being printed
RpcFree(IntfsTable.pIntfs[i].wszGuid);
}
// free table of pointers to GUIDs
RpcFree(IntfsTable.pIntfs);
}
argv[0] = origIntf;
}
else
{
pCommand(argc, argv);
}
}
void _cdecl main(int argc, char *argv[])
{
if (argc < 2)
{
printf("usage: wzctool {e|q|s|r}\n");
exit(-1);
}
switch(argv[1][0])
{
case 'e':
case 'E':
cmdE(argc-2, argv+2);
break;
case 'q':
case 'Q':
cmdDispatch(argc-2, argv+2, cmdQ);
break;
case 's':
case 'S':
cmdDispatch(argc-2, argv+2, cmdS);
break;
case 'r':
case 'R':
cmdDispatch(argc-2, argv+2, cmdR);
break;
default:
printf("usage: wzctool {e|q|s|r}\n");
}
}