X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=libopkg%2Fopkg_remove.c;h=ec7540b896cbd648c56a3e81ff2df3468ad97abd;hb=af66c658642635a3c951bb0ee130e40e7f084fd9;hp=10f7f440403ac5454ca16c22fd477f7c9a702d85;hpb=69bae440fd21376d2a717575b1418c962396bd21;p=oweals%2Fopkg-lede.git diff --git a/libopkg/opkg_remove.c b/libopkg/opkg_remove.c index 10f7f44..ec7540b 100644 --- a/libopkg/opkg_remove.c +++ b/libopkg/opkg_remove.c @@ -1,4 +1,4 @@ -/* opkg_remove.c - the itsy package management system +/* opkg_remove.c - the opkg package management system Carl D. Worth @@ -22,11 +22,12 @@ #include "opkg_remove.h" #include "opkg_error.h" -#include "opkg_state.h" +#include "opkg_cmd.h" #include "file_util.h" #include "sprintf_alloc.h" #include "str_util.h" +#include "libbb/libbb.h" /* * Returns number of the number of packages depending on the packages provided by this package. @@ -54,12 +55,7 @@ int pkg_has_installed_dependents(opkg_conf_t *conf, abstract_pkg_t *parent_apkg, /* if caller requested the set of installed dependents */ if (pdependents) { int p = 0; - abstract_pkg_t **dependents = (abstract_pkg_t **)malloc((n_installed_dependents+1)*sizeof(abstract_pkg_t *)); - - if ( dependents == NULL ){ - fprintf(stderr,"%s Unable to allocate memory. REPORT THIS BUG IN BUGZILLA PLEASE\n", __FUNCTION__); - return -1; - } + abstract_pkg_t **dependents = xcalloc((n_installed_dependents+1), sizeof(abstract_pkg_t *)); *pdependents = dependents; for (i = 0; i <= nprovides; i++) { @@ -90,7 +86,7 @@ int opkg_remove_dependent_pkgs (opkg_conf_t *conf, pkg_t *pkg, abstract_pkg_t ** int i; int a; int count; - pkg_vec_t *dependent_pkgs = pkg_vec_alloc(); + pkg_vec_t *dependent_pkgs; abstract_pkg_t * ab_pkg; if((ab_pkg = pkg->parent) == NULL){ @@ -110,6 +106,8 @@ int opkg_remove_dependent_pkgs (opkg_conf_t *conf, pkg_t *pkg, abstract_pkg_t ** i = 0; count = 1; + dependent_pkgs = pkg_vec_alloc(); + while (dependents [i] != NULL) { abstract_pkg_t *dep_ab_pkg = dependents[i]; @@ -131,16 +129,20 @@ int opkg_remove_dependent_pkgs (opkg_conf_t *conf, pkg_t *pkg, abstract_pkg_t ** * 2 - to keep track of pkgs whose deps have been checked alrdy - Karthik */ } - if (count == 1) - return 0; + if (count == 1) { + free(dependent_pkgs); + return 0; + } + int err=0; for (i = 0; i < dependent_pkgs->len; i++) { - int err = opkg_remove_pkg(conf, dependent_pkgs->pkgs[i],0); + err = opkg_remove_pkg(conf, dependent_pkgs->pkgs[i],0); if (err) - return err; + break; } - return 0; + free(dependent_pkgs); + return err; } static int user_prefers_removing_dependents(opkg_conf_t *conf, abstract_pkg_t *abpkg, pkg_t *pkg, abstract_pkg_t **dependents) @@ -175,12 +177,7 @@ static int remove_autoinstalled (opkg_conf_t *conf, pkg_t *pkg) int x = 0; pkg_t *p; d_str = pkg->depends_str[i]; - buffer = malloc (strlen (d_str) + 1); - if (!buffer) - { - fprintf(stderr,"%s Unable to allocate memory.\n", __FUNCTION__); - return -1; - } + buffer = xcalloc(1, strlen (d_str) + 1); while (d_str[x] != '\0' && d_str[x] != ' ') { @@ -188,7 +185,7 @@ static int remove_autoinstalled (opkg_conf_t *conf, pkg_t *pkg) ++x; } buffer[x] = '\0'; - buffer = realloc (buffer, strlen (buffer) + 1); + buffer = xrealloc (buffer, strlen (buffer) + 1); p = pkg_hash_fetch_installed_by_name (&conf->pkg_hash, buffer); /* if the package is not installed, this could have been a circular @@ -263,14 +260,19 @@ int opkg_remove_pkg(opkg_conf_t *conf, pkg_t *pkg,int message) if (!conf->force_removal_of_dependent_packages && !user_prefers_removing_dependents(conf, parent_pkg, pkg, dependents)) { + free(dependents); return OPKG_PKG_HAS_DEPENDENTS; } /* remove packages depending on this package - Karthik */ err = opkg_remove_dependent_pkgs (conf, pkg, dependents); - free(dependents); - if (err) return err; + if (err) { + free(dependents); + return err; + } } + if (dependents) + free(dependents); } if ( message==0 ){ @@ -336,11 +338,11 @@ int remove_data_files_and_list(opkg_conf_t *conf, pkg_t *pkg) str_list_init(&installed_dirs); installed_files = pkg_get_installed_files(pkg); - for (iter = installed_files->head; iter; iter = iter->next) { - file_name = iter->data; + for (iter = str_list_first(installed_files); iter; iter = str_list_next(installed_files, iter)) { + file_name = (char *)iter->data; if (file_is_dir(file_name)) { - str_list_append(&installed_dirs, strdup(file_name)); + str_list_append(&installed_dirs, file_name); continue; } @@ -367,8 +369,8 @@ int remove_data_files_and_list(opkg_conf_t *conf, pkg_t *pkg) if (!conf->noaction) { do { removed_a_dir = 0; - for (iter = installed_dirs.head; iter; iter = iter->next) { - file_name = iter->data; + for (iter = str_list_first(&installed_dirs); iter; iter = str_list_next(&installed_dirs, iter)) { + file_name = (char *)iter->data; if (rmdir(file_name) == 0) { opkg_message(conf, OPKG_INFO, " deleting %s\n", file_name); @@ -385,8 +387,8 @@ int remove_data_files_and_list(opkg_conf_t *conf, pkg_t *pkg) pkg_remove_installed_files_list(conf, pkg); /* Don't print warning for dirs that are provided by other packages */ - for (iter = installed_dirs.head; iter; iter = iter->next) { - file_name = iter->data; + for (iter = str_list_first(&installed_dirs); iter; iter = str_list_next(&installed_dirs, iter)) { + file_name = (char *)iter->data; owner = file_hash_get_file_owner(conf, file_name); if (owner) { @@ -397,9 +399,10 @@ int remove_data_files_and_list(opkg_conf_t *conf, pkg_t *pkg) } /* cleanup */ - for (iter = installed_dirs.head; iter; iter = iter->next) { - free(iter->data); - iter->data = NULL; + while (!void_list_empty(&installed_dirs)) { + iter = str_list_pop(&installed_dirs); + free(iter->data); + free(iter); } str_list_deinit(&installed_dirs);