X-Git-Url: https://git.librecmc.org/?p=oweals%2Fopkg-lede.git;a=blobdiff_plain;f=opkg_download.c;h=2bdbb00cae92537c75ca2a5df3ab96b4788c1160;hp=8195e518fb69e518a44c82ff19c451c399b55046;hb=e2fd21015aeedba1a9936f46b185c41047ee034d;hpb=19fbc4d6da1cc3f83c54a48815ad029d3d5d0f6f diff --git a/opkg_download.c b/opkg_download.c index 8195e51..2bdbb00 100644 --- a/opkg_download.c +++ b/opkg_download.c @@ -18,6 +18,7 @@ */ #include +#include #include "opkg.h" #include "opkg_download.h" @@ -41,7 +42,7 @@ curl_progress_func (char* url, double ulnow) { int i; - int p = d*100/t; + int p = (t) ? d*100/t : 0; #ifdef OPKG_LIB if (opkg_cb_download_progress) @@ -59,6 +60,12 @@ curl_progress_func (char* url, } #endif + /* skip progress bar if we haven't done started yet + * this prevents drawing the progress bar if we receive an error such as + * file not found */ + if (t == 0) + return 0; + printf ("\r%3d%% |", p); for (i = 1; i < 73; i++) { @@ -152,6 +159,7 @@ int opkg_download(opkg_conf_t *conf, const char *src, const char *dest_file_name curl_easy_setopt (curl, CURLOPT_NOPROGRESS, 0); curl_easy_setopt (curl, CURLOPT_PROGRESSDATA, src); curl_easy_setopt (curl, CURLOPT_PROGRESSFUNCTION, curl_progress_func); + curl_easy_setopt (curl, CURLOPT_FAILONERROR, 1); if (conf->http_proxy || conf->ftp_proxy) { char *userpwd; @@ -163,6 +171,13 @@ int opkg_download(opkg_conf_t *conf, const char *src, const char *dest_file_name res = curl_easy_perform (curl); curl_easy_cleanup (curl); fclose (file); + if (res) + { + long error_code; + curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &error_code); + opkg_message(conf, OPKG_ERROR, "Failed to download %s, error %d\n", src, error_code); + return res; + } } else @@ -186,6 +201,7 @@ int opkg_download_pkg(opkg_conf_t *conf, pkg_t *pkg, const char *dir) { int err; char *url; + char *pkgid; if (pkg->src == NULL) { opkg_message(conf,OPKG_ERROR, "ERROR: Package %s (parent %s) is not available from any configured src.\n", @@ -193,6 +209,10 @@ int opkg_download_pkg(opkg_conf_t *conf, pkg_t *pkg, const char *dir) return -1; } + sprintf_alloc (&pkgid, "%s;%s;%s;", pkg->name, pkg->version, pkg->architecture); + opkg_set_current_state (OPKG_STATE_DOWNLOADING_PKG, pkgid); + free (pkgid); + sprintf_alloc(&url, "%s/%s", pkg->src->value, pkg->filename); /* XXX: BUG: The pkg->filename might be something like @@ -204,6 +224,7 @@ int opkg_download_pkg(opkg_conf_t *conf, pkg_t *pkg, const char *dir) err = opkg_download(conf, url, pkg->local_filename); free(url); + opkg_set_current_state (OPKG_STATE_NONE, NULL); return err; } @@ -271,3 +292,47 @@ int opkg_prepare_url_for_install(opkg_conf_t *conf, const char *url, char **name } return 0; } + +int +opkg_verify_file (char *text_file, char *sig_file) +{ + int status = -1; + gpgme_ctx_t ctx; + gpgme_data_t sig, text; + gpgme_error_t err = -1; + gpgme_verify_result_t result; + gpgme_signature_t s; + + err = gpgme_new (&ctx); + + if (err) + return -1; + + err = gpgme_data_new_from_file (&sig, sig_file, 1); + if (err) + return -1; + + err = gpgme_data_new_from_file (&text, text_file, 1); + if (err) + return -1; + + err = gpgme_op_verify (ctx, sig, text, NULL); + + result = gpgme_op_verify_result (ctx); + + /* see if any of the signitures matched */ + s = result->signatures; + while (s) + { + status = gpg_err_code (s->status); + if (status == GPG_ERR_NO_ERROR) + break; + s = s->next; + } + + gpgme_data_release (sig); + gpgme_data_release (text); + gpgme_release (ctx); + + return status; +}