windows-nt/Source/XPSP1/NT/net/rras/netsh/ipx/protocols/sapifs.c

1653 lines
49 KiB
C
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1995 Microsoft Corporation
Module Name:
sapifs.c
Abstract:
IPX Router Console Monitoring and Configuration tool.
SAP Interface configuration and monitoring.
Author:
Vadim Eydelman 06/07/1996
--*/
#include "precomp.h"
#pragma hdrstop
DWORD
MIBGetSapIf(
PWCHAR InterfaceNamew,
HANDLE hFile
);
DWORD
CfgGetSapIf (
PWCHAR InterfaceNameW,
HANDLE hFile
);
DWORD
MIBEnumSapIfs (
VOID
);
DWORD
CfgEnumSapIfs (
VOID
);
DWORD
CfgSetSapIf (
LPWSTR InterfaceNameW,
PULONG pAdminState OPTIONAL,
PULONG pAdvertise OPTIONAL,
PULONG pListen OPTIONAL,
PULONG pReply OPTIONAL,
PULONG pUpdateMode OPTIONAL,
PULONG pInterval OPTIONAL,
PULONG pAgeMultiplier OPTIONAL
);
DWORD
AdmSetSapIf (
LPWSTR InterfaceNameW,
PULONG pAdminState OPTIONAL,
PULONG pUpdateMode OPTIONAL,
PULONG pInterval OPTIONAL,
PULONG pAdvertise OPTIONAL,
PULONG pListen OPTIONAL,
PULONG pReply OPTIONAL,
PULONG pAgeMultiplier OPTIONAL
);
DWORD
GetSapClientIf (
PWCHAR InterfaceNameW,
UINT msg,
HANDLE hFile
);
DWORD
APIENTRY
HelpSapIf (
IN int argc,
IN WCHAR *argv[]
)
{
DisplayMessage (g_hModule, HLP_IPX_SAPIF);
return 0;
}
DWORD
APIENTRY
ShowSapIf (
IN int argc,
IN WCHAR *argv[],
IN HANDLE hFile
)
{
WCHAR IfName[ MAX_INTERFACE_NAME_LEN + 1 ];
DWORD rc, dwSize = sizeof(IfName);
if (argc < 1)
{
if (g_hMIBServer)
{
rc = MIBEnumSapIfs ();
if (rc == NO_ERROR)
{
rc = GetSapClientIf (
VAL_DIALINCLIENT,
MSG_CLIENT_SAPIF_MIB_TABLE_FMT,
NULL
);
}
else
{
goto EnumerateThroughCfg;
}
}
else
{
EnumerateThroughCfg:
rc = CfgEnumSapIfs ();
if (rc == NO_ERROR)
{
rc = GetSapClientIf(
VAL_DIALINCLIENT,
MSG_CLIENT_SAPIF_CFG_TABLE_FMT,
NULL
);
}
}
}
else
{
unsigned count;
#define InterfaceNameW argv[0]
count = wcslen( InterfaceNameW );
if ( !_wcsicmp( argv[0], VAL_DIALINCLIENT ) )
{
rc = GetSapClientIf(
VAL_DIALINCLIENT, MSG_CLIENT_SAPIF_CFG_SCREEN_FMT, hFile
);
}
else if ((count > 0) && (count <= MAX_INTERFACE_NAME_LEN))
{
if (g_hMIBServer)
{
//======================================
// Translate the Interface Name
//======================================
rc = IpmontrGetIfNameFromFriendlyName(
InterfaceNameW, IfName, &dwSize
);
if ( rc == NO_ERROR )
{
rc = MIBGetSapIf (IfName, hFile);
if (rc != NO_ERROR)
{
goto GetIfFromCfg;
}
}
else
{
if (!hFile) { DisplayError( g_hModule, rc ); }
}
}
else
{
GetIfFromCfg:
//======================================
// Translate the Interface Name
//======================================
rc = IpmontrGetIfNameFromFriendlyName(
InterfaceNameW, IfName, &dwSize
);
if ( rc == NO_ERROR )
{
rc = CfgGetSapIf (IfName, hFile);
}
else
{
if ( !hFile ) { DisplayError( g_hModule, rc ); }
}
}
}
else
{
if ( !hFile ) { DisplayIPXMessage (g_hModule, MSG_INVALID_INTERFACE_NAME); }
rc = ERROR_INVALID_PARAMETER;
}
}
return rc;
#undef InterfaceNameW
}
DWORD
APIENTRY
SetSapIf (
IN int argc,
IN WCHAR *argv[]
)
{
LPWSTR InterfaceNameW;
WCHAR IfName[ MAX_INTERFACE_NAME_LEN + 1 ];
DWORD rc, dwSize = sizeof(IfName);
if ( argc >= 1 )
{
unsigned count;
BOOLEAN client = FALSE;
#define InterfaceNameW argv[0]
if ( !_wcsicmp( argv[0], VAL_DIALINCLIENT ) )
{
client = TRUE;
}
else
{
count = wcslen (InterfaceNameW);
}
if (client || ((count > 0) && (count <= MAX_INTERFACE_NAME_LEN)))
{
int i;
unsigned n;
ULONG adminState, updateMode, interval, ageMultiplier,
advertise, listen, reply;
PULONG pAdminState = NULL, pUpdateMode = NULL, pInterval = NULL,
pAgeMultiplier = NULL, pAdvertise = NULL, pListen = NULL,
pReply = NULL;
for (i = 1; i < argc; i++)
{
if ( !_wcsicmp( argv[i], TOKEN_ADMINSTATE))
{
if ( (pAdminState == NULL) && (i < argc - 1) &&
!MatchEnumTag(g_hModule, argv[i+1], NUM_TOKENS_IN_TABLE( AdminStates ),
AdminStates, &adminState))
{
i += 1;
pAdminState = &adminState;
continue;
}
else
{
break;
}
}
if ( !_wcsicmp( argv[i], TOKEN_ADVERTISE ))
{
if ( (pAdvertise == NULL) && (i < argc - 1)&&
!MatchEnumTag (g_hModule, argv[i+1], NUM_TOKENS_IN_TABLE( AdminStates ),
AdminStates, &advertise))
{
i += 1;
pAdvertise = &advertise;
continue;
}
else
{
break;
}
}
if ( !_wcsicmp (argv[i], TOKEN_LISTEN ))
{
if ( (pListen == NULL) && (i < argc - 1) &&
!MatchEnumTag (g_hModule, argv[i+1], NUM_TOKENS_IN_TABLE( AdminStates ),
AdminStates, &listen))
{
i += 1;
pListen = &listen;
continue;
}
else
{
break;
}
}
if ( !_wcsicmp (argv[i], TOKEN_GNSREPLY ))
{
if ( (pReply == NULL) && (i < argc - 1) &&
!MatchEnumTag (g_hModule, argv[i+1], NUM_TOKENS_IN_TABLE( AdminStates ),
AdminStates, &reply))
{
i += 1;
pReply = &reply;
continue;
}
else
{
break;
}
}
if ( !_wcsicmp (argv[i], TOKEN_UPDATEMODE ))
{
if ( (pUpdateMode == NULL) && (i < argc - 1) &&
!MatchEnumTag (g_hModule, argv[i+1], NUM_TOKENS_IN_TABLE( UpdateModes ),
UpdateModes, &updateMode))
{
i += 1;
pUpdateMode = &updateMode;
continue;
}
else
{
break;
}
}
if ( !_wcsicmp (argv[i], TOKEN_INTERVAL ))
{
if ((pInterval == NULL)
&& (i < argc - 1)
&& (swscanf (argv[i+1], L"%ld%n", &interval, &n) == 1)
&& (n == wcslen(argv[i+1])))
{
i += 1;
pInterval = &interval;
continue;
}
else
{
break;
}
}
if ( !_wcsicmp (argv[i], TOKEN_AGEMULTIPLIER ))
{
if ((pAgeMultiplier == NULL)
&& (i < argc - 1)
&& (swscanf (argv[i+1], L"%ld%n", &ageMultiplier, &n) == 1)
&& (n == wcslen(argv[i+1])))
{
i += 1;
pAgeMultiplier = &ageMultiplier;
continue;
}
else
{
break;
}
}
if (pAdminState == NULL)
{
if ( !MatchEnumTag (g_hModule, argv[ i ], NUM_TOKENS_IN_TABLE( AdminStates ),
AdminStates, &adminState))
{
pAdminState = &adminState;
}
else
{
break;
}
}
else if (pAdvertise == NULL)
{
if ( !MatchEnumTag (g_hModule, argv[ i ], NUM_TOKENS_IN_TABLE( AdminStates ),
AdminStates, &advertise))
{
pAdvertise = &advertise;
}
else
{
break;
}
}
else if (pListen == NULL)
{
if ( !MatchEnumTag (g_hModule, argv[ i ], NUM_TOKENS_IN_TABLE( AdminStates ),
AdminStates, &listen))
{
pListen = &listen;
}
else
{
break;
}
}
else if (pReply == NULL)
{
if ( !MatchEnumTag (g_hModule, argv[ i ], NUM_TOKENS_IN_TABLE( AdminStates ),
AdminStates, &reply))
{
pReply = &reply;
}
else
{
break;
}
}
else if (pUpdateMode == NULL)
{
if ( !MatchEnumTag (g_hModule, argv[ i ], NUM_TOKENS_IN_TABLE( UpdateModes ),
UpdateModes, &updateMode))
{
pUpdateMode = &updateMode;
}
else
{
break;
}
}
else if (pInterval == NULL)
{
if ((swscanf (argv[i], L"%ld%n", &interval, &n) == 1)
&& (n == wcslen(argv[i])))
{
pInterval = &interval;
}
else
{
break;
}
}
else if (pAgeMultiplier == NULL)
{
if ((swscanf (argv[i], L"%ld%n", &ageMultiplier, &n) == 1)
&& (n == wcslen(argv[i])))
{
pAgeMultiplier = &ageMultiplier;
}
else
{
break;
}
}
else
{
break;
}
}
if ( i == argc )
{
if (!client)
{
DWORD rc2;
//======================================
// Translate the Interface Name
//======================================
rc = IpmontrGetIfNameFromFriendlyName(
InterfaceNameW, IfName, &dwSize
);
if ( rc == NO_ERROR )
{
rc2 = CfgSetSapIf(
IfName, pAdminState, pAdvertise, pListen, pReply,
pUpdateMode, pInterval, pAgeMultiplier
);
if (rc2 == NO_ERROR)
{
if (g_hMprAdmin)
{
rc = AdmSetSapIf(
IfName, pAdminState, pAdvertise, pListen,
pReply, pUpdateMode, pInterval,
pAgeMultiplier
);
}
}
else
{
rc = rc2;
}
}
else
{
DisplayError( g_hModule, rc );
}
}
else
{
rc = CfgSetSapIf(
NULL, pAdminState, pAdvertise, pListen, pReply,
pUpdateMode, pInterval, pAgeMultiplier
);
if (rc == NO_ERROR)
{
if (g_hMprAdmin)
{
rc = AdmSetSapIf(
NULL, pAdminState, pAdvertise, pListen, pReply,
pUpdateMode, pInterval, pAgeMultiplier
);
}
}
}
}
else
{
DisplayMessage (g_hModule, HLP_IPX_SAPIF);
rc = ERROR_INVALID_PARAMETER;
}
}
else
{
DisplayIPXMessage (g_hModule, MSG_INVALID_INTERFACE_NAME);
rc = ERROR_INVALID_PARAMETER;
}
}
else
{
DisplayMessage (g_hModule, HLP_IPX_SAPIF);
rc = ERROR_INVALID_PARAMETER;
}
return rc;
#undef InterfaceNameW
}
DWORD
MIBGetSapIf(
PWCHAR InterfaceNameW,
HANDLE hFile
)
{
DWORD rc;
DWORD sz;
SAP_MIB_GET_INPUT_DATA MibGetInputData;
PSAP_INTERFACE pIf;
WCHAR IfName[ MAX_INTERFACE_NAME_LEN + 1 ];
DWORD dwSize = sizeof(IfName);
MibGetInputData.TableId = SAP_INTERFACE_TABLE;
rc = GetIpxInterfaceIndex(
g_hMIBServer, InterfaceNameW, &MibGetInputData.InterfaceIndex
);
if (rc == NO_ERROR)
{
rc = MprAdminMIBEntryGet(
g_hMIBServer, PID_IPX, IPX_PROTOCOL_SAP, &MibGetInputData,
sizeof(SAP_MIB_GET_INPUT_DATA), (LPVOID * ) & pIf, &sz
);
if (rc == NO_ERROR)
{
PWCHAR buffer[6];
DWORD i;
//======================================
// Translate the Interface Name
//======================================
rc = IpmontrGetFriendlyNameFromIfName(
InterfaceNameW, IfName, &dwSize
);
if ( rc == NO_ERROR )
{
buffer[ 0 ] = GetEnumString(
g_hModule, pIf->SapIfInfo.AdminState,
NUM_TOKENS_IN_TABLE( AdminStates ),
AdminStates
);
buffer[ 1 ] = GetEnumString(
g_hModule, pIf->SapIfInfo.Supply,
NUM_TOKENS_IN_TABLE( AdminStates ),
AdminStates
);
buffer[ 2 ] = GetEnumString(
g_hModule, pIf->SapIfInfo.Listen,
NUM_TOKENS_IN_TABLE( AdminStates ),
AdminStates
);
buffer[ 3 ] = GetEnumString(
g_hModule, pIf->SapIfInfo.GetNearestServerReply,
NUM_TOKENS_IN_TABLE( AdminStates ),
AdminStates
);
buffer[ 4 ] = GetEnumString(
g_hModule, pIf->SapIfInfo.UpdateMode,
NUM_TOKENS_IN_TABLE( UpdateModes ),
UpdateModes
);
buffer[ 5 ] = GetEnumString(
g_hModule, pIf->SapIfStats.SapIfOperState,
NUM_TOKENS_IN_TABLE( OperStates ),
OperStates
);
if ( buffer [ 0 ] && buffer[ 1 ] && buffer[ 2 ] &&
buffer[ 3 ] && buffer[ 4 ] && buffer[ 5 ] )
{
if ( hFile )
{
DisplayMessageT(
DMP_IPX_SAP_SET_INTERFACE, IfName, buffer[ 0 ],
buffer[ 1 ], buffer[ 2 ], buffer[ 3 ],
buffer[ 4 ], pIf->SapIfInfo.PeriodicUpdateInterval,
pIf->SapIfInfo.AgeIntervalMultiplier
);
}
else
{
DisplayIPXMessage(
g_hModule, MSG_SAPIF_MIB_SCREEN_FMT,
IfName, buffer[ 0 ], buffer[ 1 ],
buffer[ 2 ], buffer[ 3 ], buffer[ 4 ],
pIf->SapIfInfo.PeriodicUpdateInterval,
pIf->SapIfInfo.AgeIntervalMultiplier,
buffer[5],
pIf->SapIfStats.SapIfInputPackets,
pIf->SapIfStats.SapIfOutputPackets
);
}
}
else
{
rc = ERROR_NOT_ENOUGH_MEMORY;
if ( !hFile ) { DisplayError( g_hModule, rc ); }
}
MprAdminMIBBufferFree (pIf);
}
else
{
if ( !hFile ) { DisplayError( g_hModule, rc ); }
}
}
else
{
if ( !hFile ) { DisplayError( g_hModule, rc); }
}
}
else
{
if ( !hFile ) { DisplayError( g_hModule, rc); }
}
return rc;
}
DWORD
CfgGetSapIf (
PWCHAR InterfaceNameW,
HANDLE hFile
)
{
DWORD rc;
DWORD sz;
HANDLE hIfCfg;
WCHAR IfName[ MAX_INTERFACE_NAME_LEN + 1 ];
DWORD dwSize = sizeof(IfName);
rc = MprConfigInterfaceGetHandle(
g_hMprConfig, InterfaceNameW, &hIfCfg
);
if (rc == NO_ERROR)
{
HANDLE hIfTrCfg;
rc = MprConfigInterfaceTransportGetHandle (
g_hMprConfig, hIfCfg, PID_IPX, &hIfTrCfg
);
if (rc == NO_ERROR)
{
LPBYTE pIfBlock;
rc = MprConfigInterfaceTransportGetInfo (
g_hMprConfig, hIfCfg, hIfTrCfg, &pIfBlock, &sz
);
if (rc == NO_ERROR)
{
PIPX_TOC_ENTRY pSapToc;
pSapToc = GetIPXTocEntry (
(PIPX_INFO_BLOCK_HEADER)pIfBlock,
IPX_PROTOCOL_SAP
);
if (pSapToc != NULL)
{
PSAP_IF_CONFIG pSapCfg;
PWCHAR buffer[5];
DWORD i;
pSapCfg = (PSAP_IF_CONFIG)
(pIfBlock + pSapToc->Offset);
//======================================
// Translate the Interface Name
//======================================
rc = IpmontrGetFriendlyNameFromIfName(
InterfaceNameW, IfName, &dwSize
);
if ( rc == NO_ERROR )
{
buffer[ 0 ] = GetEnumString(
g_hModule, pSapCfg->SapIfInfo.AdminState,
NUM_TOKENS_IN_TABLE( AdminStates ),
AdminStates
);
buffer[ 1 ] = GetEnumString(
g_hModule, pSapCfg->SapIfInfo.Supply,
NUM_TOKENS_IN_TABLE( AdminStates ),
AdminStates
);
buffer[ 2 ] = GetEnumString(
g_hModule, pSapCfg->SapIfInfo.Listen,
NUM_TOKENS_IN_TABLE( AdminStates ),
AdminStates
);
buffer[ 3 ] = GetEnumString(
g_hModule, pSapCfg->SapIfInfo.GetNearestServerReply,
NUM_TOKENS_IN_TABLE( AdminStates ),
AdminStates
);
buffer[ 4 ] = GetEnumString(
g_hModule, pSapCfg->SapIfInfo.UpdateMode,
NUM_TOKENS_IN_TABLE( UpdateModes ),
UpdateModes
);
if ( buffer [ 0 ] && buffer[ 1 ] && buffer[ 2 ] &&
buffer[ 3 ] && buffer[ 4 ] )
{
if ( hFile )
{
DisplayMessageT(
DMP_IPX_SAP_SET_INTERFACE, IfName, buffer[ 0 ],
buffer[ 1 ], buffer[ 2 ], buffer[ 3 ],
buffer[ 4 ], pSapCfg->SapIfInfo.PeriodicUpdateInterval,
pSapCfg->SapIfInfo.AgeIntervalMultiplier
);
}
else
{
DisplayIPXMessage(
g_hModule, MSG_SAPIF_CFG_SCREEN_FMT,
IfName, buffer[0], buffer[1], buffer[2],
buffer[3], buffer[4],
pSapCfg->SapIfInfo.PeriodicUpdateInterval,
pSapCfg->SapIfInfo.AgeIntervalMultiplier
);
}
}
else
{
rc = ERROR_NOT_ENOUGH_MEMORY;
if ( !hFile ) { DisplayError( g_hModule, rc ); }
}
}
else
{
if ( !hFile ) { DisplayError( g_hModule, rc ); }
}
}
else
{
if ( !hFile ) { DisplayIPXMessage (g_hModule, MSG_INTERFACE_INFO_CORRUPTED); }
rc = ERROR_INVALID_DATA;
}
}
else
{
if ( !hFile ) { DisplayError( g_hModule, rc); }
}
}
else
{
if ( !hFile ) { DisplayError( g_hModule, rc); }
}
}
else
{
if ( !hFile ) { DisplayError( g_hModule, rc); }
}
return rc;
}
DWORD
GetSapClientIf(
PWCHAR InterfaceName,
UINT msg,
HANDLE hFile
)
{
DWORD rc;
LPBYTE pClBlock;
HANDLE hTrCfg;
DWORD sz, i;
hTrCfg = NULL;
if (g_hMprAdmin)
{
rc = MprAdminTransportGetInfo(
g_hMprAdmin, PID_IPX, NULL, NULL, &pClBlock, &sz
);
if (rc == NO_ERROR)
{
NOTHING;
}
else
{
if ( !hFile ) { DisplayError( g_hModule, rc); }
goto GetFromCfg;
}
}
else
{
GetFromCfg:
rc = MprConfigTransportGetHandle (
g_hMprConfig, PID_IPX, &hTrCfg
);
if (rc == NO_ERROR)
{
rc = MprConfigTransportGetInfo (
g_hMprConfig, hTrCfg, NULL, NULL, &pClBlock, &sz, NULL
);
if (rc == NO_ERROR)
{
NOTHING;
}
else
{
if ( !hFile ) { DisplayError( g_hModule, rc); }
}
}
else
{
if ( !hFile ) { DisplayError( g_hModule, rc); }
}
}
if (rc == NO_ERROR)
{
PIPX_TOC_ENTRY pSapToc;
pSapToc = GetIPXTocEntry(
(PIPX_INFO_BLOCK_HEADER)pClBlock,
IPX_PROTOCOL_SAP
);
if (pSapToc != NULL)
{
PSAP_IF_CONFIG pSapCfg;
PWCHAR buffer[5];
pSapCfg = (PSAP_IF_CONFIG)
(pClBlock + pSapToc->Offset);
buffer[ 0 ] = GetEnumString(
g_hModule, pSapCfg->SapIfInfo.AdminState,
NUM_TOKENS_IN_TABLE( AdminStates ),
AdminStates
);
buffer[ 1 ] = GetEnumString(
g_hModule, pSapCfg->SapIfInfo.Supply,
NUM_TOKENS_IN_TABLE( AdminStates ),
AdminStates
);
buffer[ 2 ] = GetEnumString(
g_hModule, pSapCfg->SapIfInfo.Listen,
NUM_TOKENS_IN_TABLE( AdminStates ),
AdminStates
);
buffer[ 3 ] = GetEnumString(
g_hModule, pSapCfg->SapIfInfo.GetNearestServerReply,
NUM_TOKENS_IN_TABLE( AdminStates ),
AdminStates
);
buffer[ 4 ] = GetEnumString(
g_hModule, pSapCfg->SapIfInfo.UpdateMode,
NUM_TOKENS_IN_TABLE( UpdateModes ),
UpdateModes
);
switch (msg)
{
case MSG_CLIENT_SAPIF_MIB_TABLE_FMT:
case MSG_CLIENT_SAPIF_CFG_TABLE_FMT:
if ( buffer[ 4 ] && buffer[ 0 ] )
{
DisplayIPXMessage(
g_hModule, msg, InterfaceName, buffer[ 4 ], buffer[ 0 ]
);
}
else
{
rc = ERROR_NOT_ENOUGH_MEMORY;
if ( !hFile ) { DisplayError( g_hModule, rc ); }
}
break;
case MSG_CLIENT_SAPIF_MIB_SCREEN_FMT:
case MSG_CLIENT_SAPIF_CFG_SCREEN_FMT:
if ( buffer[ 0 ] && buffer[ 1 ] && buffer[ 2 ] && buffer[ 3 ] &&
buffer[ 4 ] )
{
if ( hFile )
{
DisplayMessageT(
DMP_IPX_SAP_SET_INTERFACE, InterfaceName, buffer[ 0 ],
buffer[ 1 ], buffer[ 2 ], buffer[ 3 ],
buffer[ 4 ], pSapCfg->SapIfInfo.PeriodicUpdateInterval,
pSapCfg->SapIfInfo.AgeIntervalMultiplier
);
}
else
{
DisplayIPXMessage(
g_hModule, msg, InterfaceName,
buffer[0], buffer[1], buffer[2], buffer[3], buffer[4],
pSapCfg->SapIfInfo.PeriodicUpdateInterval,
pSapCfg->SapIfInfo.AgeIntervalMultiplier
);
}
}
else
{
rc = ERROR_NOT_ENOUGH_MEMORY;
if ( !hFile ) { DisplayError( g_hModule, rc ); }
}
break;
}
}
else
{
if ( !hFile ) { DisplayIPXMessage (g_hModule, MSG_INTERFACE_INFO_CORRUPTED); }
rc = ERROR_INVALID_DATA;
}
if (hTrCfg != NULL)
{
MprConfigBufferFree (pClBlock);
}
else
{
MprAdminBufferFree (pClBlock);
}
}
return rc;
}
PSAP_IF_CONFIG
GetIpxSapInterface(
HANDLE hIf,
LPBYTE *pIfBlock
)
{
DWORD dwSize;
DWORD dwErr;
PIPX_TOC_ENTRY pIpxToc;
dwErr = MprAdminInterfaceTransportGetInfo(
g_hMprAdmin, hIf, PID_IPX, pIfBlock, &dwSize
);
if (dwErr != NO_ERROR)
{
return NULL;
}
pIpxToc = GetIPXTocEntry ((PIPX_INFO_BLOCK_HEADER)(*pIfBlock), IPX_PROTOCOL_SAP);
if (!pIpxToc)
{
return NULL;
}
return (PSAP_IF_CONFIG)((*pIfBlock) + (pIpxToc->Offset));
}
DWORD
MIBEnumSapIfs (VOID)
{
PMPR_INTERFACE_0 IfList = NULL;
DWORD dwErr = 0, dwRead, dwTot, i, j;
PWCHAR buffer[3];
LPBYTE buf = NULL;
PSAP_IF_CONFIG pSapCfg;
WCHAR IfName[ MAX_INTERFACE_NAME_LEN + 1 ];
DWORD dwSize = sizeof(IfName);
DisplayIPXMessage (g_hModule, MSG_SAPIF_MIB_TABLE_HDR);
dwErr = MprAdminInterfaceEnum(
g_hMprAdmin, 0, (unsigned char **) & IfList, MAXULONG,
&dwRead, &dwTot, NULL
);
if (dwErr != NO_ERROR)
{
return dwErr;
}
for (i = 0; i < dwRead; i++)
{
if ((pSapCfg = GetIpxSapInterface(IfList[i].hInterface, &buf)) != NULL)
{
//======================================
// Translate the Interface Name
//======================================
dwErr = IpmontrGetFriendlyNameFromIfName(
IfList[i].wszInterfaceName,
IfName, &dwSize
);
if ( dwErr == NO_ERROR )
{
buffer[ 2 ] = GetEnumString(
g_hModule, pSapCfg->SapIfInfo.AdminState,
NUM_TOKENS_IN_TABLE( AdminStates ),
AdminStates
);
buffer[ 0 ] = GetEnumString(
g_hModule, pSapCfg->SapIfInfo.UpdateMode,
NUM_TOKENS_IN_TABLE( UpdateModes ),
UpdateModes
);
buffer[ 1 ] = GetEnumString(
g_hModule, IfList[i].dwConnectionState,
NUM_TOKENS_IN_TABLE( InterfaceStates ),
InterfaceStates
);
if ( buffer[ 0 ] && buffer[ 1 ] && buffer[ 2 ] )
{
DisplayIPXMessage(
g_hModule, MSG_SAPIF_MIB_TABLE_FMT,
buffer[1], buffer[2], buffer[0],
IfName
);
}
else
{
dwErr = ERROR_NOT_ENOUGH_MEMORY;
DisplayError( g_hModule, dwErr );
}
}
}
}
if (buf)
{
MprAdminBufferFree(buf);
}
buf = NULL;
return NO_ERROR;
}
/*
DWORD
MIBEnumSapIfs (
VOID
) {
DWORD rc;
DWORD sz;
SAP_MIB_GET_INPUT_DATA MibGetInputData;
PSAP_INTERFACE pIf;
DisplayIPXMessage (g_hModule, MSG_SAPIF_MIB_TABLE_HDR);
MibGetInputData.TableId = SAP_INTERFACE_TABLE;
rc = MprAdminMIBEntryGetFirst (
g_hMIBServer,
PID_IPX,
IPX_PROTOCOL_SAP,
&MibGetInputData,
sizeof(SAP_MIB_GET_INPUT_DATA),
(LPVOID *)&pIf,
&sz);
while (rc==NO_ERROR) {
// CHAR InterfaceNameA[IPX_INTERFACE_ANSI_NAME_LEN+1];
CHAR InterfaceNameA[MAX_INTERFACE_NAME_LEN+1];
DWORD rc1;
//rc1 = GetIpxInterfaceName (g_hMIBServer,
// pIf->InterfaceIndex,
// InterfaceNameA);
rc1=(*(Params->IfInd2IfNameA))(pIf->InterfaceIndex, InterfaceNameA, &(Params->IfNamBufferLength));
if (rc1==NO_ERROR) {
WCHAR buffer[3][MAX_VALUE];
HANDLE hIfCfg;
WCHAR InterfaceNameW[MAX_INTERFACE_NAME_LEN+1];
mbstowcs (InterfaceNameW, InterfaceNameA, sizeof (InterfaceNameW));
if (MprConfigInterfaceGetHandle (
g_hMprConfig,
InterfaceNameW,
&hIfCfg)==NO_ERROR) {
//======================================
// Translate the Interface Name
//======================================
if ((rc=(*(Params->IfName2DescA))(InterfaceNameA,
Params->IfNamBufferA,
&Params->IfNamBufferLength)) != NO_ERROR) {
return rc;
}
//======================================
DisplayIPXMessage (g_hModule,
MSG_SAPIF_MIB_TABLE_FMT,
Params->IfNamBufferA, //InterfaceNameA,
GetValueString (g_hModule, Utils, UpdateModes,
pIf->SapIfInfo.UpdateMode, buffer[0]),
GetValueString (g_hModule, Utils, AdminStates,
pIf->SapIfInfo.AdminState, buffer[1]),
GetValueString (g_hModule, Utils, OperStates,
pIf->SapIfStats.SapIfOperState, buffer[2])
);
}
}
else
DisplayError( g_hModule, rc1);
MibGetInputData.InterfaceIndex
= pIf->InterfaceIndex;
MprAdminMIBBufferFree (pIf);
rc = MprAdminMIBEntryGetNext (
g_hMIBServer,
PID_IPX,
IPX_PROTOCOL_SAP,
&MibGetInputData,
sizeof(SAP_MIB_GET_INPUT_DATA),
(LPVOID *)&pIf,
&sz);
}
if (rc==ERROR_NO_MORE_ITEMS)
return NO_ERROR;
else {
DisplayError( g_hModule, rc);
return rc;
}
}
*/
DWORD
CfgEnumSapIfs (
VOID
)
{
DWORD rc = NO_ERROR;
DWORD read, total, processed = 0, i, dwErr;
DWORD hResume = 0;
DWORD sz;
PMPR_INTERFACE_0 pRi0;
WCHAR IfName[ MAX_INTERFACE_NAME_LEN + 1 ];
DWORD dwSize = sizeof(IfName);
DisplayIPXMessage (g_hModule, MSG_SAPIF_CFG_TABLE_HDR);
do
{
rc = MprConfigInterfaceEnum (
g_hMprConfig, 0, (LPBYTE * ) & pRi0, MAXULONG,
&read, &total, &hResume
);
if (rc == NO_ERROR)
{
for (i = 0; i < read; i++)
{
HANDLE hIfTrCfg;
rc = MprConfigInterfaceTransportGetHandle (
g_hMprConfig, pRi0[i].hInterface, PID_IPX, &hIfTrCfg
);
if (rc == NO_ERROR)
{
LPBYTE pIfBlock;
rc = MprConfigInterfaceTransportGetInfo (
g_hMprConfig, pRi0[i].hInterface, hIfTrCfg, &pIfBlock, &sz
);
if (rc == NO_ERROR)
{
PIPX_TOC_ENTRY pSapToc;
pSapToc = GetIPXTocEntry (
(PIPX_INFO_BLOCK_HEADER)pIfBlock,
IPX_PROTOCOL_SAP
);
if (pSapToc != NULL)
{
PSAP_IF_CONFIG pSapCfg;
PWCHAR buffer[2];
pSapCfg = (PSAP_IF_CONFIG) (pIfBlock + pSapToc->Offset);
//======================================
// Translate the Interface Name
//======================================
dwErr = IpmontrGetFriendlyNameFromIfName(
pRi0[i].wszInterfaceName,
IfName, &dwSize
);
if ( dwErr != NO_ERROR )
{
buffer[ 1 ] = GetEnumString(
g_hModule, pSapCfg->SapIfInfo.AdminState,
NUM_TOKENS_IN_TABLE( AdminStates ),
AdminStates
);
buffer[ 0 ] = GetEnumString(
g_hModule, pSapCfg->SapIfInfo.UpdateMode,
NUM_TOKENS_IN_TABLE( UpdateModes ),
UpdateModes
);
if ( buffer[ 0 ] && buffer[ 1 ] )
{
DisplayIPXMessage(
g_hModule, MSG_SAPIF_CFG_TABLE_FMT,
IfName, buffer[0], buffer[1]
);
}
else
{
rc = ERROR_NOT_ENOUGH_MEMORY;
DisplayError( g_hModule, rc );
}
}
else
{
DisplayError( g_hModule, rc );
}
}
else
{
DisplayIPXMessage (g_hModule, MSG_INTERFACE_INFO_CORRUPTED);
rc = ERROR_INVALID_DATA;
}
}
else
{
DisplayError( g_hModule, rc);
}
}
else
{
//DisplayError( g_hModule, rc);
}
}
processed += read;
MprConfigBufferFree (pRi0);
}
else
{
DisplayError( g_hModule, rc);
break;
}
} while (processed < total);
return rc;
}
DWORD
CfgSetSapIf (
LPWSTR InterfaceNameW,
PULONG pAdminState OPTIONAL,
PULONG pAdvertise OPTIONAL,
PULONG pListen OPTIONAL,
PULONG pReply OPTIONAL,
PULONG pUpdateMode OPTIONAL,
PULONG pInterval OPTIONAL,
PULONG pAgeMultiplier OPTIONAL
)
{
DWORD rc;
DWORD sz;
HANDLE hTrCfg;
HANDLE hIfCfg;
HANDLE hIfTrCfg;
LPBYTE pIfBlock;
if (InterfaceNameW != NULL)
{
rc = MprConfigInterfaceGetHandle (
g_hMprConfig, InterfaceNameW, &hIfCfg
);
if (rc == NO_ERROR)
{
rc = MprConfigInterfaceTransportGetHandle (
g_hMprConfig, hIfCfg, PID_IPX, &hIfTrCfg
);
if (rc == NO_ERROR)
{
rc = MprConfigInterfaceTransportGetInfo (
g_hMprConfig, hIfCfg, hIfTrCfg, &pIfBlock, &sz
);
}
}
}
else
{
rc = MprConfigTransportGetHandle (
g_hMprConfig, PID_IPX, &hTrCfg
);
if (rc == NO_ERROR)
{
rc = MprConfigTransportGetInfo (
g_hMprConfig, hTrCfg, NULL, NULL, &pIfBlock, &sz, NULL
);
}
}
if (rc == NO_ERROR)
{
PIPX_TOC_ENTRY pSapToc;
pSapToc = GetIPXTocEntry (
(PIPX_INFO_BLOCK_HEADER)pIfBlock,
IPX_PROTOCOL_SAP
);
if (pSapToc != NULL)
{
PSAP_IF_CONFIG pSapCfg;
pSapCfg = (PSAP_IF_CONFIG) (pIfBlock + pSapToc->Offset);
if (ARGUMENT_PRESENT (pAdminState))
{
pSapCfg->SapIfInfo.AdminState = *pAdminState;
}
if (ARGUMENT_PRESENT (pAdvertise))
{
pSapCfg->SapIfInfo.Supply = *pAdvertise;
}
if (ARGUMENT_PRESENT (pListen))
{
pSapCfg->SapIfInfo.Listen = *pListen;
}
if (ARGUMENT_PRESENT (pReply))
{
pSapCfg->SapIfInfo.GetNearestServerReply = *pReply;
}
if (ARGUMENT_PRESENT (pUpdateMode))
{
pSapCfg->SapIfInfo.UpdateMode = *pUpdateMode;
}
if (ARGUMENT_PRESENT (pInterval))
{
pSapCfg->SapIfInfo.PeriodicUpdateInterval = *pInterval;
}
if (ARGUMENT_PRESENT (pAgeMultiplier))
{
pSapCfg->SapIfInfo.AgeIntervalMultiplier = *pAgeMultiplier;
}
if (InterfaceNameW != NULL)
{
rc = MprConfigInterfaceTransportSetInfo (
g_hMprConfig, hIfCfg, hIfTrCfg, pIfBlock, sz
);
}
else
{
rc = MprConfigTransportSetInfo (
g_hMprConfig, hTrCfg, NULL, 0, pIfBlock, sz, NULL
);
}
if (rc == NO_ERROR)
{
if (InterfaceNameW != NULL)
{
DisplayIPXMessage (
g_hModule, MSG_SAPIF_SET_CFG, InterfaceNameW
);
}
else
{
DisplayIPXMessage (g_hModule, MSG_CLIENT_SAPIF_SET_CFG);
}
}
else
{
DisplayError( g_hModule, rc);
}
}
else
{
DisplayIPXMessage (g_hModule, MSG_INTERFACE_INFO_CORRUPTED);
rc = ERROR_INVALID_DATA;
}
MprConfigBufferFree (pIfBlock);
}
else
{
DisplayError( g_hModule, rc);
}
return rc;
}
DWORD
AdmSetSapIf (
LPWSTR InterfaceNameW,
PULONG pAdminState OPTIONAL,
PULONG pAdvertise OPTIONAL,
PULONG pListen OPTIONAL,
PULONG pReply OPTIONAL,
PULONG pUpdateMode OPTIONAL,
PULONG pInterval OPTIONAL,
PULONG pAgeMultiplier OPTIONAL
)
{
DWORD rc;
DWORD sz;
HANDLE hIfAdm;
LPBYTE pIfBlock;
if (InterfaceNameW != NULL)
{
rc = MprAdminInterfaceGetHandle (
g_hMprAdmin, InterfaceNameW, &hIfAdm, FALSE
);
if (rc == NO_ERROR)
{
rc = MprAdminInterfaceTransportGetInfo (
g_hMprAdmin, hIfAdm, PID_IPX, &pIfBlock, &sz
);
}
}
else
{
rc = MprAdminTransportGetInfo (
g_hMprAdmin, PID_IPX, NULL, NULL, &pIfBlock, &sz
);
}
if (rc == NO_ERROR)
{
PIPX_TOC_ENTRY pSapToc;
pSapToc = GetIPXTocEntry (
(PIPX_INFO_BLOCK_HEADER)pIfBlock,
IPX_PROTOCOL_SAP
);
if (pSapToc != NULL)
{
PSAP_IF_CONFIG pSapCfg;
pSapCfg = (PSAP_IF_CONFIG) (pIfBlock + pSapToc->Offset);
if (ARGUMENT_PRESENT (pAdminState))
{
pSapCfg->SapIfInfo.AdminState = *pAdminState;
}
if (ARGUMENT_PRESENT (pAdvertise))
{
pSapCfg->SapIfInfo.Supply = *pAdvertise;
}
if (ARGUMENT_PRESENT (pListen))
{
pSapCfg->SapIfInfo.Listen = *pListen;
}
if (ARGUMENT_PRESENT (pReply))
{
pSapCfg->SapIfInfo.GetNearestServerReply = *pReply;
}
if (ARGUMENT_PRESENT (pUpdateMode))
{
pSapCfg->SapIfInfo.UpdateMode = *pUpdateMode;
}
if (ARGUMENT_PRESENT (pInterval))
{
pSapCfg->SapIfInfo.PeriodicUpdateInterval = *pInterval;
}
if (ARGUMENT_PRESENT (pAgeMultiplier))
{
pSapCfg->SapIfInfo.AgeIntervalMultiplier = *pAgeMultiplier;
}
if (InterfaceNameW != NULL)
{
rc = MprAdminInterfaceTransportSetInfo (
g_hMprAdmin, hIfAdm, PID_IPX, pIfBlock,
((PIPX_INFO_BLOCK_HEADER)pIfBlock)->Size
);
}
else
{
rc = MprAdminTransportSetInfo (
g_hMprAdmin, PID_IPX, NULL, 0, pIfBlock,
((PIPX_INFO_BLOCK_HEADER)pIfBlock)->Size
);
}
if (rc == NO_ERROR)
{
if (InterfaceNameW != NULL)
{
DisplayIPXMessage (g_hModule, MSG_SAPIF_SET_ADM, InterfaceNameW);
}
else
{
DisplayIPXMessage (g_hModule, MSG_CLIENT_SAPIF_SET_ADM);
}
}
else
{
DisplayError( g_hModule, rc);
}
}
else
{
DisplayIPXMessage (g_hModule, MSG_INTERFACE_INFO_CORRUPTED);
rc = ERROR_INVALID_DATA;
}
MprAdminBufferFree (pIfBlock);
}
else
{
DisplayError( g_hModule, rc);
}
return rc;
}