From fc987bea52a4f7394edc24828b9237f72cb98114 Mon Sep 17 00:00:00 2001 From: Martin Willi Date: Wed, 5 Mar 2014 15:45:42 +0100 Subject: [PATCH] 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. --- src/charon-svc/charon-svc.c | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/charon-svc/charon-svc.c b/src/charon-svc/charon-svc.c index 3f4b80dce..c21fc1ff5 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); + } } }