|
|
/*
File: client.c
Support for netsh commands that manipulate ras clients.
*/
#include "precomp.h"
#pragma hdrstop
//
// Callback function for enumerating clients
//
typedef DWORD (*CLIENT_ENUM_CB_FUNC)( IN DWORD dwLevel, IN LPBYTE pbClient, IN HANDLE hData);
//
// Client enumerate callback that displays the connection
//
DWORD ClientShow( IN DWORD dwLevel, IN LPBYTE pbClient, IN HANDLE hData) { RAS_CONNECTION_0 * pClient = (RAS_CONNECTION_0*)pbClient; DWORD dwDays, dwHours, dwMins, dwSecs, dwTime, dwTemp;
dwTime = pClient->dwConnectDuration; dwDays = dwTime / (24*60*60); dwTemp = dwTime - (dwDays * 24*60*60); // temp is # of secs in cur day
dwHours = dwTemp / (60*60); dwTemp = dwTemp - (dwHours * 60*60); // temp is # of secs in cur min
dwMins = dwTemp / 60; dwSecs = dwTemp % 60;
DisplayMessage( g_hModule, MSG_CLIENT_SHOW, pClient->wszUserName, pClient->wszLogonDomain, pClient->wszRemoteComputer, dwDays, dwHours, dwMins, dwSecs);
return NO_ERROR; }
//
// Enumerates the client connections
//
DWORD ClientEnum( IN CLIENT_ENUM_CB_FUNC pEnum, IN DWORD dwLevel, IN HANDLE hData) { DWORD dwErr = NO_ERROR; HANDLE hAdmin = NULL; LPBYTE pbBuffer = NULL; DWORD dwRead, dwTot, dwResume = 0, i; RAS_CONNECTION_0 * pCur; BOOL bContinue = FALSE;
do { // Connection to mpr api server
//
dwErr = MprAdminServerConnect( g_pServerInfo->pszServer, &hAdmin); BREAK_ON_DWERR(dwErr);
do { // Enumerate
//
dwErr = MprAdminConnectionEnum( hAdmin, dwLevel, &pbBuffer, 4096, &dwRead, &dwTot, &dwResume); if (dwErr == ERROR_MORE_DATA) { dwErr = NO_ERROR; bContinue = TRUE; } else { bContinue = FALSE; } if (dwErr != NO_ERROR) { break; }
// Call the callback for each connection as long
// as we're instructed to keep going
//
pCur = (RAS_CONNECTION_0*)pbBuffer; for (i = 0; (i < dwRead) && (dwErr == NO_ERROR); i++) { if (pCur->dwInterfaceType == ROUTER_IF_TYPE_CLIENT) { dwErr = (*pEnum)( dwLevel, (LPBYTE)pCur, hData); } pCur++; } if (dwErr != NO_ERROR) { break; } // Free up the interface list buffer
//
if (pbBuffer) { MprAdminBufferFree(pbBuffer); pbBuffer = NULL; }
// Keep this loop going until there are
// no more connections
//
} while (bContinue);
} while (FALSE);
// Cleanup
{ if (hAdmin) { MprAdminServerDisconnect(hAdmin); } }
return dwErr; }
//
// Shows whether HandleRasflagSet has been called on the
// given domain.
//
DWORD HandleClientShow( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) { DWORD dwErr = NO_ERROR;
// Make sure no arguments were passed in
//
if (dwArgCount - dwCurrentIndex != 0) { return ERROR_INVALID_SYNTAX; }
dwErr = ClientEnum(ClientShow, 0, NULL); if (RPC_S_UNKNOWN_IF == dwErr) { DisplayMessage( g_hModule, EMSG_UNABLE_TO_ENUM_CLIENTS);
dwErr = NO_ERROR; }
return dwErr; }
|