diff --git a/src/mkv/write.c b/src/mkv/write.c index e35903e5d24e9669263545aa530566703002b57c..e652045a271980bfc5fb8b94d3816475eb9c24c1 100644 --- a/src/mkv/write.c +++ b/src/mkv/write.c @@ -104,28 +104,48 @@ int kara_metadata_write(struct kara_metadata *mdt, const char *filename) { char tmpfilepath[PATH_MAX]; - char *const metadafilepath = &tmpfilepath[4]; const char *args1[] = { "mkvpropedit", "-t", "all:", filename, NULL }; const char *args2[] = { "mkvpropedit", "-t", tmpfilepath, filename, NULL }; - int fd, sta = -1; + int sta = -1; memset(tmpfilepath, 0, PATH_MAX); - strncat(tmpfilepath, "all:/tmp/lektor.metadata.XXXXXX", PATH_MAX - 1); +#if !(defined(LKT_OS_WIN) && (LKT_OS_WIN == 1)) + char *const metadafilepath = &tmpfilepath[4]; + strncat(tmpfilepath, "all:/tmp/lektor.metadata.XXXXXX", PATH_MAX - 1); + int fd; if ((fd = mkstemp(metadafilepath)) < 0) { LOG_ERROR("MKV", "Failed to create temporary file: %s", strerror(errno)); goto error; } - -#if !(defined(LKT_OS_WIN) && (LKT_OS_WIN == 1)) - // dprintf doesn't exist, used _get_osfhandle if (dprintf(fd, METADATA_TEMPLATE, mdt->source_name, mdt->song_name, mdt->category, mdt->language, mdt->author_name, mdt->song_type, mdt->song_number) < 0) { LOG_ERROR("MKV", "Failed to write to temporary file: %s", metadafilepath); goto error; } #else - (void)mdt; + DWORD err = GetTempPathA(PATH_MAX, tmpfilepath); + if (err == 0 || err > MAX_PATH){ + LOG_ERROR("MKV", "Failed to get tmp directory"); + goto error; + } + FILE* handle; + char metadafilepath[PATH_MAX] = "lektor.metadata.XXXXXX"; + if (_mktemp_s(metadafilepath, PATH_MAX)) + { + LOG_ERROR("MKV", "Failed to create temporary filename"); + goto error; + } + strncat(tmpfilepath, metadafilepath, PATH_MAX - 1); + if (fopen_s(&handle, tmpfilepath, "w")){ + LOG_ERROR("MKV", "Failed to create temporary file %s", metadafilepath); + goto error; + } + if (fprintf(handle, METADATA_TEMPLATE, mdt->source_name, mdt->song_name, mdt->category, + mdt->language, mdt->author_name, mdt->song_type, mdt->song_number) < 0) { + LOG_ERROR("MKV", "Failed to write to temporary file: %s", metadafilepath); + goto error; + } #endif if (!mkvpropedit__(args1) || !mkvpropedit__(args2)) @@ -133,7 +153,11 @@ kara_metadata_write(struct kara_metadata *mdt, const char *filename) sta = 0; error: +#if !(defined(LKT_OS_WIN) && (LKT_OS_WIN == 1)) close(fd); +#else + fclose(handle); +#endif unlink(metadafilepath); return sta; }