X-Git-Url: https://git.librecmc.org/?p=oweals%2Fopkg-lede.git;a=blobdiff_plain;f=libopkg%2Fpkg.c;h=3633a3c932d9e3260517924a3a0528a8371fd85e;hp=0489c1cc2cb92c2c9b69292df78995a6b1e3e81d;hb=3b04613d5b94b7dae36d5f97feca932338ec55b7;hpb=69689ee4c3fd92bef21b4d28fd79f446925f82a8 diff --git a/libopkg/pkg.c b/libopkg/pkg.c index 0489c1c..3633a3c 100644 --- a/libopkg/pkg.c +++ b/libopkg/pkg.c @@ -269,7 +269,10 @@ static void compound_depend_deinit(compound_depend_t * depends) void pkg_deinit(pkg_t * pkg) { + int rem; + struct blob_attr *cur; compound_depend_t *deps, *dep; + void *ptr; if (pkg->name) free(pkg->name); @@ -284,24 +287,43 @@ void pkg_deinit(pkg_t * pkg) pkg->state_flag = SF_OK; pkg->state_status = SS_NOT_INSTALLED; - deps = pkg_get_ptr(pkg, PKG_DEPENDS); + blob_for_each_attr(cur, pkg->blob.head, rem) { + switch (blob_id(cur)) { + case PKG_DEPENDS: + case PKG_CONFLICTS: + deps = pkg_get_ptr(pkg, blob_id(cur)); + + if (deps) { + for (dep = deps; dep->type; dep++) + compound_depend_deinit(dep); - if (deps) { - for (dep = deps; dep->type; dep++) - compound_depend_deinit(dep); + free(deps); + } - free(deps); - pkg_set_ptr(pkg, PKG_DEPENDS, NULL); - } + pkg_set_ptr(pkg, blob_id(cur), NULL); + break; - deps = pkg_get_ptr(pkg, PKG_CONFLICTS); + case PKG_REPLACES: + case PKG_PROVIDES: + ptr = pkg_get_ptr(pkg, blob_id(cur)); - if (deps) { - for (dep = deps; dep->type; dep++) - compound_depend_deinit(dep); + if (ptr) + free(ptr); - free(deps); - pkg_set_ptr(pkg, PKG_CONFLICTS, NULL); + pkg_set_ptr(pkg, blob_id(cur), NULL); + break; + + case PKG_CONFFILES: + ptr = pkg_get_ptr(pkg, blob_id(cur)); + + if (ptr) { + conffile_list_deinit(ptr); + free(ptr); + } + + pkg_set_ptr(pkg, blob_id(cur), NULL); + break; + } } //conffile_list_deinit(&pkg->conffiles); @@ -313,7 +335,7 @@ void pkg_deinit(pkg_t * pkg) pkg_free_installed_files(pkg); pkg->essential = 0; - //blob_buf_free(&pkg->blob); + blob_buf_free(&pkg->blob); } int pkg_init_from_file(pkg_t * pkg, const char *filename) @@ -407,6 +429,9 @@ int pkg_merge(pkg_t * oldpkg, pkg_t * newpkg) if (!ab || !ab[0] || !ab[1]) { pkg_set_ptr(oldpkg, PKG_PROVIDES, pkg_get_ptr(newpkg, PKG_PROVIDES)); pkg_set_ptr(newpkg, PKG_PROVIDES, NULL); + + if (ab) + free(ab); } if (!pkg_get_ptr(oldpkg, PKG_CONFLICTS)) {