+static int check_reverse_depends_for(pkg_t *pkg, pkg_t *old_pkg)
+{
+ int err = 0;
+ int i, n_dependents;
+ abstract_pkg_t **dependents, *dependent;
+ pkg_vec_t *depends;
+ pkg_t *updated;
+
+ opkg_msg(DEBUG, "Checking reverse depends for %s\n", old_pkg->name);
+
+ n_dependents = pkg_has_installed_dependents(old_pkg, &dependents);
+
+ /* pretend that old package does not exist */
+ old_pkg->state_flag |= SF_IGNORE;
+
+ if (n_dependents == 0)
+ goto out;
+
+ while ((dependent = *dependents++) != NULL) {
+ if (dependent->state_status != SS_INSTALLED)
+ continue;
+
+ if (dependent->pkgs == NULL)
+ continue;
+
+ for (i = 0; i < dependent->pkgs->len; i++) {
+ if (dependent->pkgs->pkgs[i]->state_status != SS_INSTALLED)
+ continue;
+
+ depends = check_dependencies_for(dependent->pkgs->pkgs[i], true);
+ if (depends == NULL) {
+#if 0
+ updated = pkg_hash_fetch_best_installation_candidate_by_name(dependent->pkgs->pkgs[i]->name);
+ depends = updated ? check_dependencies_for(updated, false) : NULL;
+ if (depends == NULL) {
+ opkg_msg(ERROR, "Package %s reverse dependency check failed\n",
+ pkg->name);
+ err = -1;
+ goto out;
+ }
+ else {
+ err = opkg_install_pkg(updated, 1);
+ if (err)
+ goto out;
+ }
+#else
+ opkg_msg(ERROR, "Package %s reverse dependency check failed\n", pkg->name);
+ err = -1;
+ goto out;
+#endif
+ }
+
+ pkg_vec_free(depends);
+ }
+ }
+
+out:
+ old_pkg->state_flag &= ~SF_IGNORE;
+ return err;
+}
+