opkg: add some extra error checks to opkg_verify_file()
[oweals/opkg-lede.git] / libopkg / opkg_download.c
index 4dab8092f5001e5e94cc02e70edd235ec7849d7a..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"
 
-#include "libopkg.h"
-opkg_download_progress_callback opkg_cb_download_progress = NULL;
-
-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;
-
-    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;
-    }
-
-    /* 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;
 
@@ -88,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;
@@ -130,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)
        {
@@ -157,10 +113,6 @@ int opkg_download(opkg_conf_t *conf, const char *src, const char *dest_file_name
     else
        return -1;
 
-    /* if no custom progress handler was set, we need to clear the default progress bar */
-    if (!opkg_cb_download_progress)
-        printf ("\n");
-
     err = file_move(tmp_file_location, dest_file_name);
 
     free(tmp_file_location);
@@ -178,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",
@@ -195,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);
@@ -222,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;
 
@@ -294,8 +252,12 @@ opkg_verify_file (opkg_conf_t *conf, 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;