-/* opkg_hash.c - the itsy package management system
+/* opkg_hash.c - the opkg package management system
Steven M. Ayer
General Public License for more details.
*/
-#include "opkg.h"
+#include "includes.h"
#include <errno.h>
#include <ctype.h>
#include <stdlib.h>
*/
-\f
int pkg_hash_init(const char *name, hash_table_t *hash, int len)
{
return hash_table_init(name, hash, len);
}
+void free_pkgs (const char *key, void *entry, void *data)
+{
+ int i;
+ abstract_pkg_t *ab_pkg;
+
+ /* each entry in the hash table is an abstract package, which contains a list
+ * of packages that provide the abstract package */
+
+ ab_pkg = (abstract_pkg_t*) entry;
+
+ if (ab_pkg->pkgs)
+ {
+ for (i = 0; i < ab_pkg->pkgs->len; i++)
+ {
+ pkg_deinit (ab_pkg->pkgs->pkgs[i]);
+ free (ab_pkg->pkgs->pkgs[i]);
+ }
+ }
+
+ abstract_pkg_vec_free (ab_pkg->provided_by);
+ abstract_pkg_vec_free (ab_pkg->replaced_by);
+ pkg_vec_free (ab_pkg->pkgs);
+ free (ab_pkg->depended_upon_by);
+ free (ab_pkg->name);
+ free (ab_pkg);
+}
+
void pkg_hash_deinit(hash_table_t *hash)
{
+ hash_table_foreach (hash, free_pkgs, NULL);
hash_table_deinit(hash);
}
}
hash_insert_pkg(hash, pkg, is_status_file,conf);
} else {
+ pkg_deinit (pkg);
free(pkg);
}
}
pkg_t *pkg_hash_fetch_best_installation_candidate(opkg_conf_t *conf, abstract_pkg_t *apkg,
- int (*constraint_fcn)(pkg_t *pkg, void *cdata), void *cdata, int quiet)
+ int (*constraint_fcn)(pkg_t *pkg, void *cdata), void *cdata, int quiet, int *err)
{
int i;
int nprovides = 0;
pkg_t *held_pkg = NULL;
pkg_t *good_pkg_by_name = NULL;
+ if (err)
+ *err = 0;
+
if (matching_apkgs == NULL || providers == NULL ||
apkg == NULL || apkg->provided_by == NULL || (apkg->provided_by->len == 0))
return NULL;
pkg_vec_insert(matching_pkgs, maybe);
}
}
+
+ if (vec->len > 0 && matching_pkgs->len < 1)
+ {
+ opkg_message (conf, OPKG_ERROR, "Packages were found, but none compatible with the architectures configured\n");
+ if (err)
+ *err = OPKG_PKG_HAS_NO_AVAILABLE_ARCH;
+ }
}
}
latest_installed_parent = matching;
if (matching->state_flag & (SF_HOLD|SF_PREFER)) {
if (held_pkg)
- opkg_message(conf, OPKG_ERROR, "Multiple packages (%s and %s) providing same name marked HOLD or PREFER. Using latest.\n",
+ opkg_message(conf, OPKG_NOTICE, "Multiple packages (%s and %s) providing same name marked HOLD or PREFER. Using latest.\n",
held_pkg->name, matching->name);
held_pkg = matching;
}
return 0;
}
-pkg_t *pkg_hash_fetch_best_installation_candidate_by_name(opkg_conf_t *conf, const char *name)
+pkg_t *pkg_hash_fetch_best_installation_candidate_by_name(opkg_conf_t *conf, const char *name, int *err)
{
hash_table_t *hash = &conf->pkg_hash;
abstract_pkg_t *apkg = NULL;
+ pkg_t *ret;
if (!(apkg = abstract_pkg_fetch_by_name(hash, name)))
return NULL;
-
- return pkg_hash_fetch_best_installation_candidate(conf, apkg, pkg_name_constraint_fcn, apkg->name, 0);
+
+ ret = pkg_hash_fetch_best_installation_candidate(conf, apkg, pkg_name_constraint_fcn, apkg->name, 0, err);
+
+ return ret;
}
}
}
-static int pkg_compare_names(const void *p1, const void *p2)
-{
- const pkg_t *pkg1 = *(const pkg_t **)p1;
- const pkg_t *pkg2 = *(const pkg_t **)p2;
- if (pkg1->name == NULL)
- return 1;
- if (pkg2->name == NULL)
- return -1;
- return(strcmp(pkg1->name, pkg2->name));
-}
-
static void pkg_hash_fetch_available_helper(const char *pkg_name, void *entry, void *data)
{
void pkg_hash_fetch_available(hash_table_t *hash, pkg_vec_t *all)
{
hash_table_foreach(hash, pkg_hash_fetch_available_helper, all);
- qsort(all->pkgs, all->len, sizeof(pkg_t *), pkg_compare_names);
}
static void pkg_hash_fetch_all_installed_helper(const char *pkg_name, void *entry, void *data)
void pkg_hash_fetch_all_installed(hash_table_t *hash, pkg_vec_t *all)
{
hash_table_foreach(hash, pkg_hash_fetch_all_installed_helper, all);
- qsort(all->pkgs, all->len, sizeof(void*), pkg_compare_names);
}
static void pkg_hash_dump_helper(const char *pkg_name, void *entry, void *data)
if (dependents != NULL)
while (dependents [i] != NULL && i < ab_pkg->provided_by->len)
printf ("\tprovided by - %s\n", dependents [i ++]->name);
- pkg = pkg_hash_fetch_best_installation_candidate_by_name (conf, ab_pkg->name);
+ pkg = pkg_hash_fetch_best_installation_candidate_by_name (conf, ab_pkg->name, NULL);
if (pkg) {
i = 0;
while (i < pkg->depends_count)
// opkg_message(conf, OPKG_DEBUG2, "owning_pkg=%s filename=%s\n", owning_pkg->name, file_name);
hash_table_insert(file_hash, file_name, owning_pkg);
if (old_owning_pkg) {
+ pkg_get_installed_files(old_owning_pkg);
str_list_remove_elt(old_owning_pkg->installed_files, file_name);
+ pkg_free_installed_files(old_owning_pkg);
/* mark this package to have its filelist written */
old_owning_pkg->state_flag |= SF_FILELIST_CHANGED;
owning_pkg->state_flag |= SF_FILELIST_CHANGED;
+
}
return 0;
}