opkg: add some extra error checks to opkg_verify_file()
[oweals/opkg-lede.git] / libopkg / opkg_download.c
index 6cce64a82f18ebe5b316219fd8a4b06c985c6b8b..6acdc326f2e6a12c217a37e19e7683e54884a2f7 100644 (file)
@@ -1,5 +1,5 @@
 /* vi: set noexpandtab sw=4 sts=4: */
-/* opkg_download.c - the itsy package management system
+/* opkg_download.c - the opkg package management system
 
    Carl D. Worth
 
@@ -22,7 +22,7 @@
 #include <gpgme.h>
 #endif
 
-#include "opkg.h"
+#include "includes.h"
 #include "opkg_download.h"
 #include "opkg_message.h"
 #include "opkg_state.h"
 #include "xsystem.h"
 #include "file_util.h"
 #include "str_util.h"
+#include "opkg_defines.h"
 
-#ifdef OPKG_LIB
-#include "libopkg.h"
-opkg_download_progress_callback opkg_cb_download_progress = NULL;
-#endif
-
-int
-curl_progress_func (char* url,
-                   double t, /* dltotal */
-                   double d, /* dlnow */
-                   double ultotal,
-                   double ulnow)
-{
-    int i;
-    int p = (t) ? d*100/t : 0;
-
-#ifdef OPKG_LIB
-    if (opkg_cb_download_progress)
-    {
-       static int prev = -1;
-
-       /* don't report the same percentage multiple times
-        * (this can occur due to rounding) */
-       if (prev == p)
-           return 0;
-       prev = p;
-
-       opkg_cb_download_progress (p, url);
-       return 0;
-    }
-#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++)
-    {
-       if (i <= p * 0.73)
-           printf ("=");
-       else
-           printf ("-");
-    }
-    printf ("|");
-    fflush(stdout);
-    return 0;
-}
-
-int opkg_download(opkg_conf_t *conf, const char *src, const char *dest_file_name)
+int opkg_download(opkg_conf_t *conf, const char *src, const char *dest_file_name, curl_progress_func cb, void *data)
 {
     int err = 0;
 
@@ -92,8 +43,6 @@ int opkg_download(opkg_conf_t *conf, const char *src, const char *dest_file_name
 
     opkg_message(conf,OPKG_NOTICE,"Downloading %s\n", src);
        
-    fflush(stdout);
-    
     if (str_starts_with(src, "file:")) {
        int ret;
        const char *file_src = src + 5;
@@ -125,31 +74,6 @@ int opkg_download(opkg_conf_t *conf, const char *src, const char *dest_file_name
        setenv("no_proxy", conf->no_proxy, 1);
     }
 
-    /* XXX: BUG rewrite to use execvp or else busybox's internal wget -Jamey 7/23/2002 */ 
-#if 0
-    sprintf_alloc(&cmd, "wget --passive-ftp %s %s%s %s%s %s -P %s %s",
-                 (conf->http_proxy || conf->ftp_proxy) ? "--proxy=on" : "",
-                 conf->proxy_user ? "--proxy-user=" : "",
-                 conf->proxy_user ? conf->proxy_user : "",
-                 conf->proxy_passwd ? "--proxy-passwd=" : "",
-                 conf->proxy_passwd ? conf->proxy_passwd : "",
-                 conf->verbose_wget ? "" : "-q",
-                 conf->tmp_dir,
-                 src);
-    err = xsystem(cmd);
-    if (err) {
-       if (err != -1) {
-           opkg_message(conf,OPKG_ERROR, "%s: ERROR: Command failed with return value %d: `%s'\n",
-                   __FUNCTION__, err, cmd);
-       } 
-       unlink(tmp_file_location);
-       free(tmp_file_location);
-       free(src_basec);
-       free(cmd);
-       return EINVAL;
-    }
-    free(cmd);
-#endif
     CURL *curl;
     CURLcode res;
     FILE * file = fopen (tmp_file_location, "w");
@@ -159,9 +83,12 @@ int opkg_download(opkg_conf_t *conf, const char *src, const char *dest_file_name
     {
        curl_easy_setopt (curl, CURLOPT_URL, src);
        curl_easy_setopt (curl, CURLOPT_WRITEDATA, file);
-       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_NOPROGRESS, (cb == NULL));
+       if (cb)
+       {
+               curl_easy_setopt (curl, CURLOPT_PROGRESSDATA, data);
+               curl_easy_setopt (curl, CURLOPT_PROGRESSFUNCTION, cb);
+       }
        curl_easy_setopt (curl, CURLOPT_FAILONERROR, 1);
        if (conf->http_proxy || conf->ftp_proxy)
        {
@@ -186,8 +113,6 @@ int opkg_download(opkg_conf_t *conf, const char *src, const char *dest_file_name
     else
        return -1;
 
-    printf ("\n");
-
     err = file_move(tmp_file_location, dest_file_name);
 
     free(tmp_file_location);
@@ -205,6 +130,7 @@ int opkg_download_pkg(opkg_conf_t *conf, pkg_t *pkg, const char *dir)
     int err;
     char *url;
     char *pkgid;
+    char *stripped_filename;
 
     if (pkg->src == NULL) {
        opkg_message(conf,OPKG_ERROR, "ERROR: Package %s (parent %s) is not available from any configured src.\n",
@@ -222,9 +148,14 @@ int opkg_download_pkg(opkg_conf_t *conf, pkg_t *pkg, const char *dir)
        "../../foo.ipk". While this is correct, and exactly what we
        want to use to construct url above, here we actually need to
        use just the filename part, without any directory. */
-    sprintf_alloc(&pkg->local_filename, "%s/%s", dir, pkg->filename);
 
-    err = opkg_download(conf, url, pkg->local_filename);
+    stripped_filename = strrchr(pkg->filename, '/');
+    if ( ! stripped_filename )
+        stripped_filename = pkg->filename;
+
+    sprintf_alloc(&pkg->local_filename, "%s/%s", dir, stripped_filename);
+
+    err = opkg_download(conf, url, pkg->local_filename, NULL, NULL);
     free(url);
 
     opkg_set_current_state (conf, OPKG_STATE_NONE, NULL);
@@ -249,7 +180,7 @@ int opkg_prepare_url_for_install(opkg_conf_t *conf, const char *url, char **name
          char *file_base = basename(file_basec);
 
          sprintf_alloc(&tmp_file, "%s/%s", conf->tmp_dir, file_base);
-         err = opkg_download(conf, url, tmp_file);
+         err = opkg_download(conf, url, tmp_file, NULL, NULL);
          if (err)
               return err;
 
@@ -297,7 +228,7 @@ int opkg_prepare_url_for_install(opkg_conf_t *conf, const char *url, char **name
 }
 
 int
-opkg_verify_file (char *text_file, char *sig_file)
+opkg_verify_file (opkg_conf_t *conf, char *text_file, char *sig_file)
 {
 #ifdef HAVE_GPGME
     int status = -1;
@@ -321,8 +252,12 @@ opkg_verify_file (char *text_file, char *sig_file)
        return -1;
 
     err = gpgme_op_verify (ctx, sig, text, NULL);
+    if (err)
+       return -1;
 
     result = gpgme_op_verify_result (ctx);
+    if (!result)
+       return -1;
 
     /* see if any of the signitures matched */
     s = result->signatures;
@@ -340,7 +275,7 @@ opkg_verify_file (char *text_file, char *sig_file)
 
     return status;
 #else
-    printf ("Signature check skipped because GPG support was not enabled in this build\n");
+    opkg_message (conf, OPKG_NOTICE, "Signature check for %s was skipped because GPG support was not enabled in this build\n");
     return 0;
 #endif
 }