From 15dc7906df1dbd575f2978454d54098ffeb58cb0 Mon Sep 17 00:00:00 2001 From: Elliu <elliu@hashi.re> Date: Sat, 4 Dec 2021 01:02:58 -0800 Subject: [PATCH] Fix mkvpropedit__ --- src/mkv/write.c | 77 ++++++++++++++++++++++++++++++++++++---- src/module/module_repo.c | 8 +++++ 2 files changed, 79 insertions(+), 6 deletions(-) diff --git a/src/mkv/write.c b/src/mkv/write.c index e652045a..4907593b 100644 --- a/src/mkv/write.c +++ b/src/mkv/write.c @@ -43,10 +43,10 @@ "</Tag> " \ "</Tags> " +#if !(defined(LKT_OS_WIN) && (LKT_OS_WIN == 1)) static bool mkvpropedit__(const char *const args[]) { -#if !(defined(LKT_OS_WIN) && (LKT_OS_WIN == 1)) pid_t pid; int wstatus, status, fd; @@ -93,10 +93,63 @@ mkvpropedit__(const char *const args[]) } return true; +} #else - LOG_ERROR("MKV", "The call to mkvpropedit call is not implemented in windows"); - (void)args; - return false; +static bool +mkvpropedit__(char* command) +{ + bool sta = false; + STARTUPINFO si; + PROCESS_INFORMATION pi; + ZeroMemory(&si, sizeof(si)); + si.cb = sizeof(si); + ZeroMemory(&pi, sizeof(pi)); + + if (!CreateProcessA( + NULL, + command, + NULL, + NULL, + FALSE, + 0, + NULL, + NULL, + &si, + &pi + ) + ){ + DWORD err = GetLastError(); + LOG_ERROR("FORK", "Failed to create process: error %d", err); + return false; + } + + WaitForSingleObject(pi.hProcess, INFINITE); + + DWORD exitCode; + if (GetExitCodeProcess(pi.hProcess, &exitCode)){ + if (exitCode == 0) + goto success; + if (exitCode == 2) + LOG_ERROR( + "FORK", + "Status 2 with mkvpropedit could means that karas are not valid MKV files"); + else if (exitCode == 1) + LOG_WARN("FORK", + "Status 1 on mkvpropedit means that it generated some warnings..."); + } else { + LOG_ERROR( + "FORK", + "Can't get exit code of created process: something probably went wrong..."); + goto error; + } + +success: + sta = true; +error: + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + + return sta; #endif } @@ -104,8 +157,6 @@ int kara_metadata_write(struct kara_metadata *mdt, const char *filename) { char tmpfilepath[PATH_MAX]; - const char *args1[] = { "mkvpropedit", "-t", "all:", filename, NULL }; - const char *args2[] = { "mkvpropedit", "-t", tmpfilepath, filename, NULL }; int sta = -1; memset(tmpfilepath, 0, PATH_MAX); @@ -148,7 +199,21 @@ kara_metadata_write(struct kara_metadata *mdt, const char *filename) } #endif +#if !(defined(LKT_OS_WIN) && (LKT_OS_WIN == 1)) + const char *args1[] = { "mkvpropedit", "-t", "all:", filename, NULL }; + const char *args2[] = { "mkvpropedit", "-t", tmpfilepath, filename, NULL }; if (!mkvpropedit__(args1) || !mkvpropedit__(args2)) +#else + char cmd1[MAX_PATH] = "mkvpropedit -t all: "; + char cmd2[MAX_PATH] = "mkvpropedit -t "; + size_t filenameLen = strlen(filename); + size_t tmpfilepathLen = strlen(tmpfilepath); + strncat(cmd1, filename, MAX_PATH - 23 - filenameLen); + strncat(cmd2, tmpfilepath, MAX_PATH - 19 - tmpfilepathLen); + strncat(cmd2, " ", MAX_PATH - 20 - tmpfilepathLen); + strncat(cmd2, filename, MAX_PATH - 20 - tmpfilepathLen - filenameLen); + if (!mkvpropedit__(cmd1) || !mkvpropedit__(cmd2)) +#endif goto error; sta = 0; diff --git a/src/module/module_repo.c b/src/module/module_repo.c index 0756b0d2..dba6bc00 100644 --- a/src/module/module_repo.c +++ b/src/module/module_repo.c @@ -581,10 +581,18 @@ setup_kara_struct(struct module_repo_internal *repo, bool dry_update, struct lkt memcpy(kara.database_filepath, repo->kara_dir, kara.kara_dir_len); memcpy(kara.filename, repo->kara_dir, kara.kara_dir_len); +#if !(defined(LKT_OS_WIN) && (LKT_OS_WIN == 1)) if (kara.database_filepath[kara.kara_dir_len - 1] != '/') { strncat(kara.database_filepath, "/", PATH_MAX - 1); kara.database_filepath[++kara.kara_dir_len] = 0; } +#else + if (kara.database_filepath[kara.kara_dir_len - 1] != '\\') { + strncat(kara.database_filepath, "\\", PATH_MAX - 1); + kara.database_filepath[++kara.kara_dir_len] = 0; + } +#endif + return kara; } -- GitLab