aboutsummaryrefslogtreecommitdiffstats
path: root/src/version.c
diff options
context:
space:
mode:
authorLibravatar bigfoot547 <[email protected]>2024-01-03 05:18:11 -0600
committerLibravatar bigfoot547 <[email protected]>2024-01-03 05:18:11 -0600
commitce87d368bd3e9b6c05ed9f6fdbb97580f105bbcf (patch)
tree7b7441d6891aff7080cae3b0b08cd577761a1f1c /src/version.c
parentdownloads client jar (diff)
refactor and download asset index
Diffstat (limited to 'src/version.c')
-rw-r--r--src/version.c160
1 files changed, 7 insertions, 153 deletions
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;
}