cli: default to /etc/opkg.conf
[oweals/opkg-lede.git] / libopkg / opkg_upgrade.c
index b0b047fa0b862e6f438a8a5b5ff9675ce3d66811..10b8217de241f1078066b1ea16d83e30a9249c5a 100644 (file)
@@ -1,4 +1,4 @@
-/* opkg_upgrade.c - the itsy package management system
+/* opkg_upgrade.c - the opkg package management system
 
    Carl D. Worth
    Copyright (C) 2001 University of Southern California
 
    Carl D. Worth
    Copyright (C) 2001 University of Southern California
    General Public License for more details.
 */
 
    General Public License for more details.
 */
 
-#include "opkg.h"
+#include <stdio.h>
+#include <stdlib.h>
+
 #include "opkg_install.h"
 #include "opkg_install.h"
+#include "opkg_upgrade.h"
 #include "opkg_message.h"
 
 #include "opkg_message.h"
 
-int opkg_upgrade_pkg(opkg_conf_t *conf, pkg_t *old)
+int
+opkg_upgrade_pkg(pkg_t *old)
 {
      pkg_t *new;
      int cmp;
      char *old_version, *new_version;
 
      if (old->state_flag & SF_HOLD) {
 {
      pkg_t *new;
      int cmp;
      char *old_version, *new_version;
 
      if (old->state_flag & SF_HOLD) {
-          opkg_message(conf, OPKG_NOTICE,
-                       "Not upgrading package %s which is marked "
-                       "hold (flags=%#x)\n", old->name, old->state_flag);
+          opkg_msg(NOTICE, "Not upgrading package %s which is marked "
+                       "hold (flags=%#x).\n", old->name, old->state_flag);
           return 0;
      }
 
           return 0;
      }
 
-     new = pkg_hash_fetch_best_installation_candidate_by_name(conf, old->name);
+     new = pkg_hash_fetch_best_installation_candidate_by_name(old->name);
      if (new == NULL) {
           old_version = pkg_version_str_alloc(old);
      if (new == NULL) {
           old_version = pkg_version_str_alloc(old);
-          opkg_message(conf, OPKG_NOTICE,
-                       "Assuming locally installed package %s (%s) "
+          opkg_msg(NOTICE, "Assuming locally installed package %s (%s) "
                        "is up to date.\n", old->name, old_version);
           free(old_version);
           return 0;
      }
                        "is up to date.\n", old->name, old_version);
           free(old_version);
           return 0;
      }
-          
+
      old_version = pkg_version_str_alloc(old);
      new_version = pkg_version_str_alloc(new);
      old_version = pkg_version_str_alloc(old);
      new_version = pkg_version_str_alloc(new);
-               
+
      cmp = pkg_compare_versions(old, new);
      cmp = pkg_compare_versions(old, new);
-     opkg_message(conf, OPKG_DEBUG,
-                  "comparing visible versions of pkg %s:"
+     opkg_msg(DEBUG, "Comparing visible versions of pkg %s:"
                   "\n\t%s is installed "
                   "\n\t%s is available "
                   "\n\t%d was comparison result\n",
                   old->name, old_version, new_version, cmp);
      if (cmp == 0) {
                   "\n\t%s is installed "
                   "\n\t%s is available "
                   "\n\t%d was comparison result\n",
                   old->name, old_version, new_version, cmp);
      if (cmp == 0) {
-          opkg_message(conf, OPKG_INFO,
-                       "Package %s (%s) installed in %s is up to date.\n",
+          opkg_msg(INFO, "Package %s (%s) installed in %s is up to date.\n",
                        old->name, old_version, old->dest->name);
           free(old_version);
           free(new_version);
           return 0;
      } else if (cmp > 0) {
                        old->name, old_version, old->dest->name);
           free(old_version);
           free(new_version);
           return 0;
      } else if (cmp > 0) {
-          opkg_message(conf, OPKG_NOTICE,
-                       "Not downgrading package %s on %s from %s to %s.\n",
+          opkg_msg(NOTICE, "Not downgrading package %s on %s from %s to %s.\n",
                        old->name, old->dest->name, old_version, new_version);
           free(old_version);
           free(new_version);
                        old->name, old->dest->name, old_version, new_version);
           free(old_version);
           free(new_version);
@@ -72,6 +71,60 @@ int opkg_upgrade_pkg(opkg_conf_t *conf, pkg_t *old)
           old->state_want = SW_DEINSTALL;
      }
 
           old->state_want = SW_DEINSTALL;
      }
 
-     new->state_flag |= SF_USER;
-     return opkg_install_pkg(conf, new,1);
+    free(old_version);
+    free(new_version);
+    new->state_flag |= SF_USER;
+    return opkg_install_pkg(new,1);
+}
+
+
+static void
+pkg_hash_check_installed_pkg_helper(const char *pkg_name, void *entry,
+               void *data)
+{
+       struct active_list *head = (struct active_list *) data;
+       abstract_pkg_t *ab_pkg = (abstract_pkg_t *)entry;
+       pkg_vec_t *pkg_vec = ab_pkg->pkgs;
+       int j;
+
+       if (!pkg_vec)
+               return;
+
+       for (j = 0; j < pkg_vec->len; j++) {
+               pkg_t *pkg = pkg_vec->pkgs[j];
+               if (pkg->state_status == SS_INSTALLED
+                               || pkg->state_status == SS_UNPACKED)
+                       active_list_add(head, &pkg->list);
+       }
+}
+
+struct active_list *
+prepare_upgrade_list(void)
+{
+    struct active_list *head = active_list_head_new();
+    struct active_list *all = active_list_head_new();
+    struct active_list *node=NULL;
+
+    /* ensure all data is valid */
+    pkg_info_preinstall_check();
+
+    hash_table_foreach(&conf->pkg_hash, pkg_hash_check_installed_pkg_helper, all);
+    for (node=active_list_next(all,all); node; node = active_list_next(all, node)) {
+        pkg_t *old, *new;
+        int cmp;
+
+        old = list_entry(node, pkg_t, list);
+        new = pkg_hash_fetch_best_installation_candidate_by_name(old->name);
+
+        if (new == NULL)
+            continue;
+
+        cmp = pkg_compare_versions(old, new);
+
+        if ( cmp < 0 ) {
+           node = active_list_move_node(all, head, &old->list);
+        }
+    }
+    active_list_head_delete(all);
+    return head;
 }
 }