aboutsummaryrefslogtreecommitdiff
path: root/snag/src/download_db.c
diff options
context:
space:
mode:
Diffstat (limited to 'snag/src/download_db.c')
-rw-r--r--snag/src/download_db.c119
1 files changed, 0 insertions, 119 deletions
diff --git a/snag/src/download_db.c b/snag/src/download_db.c
deleted file mode 100644
index e0aa85e..0000000
--- a/snag/src/download_db.c
+++ /dev/null
@@ -1,119 +0,0 @@
-#include "download_db.h"
-
-#include "util.h"
-
-#include <curl/curl.h>
-#include <openssl/evp.h>
-#include <openssl/sha.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-
-// note: fixed location of download database for now
-const char download_db_path[] = "./var/snag/downloads";
-
-// libcrpyto context
-EVP_MD_CTX *mdctx = NULL;
-const EVP_MD *md = NULL;
-
-// curl context
-CURL *curl = NULL;
-
-static size_t download_write_callback(char* ptr, size_t size, size_t nmemb, void* usrdata) {
- // write the curl data to the file in usr data
- size_t written = fwrite(ptr, size, nmemb, (FILE *)usrdata);
-
- // update the hash with the new data
- EVP_DigestUpdate(mdctx, ptr, written);
-
- return written;
-}
-
-bool package_get_download(package_info_t* pkg, package_download_t* download) {
- memset(download, 0, sizeof(*download));
-
- // construct path of download
- // note(jqj): extension is fixed to tar gz until the switch out download
- // attrs for the swenu api download command which will specify
- // more information
- char* download_path = vastrcat(download_db_path, "/", pkg->attrs.id, "-", pkg->attrs.version, ".tar.gz");
-
- // return download if it already exists in database
- if (access(download_path, F_OK) == 0) {
- // todo(jqj): verify checksum anyway
- download->download_path = download_path;
- return true;
- } else {
- print("Downloading %s\n", pkg->attrs.source_url);
- }
-
- // initialize curl if it isn't already
- if (curl == NULL) {
- CURLcode result = curl_global_init(CURL_GLOBAL_ALL);
- if (result != CURLE_OK) die("failed to initialize curl: %s", curl_easy_strerror(result));
- curl = curl_easy_init(); // note(jqj): for now we reuse one easy curl object
- if (curl == NULL) die("failed to initialize easy curl");
-
- /* come back to this if we have init and deinit */
- /* curl_easy_cleanup(curl); */
- /* curl_global_cleanup(); */
- }
-
- // initialize libcrypto context if it isn't already
- if (mdctx == NULL) {
- mdctx = EVP_MD_CTX_new();
- md = EVP_sha256();
-
- /* come back to this if we have init and deinit */
- /* EVP_MD_CTX_free(mdctx); */
- }
-
- // initialize up sha256 hash
- EVP_DigestInit_ex(mdctx, md, NULL);
-
- // open file for writing
- FILE* download_file = fopen(download_path, "wb");
- if (download_file == NULL) die("failed open download file for writing (%s): %s", download_path, strerror(errno));
-
- // make curl request with url and output file
- // callback writes to the file and feeds the hash
- curl_easy_setopt(curl, CURLOPT_URL, pkg->attrs.source_url);
- curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, download_write_callback);
- curl_easy_setopt(curl, CURLOPT_WRITEDATA, download_file);
- CURLcode result = curl_easy_perform(curl);
- fclose(download_file);
- if(result != CURLE_OK) {
- // todo(jqj): handle better, maybe try again
- print("failed to download package with curl: %s", curl_easy_strerror(result));
- goto fail;
- }
-
- // get sha256 hash
- unsigned char hash[SHA256_DIGEST_LENGTH];
- unsigned int hash_len;
- EVP_DigestFinal_ex(mdctx, hash, &hash_len);
-
- // make hexadecimal string of sha256 hash
- char hash_hex[SHA256_DIGEST_LENGTH * 2 + 1];
- for(int i = 0; i < SHA256_DIGEST_LENGTH; i++) {
- sprintf(hash_hex + i*2,"%02x", hash[i]);
- }
- hash_hex[SHA256_DIGEST_LENGTH * 2] = '\0';
-
- // confirm that checksum matches
- assert(pkg->attrs.source_checksum != NULL);
- if (strcmp(pkg->attrs.source_checksum, hash_hex) == 0) {
- print("checksum verified for download: %s\n", hash_hex);
- download->download_path = download_path;
- return true;
- } else {
- print("FAIL: bad checksum for download: %s\n", hash_hex);
- goto fail;
- }
-
- fail:
- if (access(download_path, F_OK) == 0) remove(download_path);
- free(download_path);
- return false;
-}