From 0598fad8278137a4795ef3f00be8babc5b281e08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lesimple?= Date: Mon, 31 Aug 2020 22:09:48 +0200 Subject: [PATCH] fix: windows: config file couldn't be written now cfg and log file will be in the same directory than the exe (portable mode) --- closure.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++----- logfile.c | 4 ++++ 2 files changed, 50 insertions(+), 5 deletions(-) diff --git a/closure.c b/closure.c index aea7f6d..10c4395 100644 --- a/closure.c +++ b/closure.c @@ -28,6 +28,33 @@ #define Verbose(format, ...) #endif + +#ifdef SYS_MINGW +#include + +/* safety margin in case we're getting UTF path names */ +#define WIN_MAX_PATH (4*MAX_PATH) + +/* + * Find the place of our executable + * (Windows only) + */ + +static char* get_exe_path() +{ char path[WIN_MAX_PATH]; + int n = GetModuleFileNameA(NULL, path, WIN_MAX_PATH); + + if(n>0 && nbinDir = g_strdup(SRCDIR); Closure->docDir = g_strdup_printf("%s/documentation",SRCDIR); @@ -50,26 +77,40 @@ static void get_base_dirs() /*** Otherwise try the installation directory. On Unices this is a hardcoded directory. */ -#if defined(SYS_LINUX) || defined(SYS_FREEBSD) || defined(SYS_KFREEBSD) || \ - defined(SYS_NETBSD) || defined(SYS_HURD) || defined(SYS_UNKNOWN) +#ifndef SYS_MINGW if(DirStat(BINDIR)) Closure->binDir = g_strdup(BINDIR); if(DirStat(DOCDIR)) Closure->docDir = g_strdup(DOCDIR); Verbose("Using hardcoded BINDIR = %s, DOCDIR = %s\n", BINDIR, DOCDIR); +#else + Closure->binDir = get_exe_path(); + /* We'll just put the 2 PDF in the same dir, portable mode */ + Closure->docDir = g_strdup(Closure->binDir); + Verbose("Using path from get_exe_path() = %s\n", Closure->binDir); #endif + /*** The location of the dotfile depends on the operating system. Under Unix the users home directory is used. */ -#ifdef WITH_EMBEDDED_SRC_PATH_YES +#if defined(WITH_EMBEDDED_SRC_PATH_YES) && !defined(SYS_MINGW) find_dotfile: #endif /* WITH_EMBEDDED_SRC_PATH_YES */ +#ifndef SYS_MINGW Closure->homeDir = g_strdup(g_getenv("HOME")); +#else + Closure->homeDir = g_strdup(Closure->binDir); /* portable mode */ +#endif if(!Closure->dotFile) /* may have been set by the --resource-file option */ +#ifndef SYS_MINGW Closure->dotFile = g_strdup_printf("%s/.dvdisaster", Closure->homeDir); +#else + /* Windows doesn't really love dotfiles */ + Closure->dotFile = g_strdup_printf("%s/dvdisaster.cfg", Closure->homeDir); +#endif Verbose("\nUsing file locations:\n" "- Homedir: %s\n" diff --git a/logfile.c b/logfile.c index ce41c6f..6f84e28 100644 --- a/logfile.c +++ b/logfile.c @@ -29,7 +29,11 @@ void DefaultLogFile() { +#ifndef SYS_MINGW Closure->logFile = g_strdup_printf("%s/.dvdisaster.log", g_getenv("HOME")); +#else + Closure->logFile = g_strdup_printf("%s/dvdisaster.log", Closure->homeDir); /* portable mode */ +#endif } /*