General Public License for more details.
*/
-#include "config.h"
-
#include <stdio.h>
#include <string.h>
#include <ctype.h>
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);
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);
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)
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);
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)) {
if (!oldpkg->essential)
oldpkg->essential = newpkg->essential;
+ if (!oldpkg->provided_by_hand)
+ oldpkg->provided_by_hand = newpkg->provided_by_hand;
+
return 0;
}
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;
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",
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");
}
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) {
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);
}
/* 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);
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);