+
+ /* cruise this possiblity's pkg_vec looking for an installed version */
+ for (k = 0; k < test_vec->len; k++) {
+ pkg_t *pkg_scout =
+ test_vec->pkgs[k];
+ /* not installed, and not already known about? */
+ if ((pkg_scout->state_want !=
+ SW_INSTALL)
+ && !pkg_scout->parent->
+ dependencies_checked
+ &&
+ !is_pkg_in_pkg_vec
+ (unsatisfied, pkg_scout)) {
+ char **newstuff = NULL;
+ int rc;
+ pkg_vec_t *tmp_vec =
+ pkg_vec_alloc();
+ /* check for not-already-installed dependencies */
+ rc = pkg_hash_fetch_unsatisfied_dependencies(pkg_scout, tmp_vec, &newstuff);
+ if (newstuff == NULL) {
+ int m;
+ int ok = 1;
+ for (m = 0;
+ m < rc;
+ m++) {
+ pkg_t *p
+ =
+ tmp_vec->
+ pkgs
+ [m];
+ if (p->
+ state_want
+ ==
+ SW_INSTALL)
+ continue;
+ opkg_msg
+ (DEBUG,
+ "Not installing %s due"
+ " to requirement for %s.\n",
+ pkg_scout->
+ name,
+ p->
+ name);
+ ok = 0;
+ break;
+ }
+ pkg_vec_free
+ (tmp_vec);
+ if (ok) {
+ /* mark this one for installation */
+ opkg_msg
+ (NOTICE,
+ "Adding satisfier for greedy"
+ " dependence %s.\n",
+ pkg_scout->
+ name);
+ pkg_vec_insert
+ (unsatisfied,
+ pkg_scout);
+ }
+ } else {
+ opkg_msg(DEBUG,
+ "Not installing %s due to "
+ "broken depends.\n",
+ pkg_scout->
+ name);
+ free(newstuff);
+ }
+ }
+ }
+ }
+ }
+
+ continue;
+ }
+
+ /* foreach possible satisfier, look for installed package */
+ for (j = 0; j < compound_depend->possibility_count; j++) {
+ /* foreach provided_by, which includes the abstract_pkg itself */
+ depend_t *dependence_to_satisfy =
+ possible_satisfiers[j];
+ abstract_pkg_t *satisfying_apkg =
+ possible_satisfiers[j]->pkg;
+ pkg_t *satisfying_pkg =
+ pkg_hash_fetch_best_installation_candidate
+ (satisfying_apkg,
+ pkg_installed_and_constraint_satisfied,
+ dependence_to_satisfy, 1);
+ /* Being that I can't test constraing in pkg_hash, I will test it here */
+ if (satisfying_pkg != NULL) {
+ if (!pkg_installed_and_constraint_satisfied
+ (satisfying_pkg, dependence_to_satisfy)) {
+ satisfying_pkg = NULL;
+ }
+ }
+ opkg_msg(DEBUG, "satisfying_pkg=%p\n", satisfying_pkg);
+ if (satisfying_pkg != NULL) {
+ found = 1;
+ break;
+ }
+
+ }
+ /* if nothing installed matches, then look for uninstalled satisfier */
+ if (!found) {
+ /* foreach possible satisfier, look for installed package */
+ for (j = 0; j < compound_depend->possibility_count; j++) {
+ /* foreach provided_by, which includes the abstract_pkg itself */
+ depend_t *dependence_to_satisfy =
+ possible_satisfiers[j];
+ abstract_pkg_t *satisfying_apkg =
+ possible_satisfiers[j]->pkg;
+ pkg_t *satisfying_pkg =
+ pkg_hash_fetch_best_installation_candidate
+ (satisfying_apkg,
+ pkg_constraint_satisfied,
+ dependence_to_satisfy, 1);
+ /* Being that I can't test constraing in pkg_hash, I will test it here too */
+ if (satisfying_pkg != NULL) {
+ if (!pkg_constraint_satisfied
+ (satisfying_pkg,
+ dependence_to_satisfy)) {
+ satisfying_pkg = NULL;
+ }
+ }
+
+ /* user request overrides package recommendation */
+ if (satisfying_pkg != NULL
+ && (compound_depend->type == RECOMMEND
+ || compound_depend->type == SUGGEST)
+ && (satisfying_pkg->state_want ==
+ SW_DEINSTALL
+ || satisfying_pkg->state_want ==
+ SW_PURGE)) {
+ opkg_msg(NOTICE,
+ "%s: ignoring recommendation for "
+ "%s at user request\n",
+ pkg->name,
+ satisfying_pkg->name);
+ continue;
+ }
+
+ opkg_msg(DEBUG, "satisfying_pkg=%p\n",
+ satisfying_pkg);
+ if (satisfying_pkg != NULL) {
+ satisfier_entry_pkg = satisfying_pkg;
+ break;
+ }
+ }
+ }
+
+ /* we didn't find one, add something to the unsatisfied vector */
+ if (!found) {
+ if (!satisfier_entry_pkg) {
+ /* failure to meet recommendations is not an error */
+ if (compound_depend->type != RECOMMEND
+ && compound_depend->type != SUGGEST)
+ the_lost =
+ add_unresolved_dep(pkg, the_lost,
+ i);
+ else
+ opkg_msg(NOTICE,
+ "%s: unsatisfied recommendation for %s\n",
+ pkg->name,
+ compound_depend->
+ possibilities[0]->pkg->name);
+ } else {
+ if (compound_depend->type == SUGGEST) {
+ /* just mention it politely */
+ opkg_msg(NOTICE,
+ "package %s suggests installing %s\n",
+ pkg->name,
+ satisfier_entry_pkg->name);
+ } else {
+ char **newstuff = NULL;
+
+ if (satisfier_entry_pkg != pkg &&
+ !is_pkg_in_pkg_vec(unsatisfied,
+ satisfier_entry_pkg))
+ {
+ pkg_vec_insert(unsatisfied,
+ satisfier_entry_pkg);
+ pkg_hash_fetch_unsatisfied_dependencies
+ (satisfier_entry_pkg,
+ unsatisfied, &newstuff);
+ the_lost =
+ merge_unresolved(the_lost,
+ newstuff);
+ if (newstuff)
+ free(newstuff);