1499 lines
41 KiB
C
1499 lines
41 KiB
C
|
#include "precomp.h"
|
||
|
|
||
|
extern WCHAR IfNamBuffer[MaxIfDisplayLength];
|
||
|
DWORD IfNamBufferLength=1024;
|
||
|
|
||
|
ENUM_TO_STR InterfaceTypes[] = {
|
||
|
{ ROUTER_IF_TYPE_CLIENT, VAL_IFTYPE_CLIENT },
|
||
|
{ ROUTER_IF_TYPE_HOME_ROUTER, VAL_IFTYPE_HOME_ROUTER },
|
||
|
{ ROUTER_IF_TYPE_FULL_ROUTER, VAL_IFTYPE_FULL_ROUTER },
|
||
|
{ ROUTER_IF_TYPE_DEDICATED, VAL_IFTYPE_DEDICATED },
|
||
|
{ ROUTER_IF_TYPE_INTERNAL, VAL_IFTYPE_INTERNAL},
|
||
|
{ ROUTER_IF_TYPE_LOOPBACK, VAL_IFTYPE_LOOPBACK},
|
||
|
{ ROUTER_IF_TYPE_TUNNEL1, VAL_IFTYPE_TUNNEL1},
|
||
|
};
|
||
|
|
||
|
ENUM_TO_STR InterfaceStates[] = {
|
||
|
{ ROUTER_IF_STATE_DISCONNECTED, VAL_IFSTATE_DISCONNECTED },
|
||
|
{ ROUTER_IF_STATE_CONNECTING, VAL_IFSTATE_CONNECTING },
|
||
|
{ ROUTER_IF_STATE_CONNECTED, VAL_IFSTATE_CONNECTED }
|
||
|
};
|
||
|
|
||
|
ENUM_TO_STR InterfacePersistency[] = {
|
||
|
{ FALSE, VAL_NO },
|
||
|
{ TRUE, VAL_YES }
|
||
|
};
|
||
|
|
||
|
ENUM_TO_STR InterfaceEnableStatus[] = {
|
||
|
{ FALSE, VAL_ENABLED },
|
||
|
{ TRUE, VAL_DISABLED }
|
||
|
};
|
||
|
|
||
|
ENUM_TO_STR TransportIds[] = {
|
||
|
{ PID_IP, TOKEN_IP },
|
||
|
{ PID_IPX, TOKEN_IPX }
|
||
|
};
|
||
|
|
||
|
#define LOCAL_ROUTER_PB_PATHW L"%SystemRoot%\\system32\\RAS\\Router.Pbk"
|
||
|
#define REMOTE_ROUTER_PB_PATHW L"\\\\%ls\\Admin$\\system32\\RAS\\Router.Pbk"
|
||
|
|
||
|
int
|
||
|
UpdateInterface (
|
||
|
IN LPTSTR InterfaceName,
|
||
|
IN DWORD pid
|
||
|
);
|
||
|
|
||
|
int
|
||
|
CreateInterface (
|
||
|
IN INT argc,
|
||
|
IN LPTSTR *argv
|
||
|
);
|
||
|
|
||
|
int
|
||
|
DeleteInterface (
|
||
|
IN LPTSTR InterfaceName
|
||
|
);
|
||
|
|
||
|
int
|
||
|
SetInterface (
|
||
|
IN LPTSTR InterfaceName,
|
||
|
IN LPTSTR UserName,
|
||
|
IN LPTSTR Domain,
|
||
|
IN LPTSTR Password
|
||
|
);
|
||
|
|
||
|
int
|
||
|
ConnectInterface (
|
||
|
IN LPTSTR InterfaceName
|
||
|
);
|
||
|
|
||
|
int
|
||
|
DisconnectInterface (
|
||
|
IN LPTSTR InterfaceName
|
||
|
);
|
||
|
|
||
|
|
||
|
int
|
||
|
EnableInterface(
|
||
|
IN LPTSTR lpInterface,
|
||
|
IN BOOL bEnable
|
||
|
);
|
||
|
|
||
|
|
||
|
int
|
||
|
ShowInterfaces (
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
int
|
||
|
ShowInterface (
|
||
|
IN LPTSTR InterfaceName
|
||
|
);
|
||
|
|
||
|
DWORD
|
||
|
IsPhoneBookEntry (
|
||
|
LPWSTR InterfaceName
|
||
|
);
|
||
|
|
||
|
HINSTANCE HIf;
|
||
|
PROUTEMON_PARAMS pParams;
|
||
|
PROUTEMON_UTILS pUtils;
|
||
|
|
||
|
#if defined( UNICODE ) || defined( _UNICODE )
|
||
|
#define PrintString( s ) wprintf( L"%ls\n", (s) )
|
||
|
#define PrintWord( w ) wprintf( L"%0x\n", (w) )
|
||
|
|
||
|
#else
|
||
|
#define PrintString( s ) _tprintf( TEXT( "%s\n" ), (s) )
|
||
|
#define PrintWord( w ) _tprintf( TEXT( "%0x\n" ), (w) )
|
||
|
|
||
|
#endif
|
||
|
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// InterfaceMonitor
|
||
|
//
|
||
|
// Dispatches the command to the appropriate function.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
|
||
|
int APIENTRY
|
||
|
InterfaceMonitor (
|
||
|
IN int argc,
|
||
|
IN TCHAR *argv[],
|
||
|
IN PROUTEMON_PARAMS params,
|
||
|
IN PROUTEMON_UTILS utils
|
||
|
) {
|
||
|
DWORD res = 0;
|
||
|
TCHAR buffer[MAX_TOKEN];
|
||
|
|
||
|
HIf = GetModuleHandle (NULL);
|
||
|
pParams = params;
|
||
|
pUtils = utils;
|
||
|
|
||
|
if (argc>0) {
|
||
|
if (_tcsicmp (argv[0], GetString (HIf, TOKEN_CREATE, buffer))==0) {
|
||
|
if (argc>1)
|
||
|
return CreateInterface (argc-1, &argv[1]);
|
||
|
else
|
||
|
res = ERROR_INVALID_PARAMETER;
|
||
|
}
|
||
|
else if (_tcsicmp (argv[0], GetString (HIf, TOKEN_DELETE, buffer))==0) {
|
||
|
if (argc>1)
|
||
|
return DeleteInterface (argv[1]);
|
||
|
else
|
||
|
res = ERROR_INVALID_PARAMETER;
|
||
|
}
|
||
|
else if (_tcsicmp (argv[0], GetString (HIf, TOKEN_SET, buffer))==0) {
|
||
|
if (argc>4)
|
||
|
return SetInterface (argv[1],argv[2],argv[3],argv[4]);
|
||
|
else
|
||
|
res = ERROR_INVALID_PARAMETER;
|
||
|
}
|
||
|
else if (_tcsicmp (argv[0], GetString (HIf, TOKEN_SHOW, buffer))==0) {
|
||
|
if (argc>1)
|
||
|
return ShowInterface (argv[1]);
|
||
|
else
|
||
|
return ShowInterfaces ();
|
||
|
}
|
||
|
else if (_tcsicmp (argv[0], GetString (HIf, TOKEN_CONNECT, buffer))==0) {
|
||
|
if (argc>1)
|
||
|
return ConnectInterface (argv[1]);
|
||
|
else
|
||
|
res = ERROR_INVALID_PARAMETER;
|
||
|
}
|
||
|
else if (_tcsicmp (argv[0], GetString (HIf, TOKEN_DISCONNECT, buffer))==0) {
|
||
|
if (argc>1)
|
||
|
return DisconnectInterface (argv[1]);
|
||
|
else
|
||
|
res = ERROR_INVALID_PARAMETER;
|
||
|
}
|
||
|
else if (_tcsicmp (argv[0], GetString (HIf, TOKEN_ENABLE, buffer))==0) {
|
||
|
if ( argc > 1 )
|
||
|
return EnableInterface (argv[1], TRUE);
|
||
|
else
|
||
|
res = ERROR_INVALID_PARAMETER;
|
||
|
}
|
||
|
else if (_tcsicmp (argv[0], GetString (HIf, TOKEN_DISABLE, buffer))==0) {
|
||
|
if ( argc > 1 )
|
||
|
return EnableInterface ( argv[1], FALSE );
|
||
|
else
|
||
|
res = ERROR_INVALID_PARAMETER;
|
||
|
}
|
||
|
else if (_tcsicmp (argv[0], GetString (HIf, TOKEN_UPDATE, buffer))==0) {
|
||
|
DWORD pid;
|
||
|
if ((argc>2) && (GetValueFromString (HIf, pUtils, TransportIds, argv[2], &pid)))
|
||
|
return UpdateInterface (argv[1], pid);
|
||
|
else
|
||
|
res = ERROR_INVALID_PARAMETER;
|
||
|
}
|
||
|
else if ((_tcsicmp (argv[0], GetString (HIf, TOKEN_HELP1, buffer))==0)
|
||
|
|| (_tcsicmp (argv[0], GetString (HIf, TOKEN_HELP2, buffer))==0)
|
||
|
|| (_tcsicmp (argv[0], GetString (HIf, TOKEN_HELP3, buffer))==0))
|
||
|
NOTHING;
|
||
|
else
|
||
|
res = ERROR_INVALID_PARAMETER;
|
||
|
}
|
||
|
else
|
||
|
res = ERROR_INVALID_PARAMETER;
|
||
|
|
||
|
pUtils->put_msg (HIf, MSG_INTERFACE_HELP, pParams->pszProgramName);
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// CreateInterface
|
||
|
//
|
||
|
// Create a demand-dial interface
|
||
|
//-----------------------------------------------------------------------------
|
||
|
|
||
|
int
|
||
|
CreateInterface (
|
||
|
IN INT argc,
|
||
|
IN LPTSTR *argv
|
||
|
) {
|
||
|
|
||
|
MPR_INTERFACE_0 Ri0;
|
||
|
HANDLE hIfCfg;
|
||
|
DWORD rc, dwIfType;
|
||
|
unsigned count;
|
||
|
TCHAR buffer[MAX_TOKEN];
|
||
|
ULONG ulIfIndex;
|
||
|
|
||
|
ZeroMemory(&Ri0,
|
||
|
sizeof(Ri0));
|
||
|
|
||
|
//
|
||
|
// if there is only one argument, then it is the interface name
|
||
|
// which may even be called TUNNEL1
|
||
|
// if there is more than one argument, and the first is TUNNEL1, then
|
||
|
// the next one is the interface name
|
||
|
//
|
||
|
|
||
|
ulIfIndex = 0;
|
||
|
dwIfType = ROUTER_IF_TYPE_FULL_ROUTER;
|
||
|
|
||
|
if(argc > 1)
|
||
|
{
|
||
|
if(_tcsicmp(argv[0], GetString (HIf, TOKEN_TUNNEL1, buffer))==0)
|
||
|
{
|
||
|
ulIfIndex = 1;
|
||
|
dwIfType = ROUTER_IF_TYPE_TUNNEL1;
|
||
|
|
||
|
Ri0.fEnabled = TRUE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// convert interface name to unicode
|
||
|
//
|
||
|
|
||
|
#if defined(UNICODE) || defined (_UNICODE)
|
||
|
wcsncpy (Ri0.wszInterfaceName, argv[ulIfIndex],
|
||
|
sizeof (Ri0.wszInterfaceName)/sizeof (Ri0.wszInterfaceName[0]));
|
||
|
count = wcslen (argv[ulIfIndex]);
|
||
|
#else
|
||
|
count = mbstowcs (Ri0.wszInterfaceName, argv[ulIfIndex],
|
||
|
sizeof (Ri0.wszInterfaceName));
|
||
|
#endif
|
||
|
|
||
|
|
||
|
do
|
||
|
{
|
||
|
|
||
|
if ( count > MAX_INTERFACE_NAME_LEN )
|
||
|
{
|
||
|
rc = ERROR_INVALID_PARAMETER;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
|
||
|
if(dwIfType == ROUTER_IF_TYPE_FULL_ROUTER)
|
||
|
{
|
||
|
//
|
||
|
// to create an interface we need a phone book entry
|
||
|
// for it.
|
||
|
//
|
||
|
|
||
|
rc = IsPhoneBookEntry (Ri0.wszInterfaceName);
|
||
|
|
||
|
if ( rc != NO_ERROR )
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
//
|
||
|
// create interface with defaults
|
||
|
//
|
||
|
|
||
|
Ri0.hInterface = INVALID_HANDLE_VALUE;
|
||
|
Ri0.dwIfType = dwIfType;
|
||
|
|
||
|
rc = MprConfigInterfaceCreate (
|
||
|
pParams->hRouterConfig,
|
||
|
0,
|
||
|
(LPBYTE)&Ri0,
|
||
|
&hIfCfg
|
||
|
);
|
||
|
|
||
|
if ( rc != NO_ERROR )
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
pUtils->put_msg (HIf, MSG_INTERFACE_CREATED, Ri0.wszInterfaceName);
|
||
|
|
||
|
|
||
|
//
|
||
|
// if router service is running add the interface
|
||
|
// to it too.
|
||
|
//
|
||
|
|
||
|
if ( pParams->hRouterAdmin ) {
|
||
|
|
||
|
HANDLE hIfAdmin;
|
||
|
|
||
|
rc = MprAdminInterfaceCreate (
|
||
|
pParams->hRouterAdmin,
|
||
|
0,
|
||
|
(LPBYTE)&Ri0,
|
||
|
&hIfAdmin
|
||
|
);
|
||
|
|
||
|
if ( rc != NO_ERROR )
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
pUtils->put_msg (HIf, MSG_INTERFACE_ADDED, Ri0.wszInterfaceName);
|
||
|
}
|
||
|
|
||
|
} while( FALSE );
|
||
|
|
||
|
if ( rc != NO_ERROR ) { pUtils->put_error_msg (rc); }
|
||
|
|
||
|
return rc;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// SetInterface
|
||
|
//
|
||
|
// sets the credentials to be used by an interface when dialing into
|
||
|
// a remote router.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
|
||
|
int
|
||
|
SetInterface (
|
||
|
IN LPTSTR InterfaceName,
|
||
|
IN LPTSTR UserName,
|
||
|
IN LPTSTR Domain,
|
||
|
IN LPTSTR Password
|
||
|
)
|
||
|
{
|
||
|
|
||
|
HANDLE hIfCfg = NULL;
|
||
|
|
||
|
DWORD rc = (DWORD) -1,
|
||
|
rc2 = 0,
|
||
|
dwSize = 0;
|
||
|
|
||
|
unsigned ci = 0,
|
||
|
cu = 0,
|
||
|
cd = 0,
|
||
|
cp = 0;
|
||
|
|
||
|
PMPR_INTERFACE_0 pRi0 = NULL;
|
||
|
|
||
|
|
||
|
//
|
||
|
// convert parameters to WCHAR
|
||
|
//
|
||
|
|
||
|
#if defined(UNICODE) || defined (_UNICODE)
|
||
|
|
||
|
#define pInterfaceName InterfaceName
|
||
|
#define pUserName UserName
|
||
|
#define pDomain Domain
|
||
|
#define pPassword Password
|
||
|
|
||
|
ci = wcslen (InterfaceName);
|
||
|
cu = wcslen (UserName);
|
||
|
cd = wcslen (Domain);
|
||
|
cp = wcslen (Password);
|
||
|
|
||
|
#else
|
||
|
|
||
|
WCHAR InterfaceNameW[MAX_INTERFACE_NAME_LEN+1];
|
||
|
WCHAR UserNameW[257];
|
||
|
WCHAR DomainW[257];
|
||
|
WCHAR PasswordW[257];
|
||
|
|
||
|
#define pInterfaceName InterfaceNameW
|
||
|
#define pUserName UserNameW
|
||
|
#define pDomain DomainW
|
||
|
#define pPassword PasswordW
|
||
|
|
||
|
ci = mbstowcs (InterfaceNameW, InterfaceName, sizeof (InterfaceNameW));
|
||
|
cu = mbstowcs (UserNameW, UserName, sizeof (UserNameW));
|
||
|
cd = mbstowcs (DomainW, Domain, sizeof (DomainW));
|
||
|
cp = mbstowcs (PasswordW, Password, sizeof (PasswordW));
|
||
|
|
||
|
#endif
|
||
|
|
||
|
|
||
|
//======================================
|
||
|
// Translate the Interface Name
|
||
|
//======================================
|
||
|
rc2 = Description2IfNameW(pInterfaceName,
|
||
|
IfNamBuffer,
|
||
|
&IfNamBufferLength);
|
||
|
//======================================
|
||
|
|
||
|
|
||
|
do
|
||
|
{
|
||
|
//
|
||
|
// verify parameters
|
||
|
//
|
||
|
|
||
|
if ( ( ci > MAX_INTERFACE_NAME_LEN ) ||
|
||
|
( cu > 256 ) ||
|
||
|
( cd > 256 ) ||
|
||
|
( cp > 256 ) )
|
||
|
{
|
||
|
rc = ERROR_INVALID_PARAMETER;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
|
||
|
//
|
||
|
// verify if the interface is a demand-dial interface
|
||
|
// before setting credentials on it.
|
||
|
//
|
||
|
|
||
|
rc = MprConfigInterfaceGetHandle(
|
||
|
pParams->hRouterConfig,
|
||
|
(rc2 == NO_ERROR) ? IfNamBuffer : pInterfaceName,
|
||
|
&hIfCfg
|
||
|
);
|
||
|
|
||
|
if ( rc != NO_ERROR )
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
rc = MprConfigInterfaceGetInfo (
|
||
|
pParams->hRouterConfig,
|
||
|
hIfCfg,
|
||
|
0,
|
||
|
(LPBYTE *) &pRi0,
|
||
|
&dwSize
|
||
|
);
|
||
|
|
||
|
if ( rc != NO_ERROR )
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if ( pRi0-> dwIfType != ROUTER_IF_TYPE_FULL_ROUTER )
|
||
|
{
|
||
|
rc = ERROR_INVALID_PARAMETER;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
|
||
|
//
|
||
|
// set the credentials in the router
|
||
|
//
|
||
|
|
||
|
rc = MprAdminInterfaceSetCredentials (
|
||
|
pParams-> wszRouterName,
|
||
|
(rc2 == NO_ERROR) ? IfNamBuffer : pInterfaceName,
|
||
|
pUserName,
|
||
|
pDomain,
|
||
|
pPassword
|
||
|
);
|
||
|
|
||
|
if ( rc != NO_ERROR )
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
pUtils->put_msg (HIf, MSG_INTERFACE_SET, (rc2 == NO_ERROR) ? IfNamBuffer : pInterfaceName);
|
||
|
|
||
|
} while( FALSE );
|
||
|
|
||
|
|
||
|
//
|
||
|
// free allocations and report errors
|
||
|
//
|
||
|
|
||
|
if ( pRi0 ) { MprConfigBufferFree( pRi0 ); }
|
||
|
|
||
|
if ( rc != NO_ERROR ) { pUtils-> put_error_msg( rc ); }
|
||
|
|
||
|
#undef pInterfaceName
|
||
|
#undef pUserName
|
||
|
#undef pDomain
|
||
|
#undef pPassword
|
||
|
|
||
|
return rc;
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// DeleteInterface
|
||
|
//
|
||
|
// Deletes a demand-dial Interface.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
|
||
|
int
|
||
|
DeleteInterface (
|
||
|
IN LPTSTR InterfaceName
|
||
|
) {
|
||
|
HANDLE hIfCfg;
|
||
|
DWORD rc, rc2;
|
||
|
unsigned count;
|
||
|
PMPR_INTERFACE_0 pRi0;
|
||
|
DWORD sz;
|
||
|
|
||
|
#if defined(UNICODE) || defined (_UNICODE)
|
||
|
#define pInterfaceName InterfaceName
|
||
|
count = wcslen (InterfaceName);
|
||
|
#else
|
||
|
WCHAR InterfaceNameW[MAX_INTERFACE_NAME_LEN+1];
|
||
|
#define pInterfaceName InterfaceNameW
|
||
|
count = mbstowcs (InterfaceNameW, InterfaceName, sizeof (InterfaceNameW));
|
||
|
#endif
|
||
|
//======================================
|
||
|
// Translate the Interface Name
|
||
|
//======================================
|
||
|
rc2 = Description2IfNameW(pInterfaceName,
|
||
|
IfNamBuffer,
|
||
|
&IfNamBufferLength);
|
||
|
//======================================
|
||
|
|
||
|
if (count<=MAX_INTERFACE_NAME_LEN) {
|
||
|
rc = MprConfigInterfaceGetHandle (
|
||
|
pParams->hRouterConfig,
|
||
|
(rc2 == NO_ERROR) ? IfNamBuffer : pInterfaceName,
|
||
|
&hIfCfg
|
||
|
);
|
||
|
if (rc==NO_ERROR) {
|
||
|
rc = MprConfigInterfaceGetInfo (
|
||
|
pParams->hRouterConfig,
|
||
|
hIfCfg,
|
||
|
0,
|
||
|
(LPBYTE *)&pRi0,
|
||
|
&sz);
|
||
|
if (rc==NO_ERROR) {
|
||
|
if((pRi0->dwIfType==ROUTER_IF_TYPE_FULL_ROUTER) ||
|
||
|
(pRi0->dwIfType==ROUTER_IF_TYPE_TUNNEL1))
|
||
|
{
|
||
|
rc = MprConfigInterfaceDelete (
|
||
|
pParams->hRouterConfig,
|
||
|
hIfCfg);
|
||
|
if (rc==NO_ERROR) {
|
||
|
pUtils->put_msg (HIf, MSG_INTERFACE_DELETED, (rc2 == NO_ERROR) ? IfNamBuffer : pInterfaceName);
|
||
|
if (pParams->hRouterAdmin) {
|
||
|
HANDLE hIfAdmin;
|
||
|
rc = MprAdminInterfaceGetHandle (
|
||
|
pParams->hRouterAdmin,
|
||
|
(rc2 == NO_ERROR) ? IfNamBuffer : pInterfaceName,
|
||
|
&hIfAdmin,
|
||
|
FALSE
|
||
|
);
|
||
|
if (rc==NO_ERROR) {
|
||
|
rc = MprAdminInterfaceDelete (
|
||
|
pParams->hRouterAdmin,
|
||
|
hIfAdmin);
|
||
|
if (rc==NO_ERROR)
|
||
|
pUtils->put_msg (HIf, MSG_INTERFACE_REMOVED, (rc2 == NO_ERROR) ? IfNamBuffer : pInterfaceName);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
rc = ERROR_INVALID_PARAMETER;
|
||
|
MprConfigBufferFree (pRi0);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
rc = ERROR_INVALID_PARAMETER;
|
||
|
}
|
||
|
|
||
|
if ( rc != NO_ERROR )
|
||
|
{
|
||
|
pUtils->put_error_msg (rc);
|
||
|
}
|
||
|
|
||
|
return rc;
|
||
|
|
||
|
#undef pInterfaceName
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// ShowInterfaces
|
||
|
//
|
||
|
// Display Interfaces on a router.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
|
||
|
int
|
||
|
ShowInterfaces (
|
||
|
VOID
|
||
|
) {
|
||
|
DWORD rc = NO_ERROR, rc2;
|
||
|
DWORD read, total, processed=0, i;
|
||
|
DWORD hResume = 0;
|
||
|
PMPR_INTERFACE_0 pRi0;
|
||
|
|
||
|
if (pParams->hRouterAdmin)
|
||
|
pUtils->put_msg (HIf, MSG_INTERFACE_RTR_TABLE_HDR);
|
||
|
else
|
||
|
pUtils->put_msg (HIf, MSG_INTERFACE_CFG_TABLE_HDR);
|
||
|
|
||
|
do {
|
||
|
if (pParams->hRouterAdmin)
|
||
|
rc = MprAdminInterfaceEnum (
|
||
|
pParams->hRouterAdmin,
|
||
|
0,
|
||
|
(LPBYTE *)&pRi0,
|
||
|
MAXULONG,
|
||
|
&read,
|
||
|
&total,
|
||
|
&hResume);
|
||
|
else
|
||
|
rc = MprConfigInterfaceEnum (
|
||
|
pParams->hRouterConfig,
|
||
|
0,
|
||
|
(LPBYTE *)&pRi0,
|
||
|
MAXULONG,
|
||
|
&read,
|
||
|
&total,
|
||
|
&hResume);
|
||
|
if (rc==NO_ERROR) {
|
||
|
for (i=0; i<read; i++) {
|
||
|
TCHAR buffer[3][MAX_VALUE];
|
||
|
|
||
|
//======================================
|
||
|
// Translate the Interface Name
|
||
|
//======================================
|
||
|
rc2 = IfName2DescriptionW(pRi0[i].wszInterfaceName,
|
||
|
IfNamBuffer,
|
||
|
&IfNamBufferLength);
|
||
|
//======================================
|
||
|
|
||
|
if (pParams->hRouterAdmin)
|
||
|
pUtils->put_msg (HIf,
|
||
|
MSG_INTERFACE_RTR_TABLE_FMT,
|
||
|
GetValueString (HIf, pUtils, InterfaceEnableStatus,
|
||
|
pRi0[i].fEnabled ? 0 : 1,
|
||
|
buffer[1]),
|
||
|
GetValueString (HIf, pUtils, InterfaceStates,
|
||
|
pRi0[i].dwConnectionState, buffer[2]),
|
||
|
GetValueString (HIf, pUtils, InterfaceTypes,
|
||
|
pRi0[i].dwIfType, buffer[0]),
|
||
|
(rc2 == NO_ERROR) ? IfNamBuffer : pRi0[i].wszInterfaceName
|
||
|
);
|
||
|
else
|
||
|
pUtils->put_msg (HIf,
|
||
|
MSG_INTERFACE_CFG_TABLE_FMT,
|
||
|
GetValueString (HIf, pUtils, InterfaceEnableStatus,
|
||
|
pRi0[i].fEnabled ? 0 : 1,
|
||
|
buffer[1]),
|
||
|
GetValueString (HIf, pUtils, InterfaceTypes,
|
||
|
pRi0[i].dwIfType, buffer[0] ),
|
||
|
(rc2 == NO_ERROR) ? IfNamBuffer : pRi0[i].wszInterfaceName
|
||
|
);
|
||
|
}
|
||
|
processed += read;
|
||
|
if (pParams->hRouterAdmin)
|
||
|
MprAdminBufferFree (pRi0);
|
||
|
else
|
||
|
MprConfigBufferFree (pRi0);
|
||
|
}
|
||
|
else {
|
||
|
pUtils->put_error_msg (rc);
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
while (processed<total);
|
||
|
|
||
|
return rc;
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// ShowInterface
|
||
|
//
|
||
|
// Display data for a single interface
|
||
|
//-----------------------------------------------------------------------------
|
||
|
|
||
|
int
|
||
|
ShowInterface (
|
||
|
IN LPTSTR InterfaceName
|
||
|
) {
|
||
|
HANDLE hIfCfg;
|
||
|
HANDLE hIfAdmin;
|
||
|
DWORD rc, rc2;
|
||
|
unsigned count;
|
||
|
PMPR_INTERFACE_0 pRi0;
|
||
|
DWORD sz;
|
||
|
|
||
|
#if defined(UNICODE) || defined (_UNICODE)
|
||
|
#define pInterfaceName InterfaceName
|
||
|
count = wcslen (InterfaceName);
|
||
|
#else
|
||
|
WCHAR InterfaceNameW[MAX_INTERFACE_NAME_LEN+1];
|
||
|
#define pInterfaceName InterfaceNameW
|
||
|
count = mbstowcs (InterfaceNameW, InterfaceName, sizeof (InterfaceNameW));
|
||
|
#endif
|
||
|
|
||
|
|
||
|
//======================================
|
||
|
// Translate the Interface Name
|
||
|
//======================================
|
||
|
rc2 = Description2IfNameW(pInterfaceName,
|
||
|
IfNamBuffer,
|
||
|
&IfNamBufferLength);
|
||
|
//======================================
|
||
|
|
||
|
if (count<=MAX_INTERFACE_NAME_LEN) {
|
||
|
if (pParams->hRouterAdmin)
|
||
|
rc = MprAdminInterfaceGetHandle (
|
||
|
pParams->hRouterAdmin,
|
||
|
(rc2 == NO_ERROR) ? IfNamBuffer : pInterfaceName,
|
||
|
&hIfAdmin,
|
||
|
FALSE
|
||
|
);
|
||
|
else
|
||
|
rc = MprConfigInterfaceGetHandle (
|
||
|
pParams->hRouterConfig,
|
||
|
(rc2 == NO_ERROR) ? IfNamBuffer : pInterfaceName,
|
||
|
&hIfCfg
|
||
|
);
|
||
|
if (rc==NO_ERROR) {
|
||
|
if (pParams->hRouterAdmin)
|
||
|
rc = MprAdminInterfaceGetInfo (
|
||
|
pParams->hRouterAdmin,
|
||
|
hIfAdmin,
|
||
|
0,
|
||
|
(LPBYTE *)&pRi0);
|
||
|
else
|
||
|
rc = MprConfigInterfaceGetInfo (
|
||
|
pParams->hRouterConfig,
|
||
|
hIfCfg,
|
||
|
0,
|
||
|
(LPBYTE *)&pRi0,
|
||
|
&sz);
|
||
|
if (rc==NO_ERROR) {
|
||
|
TCHAR buffer[3][MAX_VALUE];
|
||
|
//======================================
|
||
|
// Translate the Interface Name
|
||
|
//======================================
|
||
|
rc2 = IfName2DescriptionW(pRi0->wszInterfaceName,
|
||
|
IfNamBuffer,
|
||
|
&IfNamBufferLength);
|
||
|
//======================================
|
||
|
if (pParams->hRouterAdmin)
|
||
|
pUtils->put_msg (HIf,
|
||
|
MSG_INTERFACE_RTR_SCREEN_FMT,
|
||
|
(rc2 == NO_ERROR) ? IfNamBuffer : pRi0->wszInterfaceName,
|
||
|
GetValueString (HIf, pUtils, InterfaceTypes,
|
||
|
pRi0->dwIfType, buffer[0]),
|
||
|
GetValueString (HIf, pUtils, InterfaceEnableStatus,
|
||
|
pRi0-> fEnabled ? 0 : 1,
|
||
|
buffer[1]),
|
||
|
GetValueString (HIf, pUtils, InterfaceStates,
|
||
|
pRi0->dwConnectionState, buffer[2])
|
||
|
);
|
||
|
else
|
||
|
pUtils->put_msg (HIf,
|
||
|
MSG_INTERFACE_CFG_SCREEN_FMT,
|
||
|
(rc2 == NO_ERROR) ? IfNamBuffer : pRi0->wszInterfaceName,
|
||
|
IfNamBuffer,
|
||
|
GetValueString (HIf, pUtils, InterfaceTypes,
|
||
|
pRi0->dwIfType, buffer[0]),
|
||
|
GetValueString (HIf, pUtils, InterfaceEnableStatus,
|
||
|
pRi0-> fEnabled ? 0 : 1,
|
||
|
buffer[1])
|
||
|
);
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
if ( rc != NO_ERROR )
|
||
|
{
|
||
|
pUtils->put_error_msg (rc);
|
||
|
}
|
||
|
|
||
|
return rc;
|
||
|
}
|
||
|
|
||
|
else
|
||
|
{
|
||
|
pUtils->put_msg (HIf, MSG_INVALID_INTERFACE_NAME);
|
||
|
return ERROR_INVALID_PARAMETER;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// UpdateInterface
|
||
|
//
|
||
|
// Initiate autostatic updates over an interface
|
||
|
//-----------------------------------------------------------------------------
|
||
|
|
||
|
int
|
||
|
UpdateInterface (
|
||
|
IN LPTSTR InterfaceName,
|
||
|
IN DWORD pid
|
||
|
) {
|
||
|
if (pParams->hRouterAdmin) {
|
||
|
HANDLE hIfAdmin;
|
||
|
DWORD rc, rc2;
|
||
|
unsigned count;
|
||
|
PMPR_INTERFACE_0 pRi0;
|
||
|
|
||
|
#if defined(UNICODE) || defined (_UNICODE)
|
||
|
#define pInterfaceName InterfaceName
|
||
|
count = wcslen (InterfaceName);
|
||
|
#else
|
||
|
WCHAR InterfaceNameW[MAX_INTERFACE_NAME_LEN+1];
|
||
|
#define pInterfaceName InterfaceNameW
|
||
|
count = mbstowcs (InterfaceNameW, InterfaceName, sizeof (InterfaceNameW));
|
||
|
#endif
|
||
|
|
||
|
|
||
|
//======================================
|
||
|
// Translate the Interface Name
|
||
|
//======================================
|
||
|
rc2 = Description2IfNameW(pInterfaceName,
|
||
|
IfNamBuffer,
|
||
|
&IfNamBufferLength);
|
||
|
//======================================
|
||
|
|
||
|
if (count<=MAX_INTERFACE_NAME_LEN) {
|
||
|
rc = MprAdminInterfaceGetHandle (
|
||
|
pParams->hRouterAdmin,
|
||
|
(rc2 == NO_ERROR) ? IfNamBuffer : pInterfaceName,
|
||
|
&hIfAdmin,
|
||
|
FALSE
|
||
|
);
|
||
|
if (rc==NO_ERROR) {
|
||
|
rc = MprAdminInterfaceGetInfo (
|
||
|
pParams->hRouterAdmin,
|
||
|
hIfAdmin,
|
||
|
0,
|
||
|
(LPBYTE *)&pRi0);
|
||
|
if (rc==NO_ERROR) {
|
||
|
if (pRi0->dwIfType==ROUTER_IF_TYPE_FULL_ROUTER) {
|
||
|
HANDLE hEvent = NULL;
|
||
|
if (pParams->fLocalRouter) {
|
||
|
hEvent = CreateEvent (NULL, FALSE, FALSE, NULL);
|
||
|
if (hEvent==NULL) {
|
||
|
rc = GetLastError ();
|
||
|
goto Exit;
|
||
|
}
|
||
|
}
|
||
|
pUtils->put_msg (HIf, MSG_WAIT_FOR_UPDATE);
|
||
|
rc = MprAdminInterfaceUpdateRoutes (
|
||
|
pParams->hRouterAdmin,
|
||
|
hIfAdmin,
|
||
|
pid,
|
||
|
hEvent);
|
||
|
if (pParams->fLocalRouter) {
|
||
|
if (rc==PENDING) {
|
||
|
rc = WaitForSingleObject (hEvent, INFINITE);
|
||
|
ASSERT (rc==WAIT_OBJECT_0);
|
||
|
}
|
||
|
CloseHandle (hEvent);
|
||
|
}
|
||
|
|
||
|
if (rc==NO_ERROR) {
|
||
|
DWORD result;
|
||
|
rc = MprAdminInterfaceQueryUpdateResult (
|
||
|
pParams->hRouterAdmin,
|
||
|
hIfAdmin,
|
||
|
pid,
|
||
|
&result);
|
||
|
if (rc==NO_ERROR)
|
||
|
rc = result;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
rc = ERROR_INVALID_PARAMETER;
|
||
|
Exit:
|
||
|
MprAdminBufferFree (pRi0);
|
||
|
}
|
||
|
if (rc == NO_ERROR) {
|
||
|
pUtils->put_msg (HIf, MSG_UPDATE_COMPLETED);
|
||
|
return rc;
|
||
|
}
|
||
|
else {
|
||
|
pUtils->put_error_msg (rc);
|
||
|
return rc;
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
pUtils->put_error_msg (rc);
|
||
|
return rc;
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
pUtils->put_msg (HIf, MSG_INVALID_INTERFACE_NAME);
|
||
|
return ERROR_INVALID_PARAMETER;
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
pUtils->put_msg (HIf, MSG_ROUTER_NOT_RUNNING);
|
||
|
return NO_ERROR;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// ConnectInterface
|
||
|
//
|
||
|
// Initiate a connect on a demand-dial interface
|
||
|
//-----------------------------------------------------------------------------
|
||
|
|
||
|
int
|
||
|
ConnectInterface (
|
||
|
IN LPTSTR InterfaceName
|
||
|
) {
|
||
|
|
||
|
|
||
|
HANDLE hIfAdmin = NULL;
|
||
|
DWORD rc = (DWORD) -1, rc2;
|
||
|
unsigned count = 0;
|
||
|
PMPR_INTERFACE_0 pRi0 = NULL;
|
||
|
|
||
|
|
||
|
//
|
||
|
// convert interface name to unicode
|
||
|
//
|
||
|
|
||
|
#if defined( UNICODE ) || defined( _UNICODE )
|
||
|
|
||
|
#define pInterfaceName InterfaceName
|
||
|
|
||
|
count = wcslen (InterfaceName);
|
||
|
|
||
|
#else
|
||
|
|
||
|
WCHAR InterfaceNameW[MAX_INTERFACE_NAME_LEN+1];
|
||
|
|
||
|
#define pInterfaceName InterfaceNameW
|
||
|
|
||
|
count = mbstowcs (
|
||
|
InterfaceNameW,
|
||
|
InterfaceName,
|
||
|
sizeof (InterfaceNameW)
|
||
|
);
|
||
|
#endif
|
||
|
|
||
|
//======================================
|
||
|
// Translate the Interface Name
|
||
|
//======================================
|
||
|
rc2 = Description2IfNameW(pInterfaceName,
|
||
|
IfNamBuffer,
|
||
|
&IfNamBufferLength);
|
||
|
//======================================
|
||
|
|
||
|
|
||
|
do
|
||
|
{
|
||
|
|
||
|
//
|
||
|
// check if connected to router
|
||
|
//
|
||
|
|
||
|
if ( !pParams-> hRouterAdmin )
|
||
|
{
|
||
|
pUtils-> put_msg( HIf, MSG_ROUTER_NOT_RUNNING );
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
|
||
|
//
|
||
|
// verify valid interface name
|
||
|
//
|
||
|
|
||
|
if ( count > MAX_INTERFACE_NAME_LEN )
|
||
|
{
|
||
|
pUtils-> put_msg( HIf, MSG_INVALID_INTERFACE_NAME );
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
|
||
|
//
|
||
|
// verify that specified interface is a demand dial interface
|
||
|
//
|
||
|
|
||
|
rc = MprAdminInterfaceGetHandle (
|
||
|
pParams->hRouterAdmin,
|
||
|
(rc2 == NO_ERROR) ? IfNamBuffer : pInterfaceName,
|
||
|
&hIfAdmin,
|
||
|
FALSE
|
||
|
);
|
||
|
|
||
|
if ( rc != NO_ERROR )
|
||
|
{
|
||
|
pUtils-> put_error_msg( rc );
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
|
||
|
rc = MprAdminInterfaceGetInfo (
|
||
|
pParams->hRouterAdmin,
|
||
|
hIfAdmin,
|
||
|
0,
|
||
|
(LPBYTE *) &pRi0
|
||
|
);
|
||
|
|
||
|
if ( rc != NO_ERROR )
|
||
|
{
|
||
|
pUtils-> put_error_msg( rc );
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
|
||
|
if ( pRi0-> dwIfType != ROUTER_IF_TYPE_FULL_ROUTER )
|
||
|
{
|
||
|
pUtils-> put_msg( HIf, ERROR_INVALID_PARAMETER );
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
|
||
|
//
|
||
|
// connect interface.
|
||
|
//
|
||
|
|
||
|
pUtils-> put_msg( HIf, MSG_WAIT_FOR_CONNECT );
|
||
|
|
||
|
rc = MprAdminInterfaceConnect(
|
||
|
pParams-> hRouterAdmin,
|
||
|
hIfAdmin,
|
||
|
NULL,
|
||
|
TRUE
|
||
|
);
|
||
|
|
||
|
if ( rc != NO_ERROR && rc != PENDING )
|
||
|
{
|
||
|
pUtils-> put_error_msg( rc );
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
|
||
|
pUtils-> put_msg( HIf, MSG_CONNECT_COMPLETED );
|
||
|
|
||
|
rc = NO_ERROR;
|
||
|
|
||
|
} while( FALSE );
|
||
|
|
||
|
|
||
|
//
|
||
|
// clean up
|
||
|
//
|
||
|
|
||
|
if ( pRi0 ) { MprAdminBufferFree( pRi0 ); }
|
||
|
|
||
|
return rc;
|
||
|
|
||
|
|
||
|
#if 0
|
||
|
if (pParams->hRouterAdmin) {
|
||
|
|
||
|
HANDLE hIfAdmin;
|
||
|
DWORD rc;
|
||
|
unsigned count;
|
||
|
PMPR_INTERFACE_0 pRi0;
|
||
|
|
||
|
|
||
|
#if defined(UNICODE) || defined (_UNICODE)
|
||
|
#define pInterfaceName InterfaceName
|
||
|
count = wcslen (InterfaceName);
|
||
|
#else
|
||
|
WCHAR InterfaceNameW[MAX_INTERFACE_NAME_LEN+1];
|
||
|
#define pInterfaceName InterfaceNameW
|
||
|
count = mbstowcs (InterfaceNameW, InterfaceName, sizeof (InterfaceNameW));
|
||
|
#endif
|
||
|
|
||
|
|
||
|
if (count<=MAX_INTERFACE_NAME_LEN) {
|
||
|
|
||
|
rc = MprAdminInterfaceGetHandle (
|
||
|
pParams->hRouterAdmin,
|
||
|
(rc2 == NO_ERROR) ? IfNamBuffer : pInterfaceName,
|
||
|
&hIfAdmin,
|
||
|
FALSE
|
||
|
);
|
||
|
|
||
|
if (rc==NO_ERROR) {
|
||
|
|
||
|
rc = MprAdminInterfaceGetInfo (
|
||
|
pParams->hRouterAdmin,
|
||
|
hIfAdmin,
|
||
|
0,
|
||
|
(LPBYTE *)&pRi0);
|
||
|
|
||
|
if (rc==NO_ERROR) {
|
||
|
|
||
|
if (pRi0->dwIfType==ROUTER_IF_TYPE_FULL_ROUTER) {
|
||
|
|
||
|
HANDLE hEvent = NULL;
|
||
|
|
||
|
if (pParams->fLocalRouter) {
|
||
|
hEvent = CreateEvent (NULL, FALSE, FALSE, NULL);
|
||
|
if (hEvent==NULL) {
|
||
|
rc = GetLastError ();
|
||
|
goto Exit;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
pUtils->put_msg (HIf, MSG_WAIT_FOR_CONNECT);
|
||
|
|
||
|
rc = MprAdminInterfaceConnect (
|
||
|
pParams->hRouterAdmin,
|
||
|
hIfAdmin,
|
||
|
hEvent,
|
||
|
TRUE
|
||
|
);
|
||
|
|
||
|
if (pParams->fLocalRouter) {
|
||
|
if (rc==PENDING) {
|
||
|
rc = WaitForSingleObject (hEvent, INFINITE);
|
||
|
ASSERT (rc==WAIT_OBJECT_0);
|
||
|
}
|
||
|
|
||
|
CloseHandle (hEvent);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
rc = ERROR_INVALID_PARAMETER;
|
||
|
Exit:
|
||
|
MprAdminBufferFree (pRi0);
|
||
|
}
|
||
|
|
||
|
if (rc==NO_ERROR) {
|
||
|
pUtils->put_msg (HIf, MSG_CONNECT_COMPLETED);
|
||
|
return 0;
|
||
|
}
|
||
|
else {
|
||
|
pUtils->put_error_msg (rc);
|
||
|
return 1;
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
pUtils->put_error_msg (rc);
|
||
|
return 1;
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
pUtils->put_msg (HIf, MSG_INVALID_INTERFACE_NAME);
|
||
|
return 1;
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
pUtils->put_msg (HIf, MSG_ROUTER_NOT_RUNNING);
|
||
|
return 1;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// DisconnectInterface
|
||
|
//
|
||
|
// Disconnect a demand-dial interface
|
||
|
//-----------------------------------------------------------------------------
|
||
|
|
||
|
int
|
||
|
DisconnectInterface (
|
||
|
IN LPTSTR InterfaceName
|
||
|
) {
|
||
|
if (pParams->hRouterAdmin) {
|
||
|
HANDLE hIfAdmin;
|
||
|
DWORD rc, rc2;
|
||
|
unsigned count;
|
||
|
PMPR_INTERFACE_0 pRi0;
|
||
|
|
||
|
#if defined(UNICODE) || defined (_UNICODE)
|
||
|
#define pInterfaceName InterfaceName
|
||
|
count = wcslen (InterfaceName);
|
||
|
#else
|
||
|
WCHAR InterfaceNameW[MAX_INTERFACE_NAME_LEN+1];
|
||
|
#define pInterfaceName InterfaceNameW
|
||
|
count = mbstowcs (InterfaceNameW, InterfaceName, sizeof (InterfaceNameW));
|
||
|
#endif
|
||
|
|
||
|
//======================================
|
||
|
// Translate the Interface Name
|
||
|
//======================================
|
||
|
rc2 = Description2IfNameW(pInterfaceName,
|
||
|
IfNamBuffer,
|
||
|
&IfNamBufferLength);
|
||
|
//======================================
|
||
|
|
||
|
if (count<=MAX_INTERFACE_NAME_LEN) {
|
||
|
rc = MprAdminInterfaceGetHandle (
|
||
|
pParams->hRouterAdmin,
|
||
|
(rc2 == NO_ERROR) ? IfNamBuffer : pInterfaceName,
|
||
|
&hIfAdmin,
|
||
|
FALSE
|
||
|
);
|
||
|
if (rc==NO_ERROR) {
|
||
|
rc = MprAdminInterfaceGetInfo (
|
||
|
pParams->hRouterAdmin,
|
||
|
hIfAdmin,
|
||
|
0,
|
||
|
(LPBYTE *)&pRi0);
|
||
|
if (rc==NO_ERROR) {
|
||
|
if (pRi0->dwIfType==ROUTER_IF_TYPE_FULL_ROUTER) {
|
||
|
rc = MprAdminInterfaceDisconnect (
|
||
|
pParams->hRouterAdmin,
|
||
|
hIfAdmin);
|
||
|
}
|
||
|
else
|
||
|
rc = ERROR_INVALID_PARAMETER;
|
||
|
//Exit:
|
||
|
MprAdminBufferFree (pRi0);
|
||
|
}
|
||
|
if (rc==NO_ERROR) {
|
||
|
pUtils->put_msg (HIf, MSG_DISCONNECT_COMPLETED);
|
||
|
return rc;
|
||
|
}
|
||
|
else {
|
||
|
pUtils->put_error_msg (rc);
|
||
|
return rc;
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
pUtils->put_error_msg (rc);
|
||
|
return rc;
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
pUtils->put_msg (HIf, MSG_INVALID_INTERFACE_NAME);
|
||
|
return ERROR_INVALID_PARAMETER;
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
pUtils->put_msg (HIf, MSG_ROUTER_NOT_RUNNING);
|
||
|
return NO_ERROR;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// EnableInterface
|
||
|
//
|
||
|
// Enable/disable a demand-dial interface.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
|
||
|
int
|
||
|
EnableInterface(
|
||
|
IN LPTSTR lpInterface,
|
||
|
IN BOOL bEnable
|
||
|
)
|
||
|
{
|
||
|
|
||
|
DWORD dwCount = 0,
|
||
|
dwSize = 0,
|
||
|
rc2 = 0,
|
||
|
dwErr = (DWORD) -1;
|
||
|
|
||
|
HANDLE hInterface = NULL;
|
||
|
|
||
|
PMPR_INTERFACE_0 pMprIf0 = NULL;
|
||
|
|
||
|
|
||
|
//
|
||
|
// convert interface name to Unicode
|
||
|
//
|
||
|
|
||
|
#if defined( UNICODE ) || defined( _UNICODE )
|
||
|
|
||
|
#define lpInterfaceName lpInterface
|
||
|
|
||
|
dwCount = wcslen( lpInterface );
|
||
|
|
||
|
#else
|
||
|
|
||
|
WCHAR InterfaceNameW[MAX_INTERFACE_NAME_LEN+1];
|
||
|
|
||
|
#define lpInterfaceName InterfaceNameW
|
||
|
|
||
|
dwCount = mbstowcs (
|
||
|
InterfaceNameW,
|
||
|
lpInterface,
|
||
|
sizeof( InterfaceNameW )
|
||
|
);
|
||
|
#endif
|
||
|
|
||
|
//======================================
|
||
|
// Translate the Interface Name
|
||
|
//======================================
|
||
|
rc2 = Description2IfNameW(lpInterfaceName,
|
||
|
IfNamBuffer,
|
||
|
&IfNamBufferLength);
|
||
|
//======================================
|
||
|
|
||
|
//
|
||
|
// Error break out loop
|
||
|
//
|
||
|
|
||
|
do
|
||
|
{
|
||
|
//
|
||
|
// Update the enable flag in the router config
|
||
|
//
|
||
|
|
||
|
dwErr = MprConfigInterfaceGetHandle(
|
||
|
pParams-> hRouterConfig,
|
||
|
(rc2 == NO_ERROR) ? IfNamBuffer : lpInterfaceName,
|
||
|
&hInterface
|
||
|
);
|
||
|
|
||
|
if ( dwErr != NO_ERROR )
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
|
||
|
dwErr = MprConfigInterfaceGetInfo(
|
||
|
pParams-> hRouterConfig,
|
||
|
hInterface,
|
||
|
0,
|
||
|
(LPBYTE *) &pMprIf0,
|
||
|
&dwSize
|
||
|
);
|
||
|
|
||
|
if ( dwErr != NO_ERROR )
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
pMprIf0-> fEnabled = bEnable;
|
||
|
|
||
|
|
||
|
dwErr = MprConfigInterfaceSetInfo(
|
||
|
pParams-> hRouterConfig,
|
||
|
hInterface,
|
||
|
0,
|
||
|
(LPBYTE) pMprIf0
|
||
|
);
|
||
|
|
||
|
if ( dwErr != NO_ERROR )
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
|
||
|
//
|
||
|
// if you have a handle to the router service, update
|
||
|
// the interface in the router service as well.
|
||
|
//
|
||
|
|
||
|
if ( !pParams-> hRouterAdmin )
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
|
||
|
dwErr = MprAdminInterfaceGetHandle(
|
||
|
pParams-> hRouterAdmin,
|
||
|
(rc2 == NO_ERROR) ? IfNamBuffer : lpInterfaceName,
|
||
|
&hInterface,
|
||
|
FALSE
|
||
|
);
|
||
|
|
||
|
if ( dwErr != NO_ERROR )
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
|
||
|
dwErr = MprAdminInterfaceSetInfo(
|
||
|
pParams-> hRouterAdmin,
|
||
|
hInterface,
|
||
|
0,
|
||
|
(LPBYTE) pMprIf0
|
||
|
);
|
||
|
|
||
|
if ( dwErr != NO_ERROR )
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
} while ( FALSE );
|
||
|
|
||
|
|
||
|
if ( dwErr != NO_ERROR ) { pUtils-> put_error_msg( dwErr ); }
|
||
|
|
||
|
if ( pMprIf0 ) { MprConfigBufferFree( pMprIf0 ); }
|
||
|
|
||
|
return (int) dwErr;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
typedef DWORD (*PRasValidateEntryName)(
|
||
|
LPWSTR lpszPhonebook, // pointer to full path and filename of phone-book file
|
||
|
LPWSTR lpszEntry // pointer to the entry name to validate
|
||
|
);
|
||
|
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// IsPhoneBookEntry
|
||
|
//
|
||
|
// Verify that a phone book entry is present for a specified interface
|
||
|
//-----------------------------------------------------------------------------
|
||
|
|
||
|
DWORD
|
||
|
IsPhoneBookEntry (
|
||
|
LPWSTR InterfaceNameW
|
||
|
) {
|
||
|
|
||
|
|
||
|
HMODULE hRasApi32;
|
||
|
PRasValidateEntryName RasValidateEntryName;
|
||
|
DWORD rc;
|
||
|
WCHAR wszPbPath[MAX_PATH+1];
|
||
|
|
||
|
|
||
|
//
|
||
|
// get phone book path + file name
|
||
|
//
|
||
|
|
||
|
if ( pParams->fLocalRouter ) {
|
||
|
|
||
|
rc = ExpandEnvironmentStringsW (
|
||
|
LOCAL_ROUTER_PB_PATHW,
|
||
|
wszPbPath,
|
||
|
sizeof (wszPbPath)/sizeof (wszPbPath[0])
|
||
|
);
|
||
|
}
|
||
|
|
||
|
else {
|
||
|
|
||
|
rc = wsprintfW (wszPbPath, REMOTE_ROUTER_PB_PATHW, pParams->wszRouterName);
|
||
|
}
|
||
|
|
||
|
ASSERT (rc > 0);
|
||
|
|
||
|
|
||
|
//
|
||
|
// Load RASAPI32 DLL and call into it to verify specified
|
||
|
// phone book entry
|
||
|
//
|
||
|
|
||
|
hRasApi32 = LoadLibrary ("RASAPI32.DLL");
|
||
|
|
||
|
if (hRasApi32!=NULL) {
|
||
|
|
||
|
RasValidateEntryName = (PRasValidateEntryName)
|
||
|
GetProcAddress (
|
||
|
hRasApi32,
|
||
|
"RasValidateEntryNameW"
|
||
|
);
|
||
|
|
||
|
if ( RasValidateEntryName != NULL ) {
|
||
|
|
||
|
rc = RasValidateEntryName (
|
||
|
wszPbPath,
|
||
|
InterfaceNameW
|
||
|
);
|
||
|
|
||
|
if ( rc == NO_ERROR )
|
||
|
rc = ERROR_CANNOT_FIND_PHONEBOOK_ENTRY;
|
||
|
|
||
|
else if (rc == ERROR_ALREADY_EXISTS)
|
||
|
rc = NO_ERROR;
|
||
|
}
|
||
|
else
|
||
|
rc = GetLastError ();
|
||
|
|
||
|
FreeLibrary (hRasApi32);
|
||
|
}
|
||
|
else
|
||
|
rc = GetLastError ();
|
||
|
|
||
|
return rc;
|
||
|
}
|