windows-nt/Source/XPSP1/NT/net/rras/routemon/if.c
2020-09-26 16:20:57 +08:00

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;
}