X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=libopkg%2Fpkg.c;h=21f239eeab9514e2b58e3b3ff066a3c199d6cf36;hb=546bc72356c7a6b435540852b10625b7531f2117;hp=0489c1cc2cb92c2c9b69292df78995a6b1e3e81d;hpb=69689ee4c3fd92bef21b4d28fd79f446925f82a8;p=oweals%2Fopkg-lede.git diff --git a/libopkg/pkg.c b/libopkg/pkg.c index 0489c1c..21f239e 100644 --- a/libopkg/pkg.c +++ b/libopkg/pkg.c @@ -15,8 +15,6 @@ General Public License for more details. */ -#include "config.h" - #include #include #include @@ -269,7 +267,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 +285,57 @@ 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; - 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); + + pkg_set_ptr(pkg, blob_id(cur), NULL); + break; - free(deps); - pkg_set_ptr(pkg, PKG_CONFLICTS, NULL); + 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; + case PKG_ALTERNATIVES: + ptr = pkg_get_ptr(pkg, blob_id(cur)); + + if (ptr) { + struct pkg_alternatives *pkg_alts = ptr; + + while (pkg_alts->nalts) + free(pkg_alts->alts[--pkg_alts->nalts]); + free(pkg_alts->alts); + free(pkg_alts); + } + + pkg_set_ptr(pkg, blob_id(cur), NULL); + break; + } } //conffile_list_deinit(&pkg->conffiles); @@ -313,7 +347,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) @@ -324,6 +358,11 @@ int pkg_init_from_file(pkg_t * pkg, const char *filename) pkg_init(pkg); + if (!(pkg->state_flag & SF_NEED_DETAIL)) { + opkg_msg(DEBUG, "applying abpkg flag to %s\n", filename); + pkg->state_flag |= SF_NEED_DETAIL; + } + pkg_set_string(pkg, PKG_LOCAL_FILENAME, filename); tmp = xstrdup(filename); @@ -407,6 +446,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)) { @@ -453,6 +495,9 @@ int pkg_merge(pkg_t * oldpkg, pkg_t * newpkg) if (!oldpkg->essential) oldpkg->essential = newpkg->essential; + if (!oldpkg->provided_by_hand) + oldpkg->provided_by_hand = newpkg->provided_by_hand; + return 0; } @@ -473,34 +518,6 @@ abstract_pkg_t *abstract_pkg_new(void) return ab_pkg; } -void set_flags_from_control(pkg_t * pkg) -{ - char *file_name; - FILE *fp; - - sprintf_alloc(&file_name, "%s/%s.control", pkg->dest->info_dir, - pkg->name); - - fp = fopen(file_name, "r"); - if (fp == NULL) { - opkg_perror(ERROR, "Failed to open %s", file_name); - free(file_name); - return; - } - - free(file_name); - - if (pkg_parse_from_stream(pkg, fp, PFM_ALL ^ PFM_ESSENTIAL)) { - opkg_msg(DEBUG, - "Unable to read control file for %s. May be empty.\n", - pkg->name); - } - - fclose(fp); - - return; -} - static const char *pkg_state_want_to_str(pkg_state_want_t sw) { int i; @@ -633,7 +650,22 @@ void pkg_formatted_field(FILE * fp, pkg_t * pkg, const char *field) switch (field[0]) { case 'a': case 'A': - if (strcasecmp(field, "Architecture") == 0) { + if (strcasecmp(field, "Alternatives") == 0) { + struct pkg_alternatives *pkg_alts = pkg_get_ptr(pkg, PKG_ALTERNATIVES); + + if (pkg_alts && pkg_alts->nalts > 0) { + int i; + struct pkg_alternative *alt; + + alt = pkg_alts->alts[0]; + fprintf(fp, "Alternatives: %d:%s:%s", alt->prio, alt->path, alt->altpath); + for (i = 1; i < pkg_alts->nalts; i++) { + alt = pkg_alts->alts[i]; + fprintf(fp, ", %d:%s:%s", alt->prio, alt->path, alt->altpath); + } + fputs("\n", fp); + } + } else if (strcasecmp(field, "Architecture") == 0) { p = pkg_get_architecture(pkg); if (p) { fprintf(fp, "Architecture: %s\n", @@ -771,10 +803,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"); } @@ -820,13 +851,11 @@ void pkg_formatted_field(FILE * fp, pkg_t * pkg, const char *field) if (p) { fprintf(fp, "Section: %s\n", p); } -#if defined HAVE_SHA256 } else if (strcasecmp(field, "SHA256sum") == 0) { p = pkg_get_string(pkg, PKG_SHA256SUM); if (p) { fprintf(fp, "SHA256sum: %s\n", p); } -#endif } else if (strcasecmp(field, "Size") == 0) { i = pkg_get_int(pkg, PKG_SIZE); if (i) { @@ -938,6 +967,7 @@ void pkg_print_status(pkg_t * pkg, FILE * file) pkg_formatted_field(file, pkg, "Conffiles"); pkg_formatted_field(file, pkg, "Installed-Time"); pkg_formatted_field(file, pkg, "Auto-Installed"); + pkg_formatted_field(file, pkg, "Alternatives"); fputs("\n", file); } @@ -1335,7 +1365,8 @@ int pkg_run_script(pkg_t * pkg, const char *script, const char *args) /* Installed packages have scripts in pkg->dest->info_dir, uninstalled packages have scripts in tmp_unpack_dir. */ if (pkg->state_status == SS_INSTALLED - || pkg->state_status == SS_UNPACKED) { + || pkg->state_status == SS_UNPACKED + || pkg->state_status == SS_HALF_INSTALLED) { if (pkg->dest == NULL) { opkg_msg(ERROR, "Internal error: %s has a NULL dest.\n", pkg->name); @@ -1373,7 +1404,7 @@ int pkg_run_script(pkg_t * pkg, const char *script, const char *args) sprintf_alloc(&cmd, "%s %s", path, args); free(path); { - const char *argv[] = { "sh", "-c", cmd, NULL }; + const char *argv[] = { "/bin/sh", "-c", cmd, NULL }; err = xsystem(argv); } free(cmd);