|
|
/*
File: LoadSave.c
Handles routemon options to load and save router configuration. */
#include "precomp.h"
#define LOADSAVE_PATH_SIZE 512
//
// Defines a macro to perform string copies to
// unicode strings regardless of the UNICODE setting.
//
#if defined( UNICODE ) || defined( _UNICODE )
#define LoadSaveStrcpy(dst, src) wcscpy((dst), (src));
#else
#define LoadSaveStrcpy(dst, src) mbstowcs((dst), (src), strlen((src)));
#endif
//
// Defines structure of parameters that can be sent to
// a load/save config call.
//
typedef struct _LOADSAVE_PARAMS { WCHAR pszPath[LOADSAVE_PATH_SIZE]; } LOADSAVE_PARAMS, * PLOADSAVE_PARAMS;
//
// Returns a static error message
//
PWCHAR LoadSaveError (DWORD dwErr) { static WCHAR pszRet[512];
ZeroMemory(pszRet, sizeof(pszRet));
FormatMessageW (FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwErr, 0, pszRet, sizeof(pszRet) / sizeof(WCHAR), NULL); return pszRet; }
//
// Parse the load save config command line and fills
// the parameters accordingly.
//
DWORD LoadSaveParse ( IN int argc, IN TCHAR *argv[], IN PROUTEMON_PARAMS pRmParams, IN PROUTEMON_UTILS pUtils, IN BOOL bLoad, OUT LOADSAVE_PARAMS * pParams) { DWORD dwLen;
// Initialize the return val
ZeroMemory(pParams, sizeof(LOADSAVE_PARAMS)); // Make sure a path has been provided
if (argc == 0) { pUtils->put_msg (GetModuleHandle(NULL), MSG_LOADSAVE_HELP, pRmParams->pszProgramName); return ERROR_CAN_NOT_COMPLETE; } // Copy over the path
LoadSaveStrcpy (pParams->pszPath, argv[0]);
// Add a '\' to the end of the path if not provided
// dwLen = wcslen (pParams->pszPath);
// if (pParams->pszPath[dwLen - 1] != L'\\') {
// pParams->pszPath[dwLen] = L'\\';
// pParams->pszPath[dwLen + 1] = (WCHAR)0;
// }
return NO_ERROR; }
//
// The load/save engine
//
DWORD LoadSaveConfig ( IN PROUTEMON_PARAMS pRmParams, IN PROUTEMON_UTILS pUtils, IN PLOADSAVE_PARAMS pLsParams, IN BOOL bLoad) { DWORD dwErr; if (bLoad) dwErr = MprConfigServerRestore (pRmParams->hRouterConfig, pLsParams->pszPath); else dwErr = MprConfigServerBackup (pRmParams->hRouterConfig, pLsParams->pszPath);
return dwErr; }
//
// Handles request to load config
//
DWORD APIENTRY LoadMonitor ( IN int argc, IN TCHAR *argv[], IN PROUTEMON_PARAMS params, IN PROUTEMON_UTILS utils ) { DWORD dwErr; LOADSAVE_PARAMS LsParams; HINSTANCE hInst = GetModuleHandle(NULL);
if ((dwErr = LoadSaveParse (argc, argv, params, utils, TRUE, &LsParams)) != NO_ERROR) return dwErr;
dwErr = LoadSaveConfig (params, utils, &LsParams, TRUE);
switch (dwErr) { case NO_ERROR: utils->put_msg(hInst, MSG_LOAD_SUCCESS, LsParams.pszPath); break;
case ERROR_ROUTER_CONFIG_INCOMPATIBLE: utils->put_msg(hInst, MSG_LOAD_INCOMPATIBLE, LsParams.pszPath); break;
case ERROR_ACCESS_DENIED: utils->put_msg(hInst, MSG_LOAD_FAIL_ACCESSDENIED); default: utils->put_msg( hInst, MSG_LOAD_FAIL, LsParams.pszPath, LoadSaveError(dwErr)); break; } return dwErr; }
//
// Handles request to save config
//
DWORD APIENTRY SaveMonitor ( IN int argc, IN TCHAR *argv[], IN PROUTEMON_PARAMS params, IN PROUTEMON_UTILS utils ) { DWORD dwErr; LOADSAVE_PARAMS LsParams;
if ((dwErr = LoadSaveParse (argc, argv, params, utils, FALSE, &LsParams)) != NO_ERROR) return dwErr;
dwErr = LoadSaveConfig (params, utils, &LsParams, FALSE);
if (dwErr == NO_ERROR) utils->put_msg(GetModuleHandle(NULL), MSG_SAVE_SUCCESS, LsParams.pszPath); else utils->put_msg(GetModuleHandle(NULL), MSG_SAVE_FAIL, LsParams.pszPath, LoadSaveError(dwErr)); return dwErr; }
|