libopkg: fix printing provides in pkg_formatted_field()
[oweals/opkg-lede.git] / libopkg / pkg.c
index 0489c1cc2cb92c2c9b69292df78995a6b1e3e81d..023cf75c466797960dfe9483fc2dcff1e702f486 100644 (file)
@@ -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);
-               pkg_set_ptr(pkg, PKG_DEPENDS, NULL);
-       }
+                               free(deps);
+                       }
+
+                       pkg_set_ptr(pkg, blob_id(cur), NULL);
+                       break;
+
+               case PKG_REPLACES:
+               case PKG_PROVIDES:
+                       ptr = pkg_get_ptr(pkg, blob_id(cur));
 
-       deps = pkg_get_ptr(pkg, PKG_CONFLICTS);
+                       if (ptr)
+                               free(ptr);
 
-       if (deps) {
-               for (dep = deps; dep->type; dep++)
-                       compound_depend_deinit(dep);
+                       pkg_set_ptr(pkg, blob_id(cur), NULL);
+                       break;
+
+               case PKG_CONFFILES:
+                       ptr = pkg_get_ptr(pkg, blob_id(cur));
 
-               free(deps);
-               pkg_set_ptr(pkg, PKG_CONFLICTS, NULL);
+                       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)) {
@@ -771,10 +796,9 @@ void pkg_formatted_field(FILE * fp, pkg_t * pkg, const char *field)
                        ab_pkg = pkg_get_ptr(pkg, PKG_PROVIDES);
                        if (ab_pkg && ab_pkg[0] && ab_pkg[1]) {
                                fprintf(fp, "Provides:");
-                               for (i = 0, ab_pkg++; *ab_pkg; i++, ab_pkg++) {
-                                       fprintf(fp, "%s %s", i == 0 ? "" : ",",
-                                               (*ab_pkg)->name);
-                                       ab_pkg++;
+                               for (i = 1; ab_pkg[i]; i++) {
+                                       fprintf(fp, "%s %s", i == 1 ? "" : ",",
+                                               ab_pkg[i]->name);
                                }
                                fprintf(fp, "\n");
                        }