From: Martin Willi Date: Wed, 5 Mar 2014 14:45:42 +0000 (+0100) Subject: charon-svc: When running as service, change working directory to executable X-Git-Tag: 5.2.0dr6~24^2~32 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=fc987bea52a4f7394edc24828b9237f72cb98114;p=thirdparty%2Fstrongswan.git charon-svc: When running as service, change working directory to executable Services get executed with system32 as current working directory. This does not work for us, as we expect paths to be relative to the executable. --- diff --git a/src/charon-svc/charon-svc.c b/src/charon-svc/charon-svc.c index 3f4b80dced..c21fc1ff55 100644 --- a/src/charon-svc/charon-svc.c +++ b/src/charon-svc/charon-svc.c @@ -215,6 +215,32 @@ static DWORD service_handler(DWORD dwControl, DWORD dwEventType, } } +/** + * Switch the working directory to the executable directory + */ +static bool switch_workingdir() +{ + CHAR path[MAX_PATH], *pos; + HMODULE module; + + module = GetModuleHandle(NULL); + if (!module) + { + return FALSE; + } + if (!GetModuleFileName(module, path, sizeof(path))) + { + return FALSE; + } + pos = strrchr(path, '\\'); + if (!pos) + { + return FALSE; + } + *pos = 0; + return SetCurrentDirectory(path); +} + /** * Service main routine when running as service */ @@ -228,7 +254,10 @@ static void service_main(DWORD dwArgc, LPTSTR *lpszArgv) handle = RegisterServiceCtrlHandlerEx(SERVICE_NAME, service_handler, NULL); if (handle) { - init_and_run(dwArgc, lpszArgv); + if (switch_workingdir()) + { + init_and_run(dwArgc, lpszArgv); + } } }