From ce87d368bd3e9b6c05ed9f6fdbb97580f105bbcf Mon Sep 17 00:00:00 2001 From: bigfoot547 Date: Wed, 3 Jan 2024 05:18:11 -0600 Subject: refactor and download asset index --- src/version.c | 160 +++------------------------------------------------------- 1 file changed, 7 insertions(+), 153 deletions(-) (limited to 'src/version.c') diff --git a/src/version.c b/src/version.c index 7ca1487..54bdc20 100644 --- a/src/version.c +++ b/src/version.c @@ -124,7 +124,7 @@ void l2_version__load_local(const char *id, size_t expectsz, l2_sha1_digest_t *d FILE *ver = fopen(path, "r"); if (!ver) return; - int res = l2_version_check_integrity(ver, digest, expectsz); + int res = l2_launcher_check_integrity(ver, digest, expectsz); if (res < 0) { CMD_WARN("Error checking version file integrity for %s", id); return; @@ -564,43 +564,10 @@ cleanup: return res; } -int l2_version_check_integrity(FILE *fp, const l2_sha1_digest_t *digest, size_t sz) -{ - #define VER_READBUF_SZ (1024) - - size_t len = 0, nread; - uint8_t buf[VER_READBUF_SZ]; - l2_sha1_digest_t rdigest; - l2_sha1_state_t st; - - if (!digest && sz == 0) return 1; - - l2_sha1_init(&st); - - while ((nread = fread(buf, 1, VER_READBUF_SZ, fp)) > 0) { - len += nread; - l2_sha1_update(&st, buf, nread); - } - - if (ferror(fp)) return -1; - - l2_sha1_finalize(&st, &rdigest); - - if (sz > 0 && sz != len) return 0; - - if (digest) { - return !l2_sha1_digest_compare(&rdigest, digest) ? 1 : 0; - } else { - return 1; - } -} - unsigned l2_version__collect_libraries(json_t *jlibs, l2_subst_t *subst, struct l2_version_library **libs, l2_version_feature_match_proc_t *feature_matcher); void l2_version_free_libraries(struct l2_version_library *libs); int l2_version__get_library_artifact_path(json_t *lib, l2_subst_t *subst, const char *classifier, char **path); -int l2_version__should_download(const char *path, const l2_sha1_digest_t *expectdigest, size_t expectsize); - struct l2_version__library_dl_data { l2_sha1_state_t st; size_t sz; @@ -714,7 +681,7 @@ unsigned l2_version_download_libraries(struct l2_version_library *libs) } for (struct l2_version_library *cur = libs; cur; cur = cur->next) { - dlres = l2_version__should_download(cur->fullpath, cur->has_digest ? &cur->digest : NULL, cur->size); + dlres = l2_launcher_should_download(cur->fullpath, cur->has_digest ? &cur->digest : NULL, cur->size); if (dlres < 0) { res = VERSION_EDOWNLOAD; goto cleanup; @@ -791,7 +758,7 @@ int l2_version__should_download(const char *path, const l2_sha1_digest_t *expect } } - int res = l2_version_check_integrity(lfile, expectdigest, expectsize); + int res = l2_launcher_check_integrity(lfile, expectdigest, expectsize); fclose(lfile); switch (res) { @@ -1366,41 +1333,17 @@ enum l2_version_check_result l2_version_check_rules(json_t *rules, l2_version_fe return res; } -struct l2_version__download_data { - l2_sha1_state_t digest_state; - size_t recv_size; - FILE *fp; -}; - -size_t l2_version__download_writecb(char *ptr, size_t size, size_t nmemb, void *user) -{ - struct l2_version__download_data *data = user; - size_t realsz = size * nmemb; /* size should be 1 but whatever */ - - if (fwrite(ptr, size, nmemb, data->fp) < nmemb) { - return CURL_WRITEFUNC_ERROR; - } - - l2_sha1_update(&data->digest_state, ptr, realsz); - data->recv_size += realsz; - - return realsz; -} - unsigned l2_version_download_jar(json_t *version, const char *specifier, char **path) { const char *id = NULL; const char *digeststr = NULL; const char *url = NULL; - CURL *pc = NULL; json_int_t jexpectsize = 0; size_t expect_size; l2_sha1_digest_t expect_digest; - unsigned res = VERSION_SUCCESS; - if (json_unpack(version, "{s:{s:{s?:s, s?:s, s?:I}}, s:s}", "downloads", specifier, "sha1", &digeststr, "url", &url, "size", &jexpectsize, "id", &id) < 0) { return VERSION_EJSON; } @@ -1414,102 +1357,13 @@ unsigned l2_version_download_jar(json_t *version, const char *specifier, char ** char *pathstr = l2_launcher_sprintf_alloc("%s/versions/%s/%s.jar", l2_state.paths.data, id, id); if (!pathstr) return VERSION_EALLOC; - /* check if we even need to redownload the thing */ - int rdres = l2_version__should_download(pathstr, digeststr ? &expect_digest : NULL, expect_size); - if (rdres < 0) { - return VERSION_EDOWNLOAD; - } else if (!rdres) { - CMD_DEBUG("Not downloading %s jar.", specifier); - *path = pathstr; - return VERSION_SUCCESS; - } - - if (!url) { - CMD_WARN("Cannot redownload %s jar, even though I need to! (no URL specified)", specifier); - return VERSION_EJSON; - } - - /* redownload the file */ - struct l2_version__download_data dldata; - char errbuf[CURL_ERROR_SIZE]; - - memset(&dldata, 0, sizeof(struct l2_version__download_data)); - memset(&errbuf, 0, sizeof(errbuf)); - - l2_sha1_init(&dldata.digest_state); - - if (l2_launcher_mkdir_parents_ex(pathstr, 1) < 0) { - res = VERSION_EDOWNLOAD; - goto cleanup; - } - - dldata.fp = fopen(pathstr, "wb"); - if (!dldata.fp) { - CMD_WARN("Failed to open %s for writing: %s", pathstr, strerror(errno)); - res = VERSION_EDOWNLOAD; - goto cleanup; - } - - pc = curl_easy_init(); - if (!pc) { - res = VERSION_EDOWNLOAD; - goto cleanup; - } - - curl_easy_setopt(pc, CURLOPT_USERAGENT, L2_USER_AGENT); - curl_easy_setopt(pc, CURLOPT_URL, url); - curl_easy_setopt(pc, CURLOPT_WRITEDATA, &dldata); - curl_easy_setopt(pc, CURLOPT_WRITEFUNCTION, &l2_version__download_writecb); - curl_easy_setopt(pc, CURLOPT_ERRORBUFFER, errbuf); - - CURLcode cres = curl_easy_perform(pc); - if (cres != CURLE_OK) { - CMD_WARN("Failed to download %s jar: %s: %s", specifier, curl_easy_strerror(cres), errbuf); - res = VERSION_EDOWNLOAD; - goto cleanup; - } - - fclose(dldata.fp); - dldata.fp = NULL; - - curl_easy_cleanup(pc); - pc = NULL; - - l2_sha1_digest_t recvdigest; - l2_sha1_finalize(&dldata.digest_state, &recvdigest); + int dlres = l2_launcher_download_checksummed(url, pathstr, digeststr ? &expect_digest : NULL, expect_size); - if (digeststr && l2_sha1_digest_compare(&recvdigest, &expect_digest)) { - char expstr[L2_SHA1_HEX_STRLEN + 1]; - char gotstr[L2_SHA1_HEX_STRLEN + 1]; - - l2_sha1_digest_to_hex(&expect_digest, expstr); - l2_sha1_digest_to_hex(&recvdigest, gotstr); - - CMD_WARN("Downloaded %s jar has wrong digest! (expected: %s, got: %s)", specifier, expstr, gotstr); - if (unlink(pathstr) < 0) { - CMD_WARN("Failed to delete %s jar: %s", specifier, strerror(errno)); - } - res = VERSION_EDOWNLOAD; - goto cleanup; + if (dlres < 0) { + free(pathstr); + return VERSION_EDOWNLOAD; } - if (expect_size > 0 && expect_size != dldata.recv_size) { - CMD_WARN("Downloaded %s jar has wrong size! (expected: %zu bytes, got: %zu bytes)", specifier, expect_size, dldata.recv_size); - if (unlink(pathstr) < 0) { - CMD_WARN("Failed to delete %s jar: %s", specifier, strerror(errno)); - } - res = VERSION_EDOWNLOAD; - goto cleanup; - } - - CMD_DEBUG("Downloaded %s jar successfully.", specifier); - curl_easy_cleanup(pc); *path = pathstr; return VERSION_SUCCESS; - -cleanup: - free(pathstr); - if (dldata.fp) fclose(dldata.fp); - if (pc) curl_easy_cleanup(pc); - return res; } -- cgit v1.2.3-70-g09d2