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