General Public License for more details.
*/
-#include "includes.h"
-#include <ctype.h>
-#include <alloca.h>
+#include "config.h"
+
+#include <stdio.h>
#include <string.h>
-#include <stdbool.h>
-#include <errno.h>
+#include <ctype.h>
+#include <unistd.h>
+#include <libgen.h>
#include "pkg.h"
pkg->recommends_str = NULL;
pkg->suggests_count = 0;
pkg->recommends_count = 0;
-
+
active_list_init(&pkg->list);
pkg->conflicts = NULL;
pkg->replaces = NULL;
pkg->replaces_count = 0;
-
+
pkg->pre_depends_count = 0;
pkg->pre_depends_str = NULL;
pkg->provides_count = 0;
if (pkg->description)
free(pkg->description);
pkg->description = NULL;
-
+
pkg->state_want = SW_UNKNOWN;
pkg->state_flag = SF_OK;
pkg->state_status = SS_NOT_INSTALLED;
pkg->pre_depends_count = 0;
pkg->provides_count = 0;
-
+
if (pkg->filename)
free(pkg->filename);
pkg->filename = NULL;
-
+
if (pkg->local_filename)
free(pkg->local_filename);
pkg->local_filename = NULL;
{
int fd, err = 0;
FILE *control_file;
- char *control_path;
+ char *control_path, *tmp;
pkg_init(pkg);
pkg->local_filename = xstrdup(filename);
- sprintf_alloc(&control_path, "%s/%s.control.XXXXXX",
+ tmp = xstrdup(filename);
+ sprintf_alloc(&control_path, "%s/%s.control.XXXXXX",
conf->tmp_dir,
- basename(filename));
+ basename(tmp));
+ free(tmp);
fd = mkstemp(control_path);
if (fd == -1) {
opkg_perror(ERROR, "Failed to make temp file %s", control_path);
rewind(control_file);
- if (pkg_parse_from_stream(pkg, control_file, 0))
+ if ((err = pkg_parse_from_stream(pkg, control_file, 0))) {
+ if (err == 1) {
+ opkg_msg(ERROR, "Malformed package file %s.\n",
+ filename);
+ }
err = -1;
+ }
err2:
fclose(control_file);
fp = fopen(file_name, "r");
if (fp == NULL) {
- opkg_perror(ERROR, "Failed to open %s");
+ opkg_perror(ERROR, "Failed to open %s", file_name);
free(file_name);
return;
}
fprintf(fp, "Conffiles:\n");
for (iter = nv_pair_list_first(&pkg->conffiles); iter; iter = nv_pair_list_next(&pkg->conffiles, iter)) {
if (((conffile_t *)iter->data)->name && ((conffile_t *)iter->data)->value) {
- fprintf(fp, " %s %s\n",
- ((conffile_t *)iter->data)->name,
+ fprintf(fp, " %s %s\n",
+ ((conffile_t *)iter->data)->name,
((conffile_t *)iter->data)->value);
}
}
case 'M':
if (strcasecmp(field, "Maintainer") == 0) {
if (pkg->maintainer) {
- fprintf(fp, "maintainer: %s\n", pkg->maintainer);
+ fprintf(fp, "Maintainer: %s\n", pkg->maintainer);
}
} else if (strcasecmp(field, "MD5sum") == 0) {
if (pkg->md5sum) {
} else if (strcasecmp(field, "Priority") == 0) {
fprintf(fp, "Priority: %s\n", pkg->priority);
} else if (strcasecmp(field, "Provides") == 0) {
- if (pkg->provides_count) {
+ if (pkg->provides_count > 1) {
fprintf(fp, "Provides:");
for(i = 1; i < pkg->provides_count; i++) {
fprintf(fp, "%s %s", i == 1 ? "" : ",",
a->name, b->name);
return 0;
}
-
+
namecmp = strcmp(a->name, b->name);
if (namecmp)
return namecmp;
char *line;
char *installed_file_name;
unsigned int rootdirlen = 0;
+ int list_from_package;
pkg->installed_files_ref_cnt++;
pkg->installed_files = str_list_alloc();
- /* For uninstalled packages, get the file list directly from the package.
- For installed packages, look at the package.list file in the database.
- */
- if (pkg->state_status == SS_NOT_INSTALLED || pkg->dest == NULL) {
+ /*
+ * For installed packages, look at the package.list file in the database.
+ * For uninstalled packages, get the file list directly from the package.
+ */
+ if (pkg->state_status == SS_NOT_INSTALLED || pkg->dest == NULL)
+ list_from_package = 1;
+ else
+ list_from_package = 0;
+
+ if (list_from_package) {
if (pkg->local_filename == NULL) {
return pkg->installed_files;
}
/* XXX: CLEANUP: Maybe rewrite this to avoid using a temporary
file. In other words, change deb_extract so that it can
simply return the file list as a char *[] rather than
- insisting on writing in to a FILE * as it does now. */
+ insisting on writing it to a FILE * as it does now. */
sprintf_alloc(&list_file_name, "%s/%s.list.XXXXXX",
conf->tmp_dir, pkg->name);
fd = mkstemp(list_file_name);
pkg->dest->info_dir, pkg->name);
list_file = fopen(list_file_name, "r");
if (list_file == NULL) {
- opkg_perror(ERROR, "Failed to open %s.\n",
+ opkg_perror(ERROR, "Failed to open %s",
list_file_name);
free(list_file_name);
return pkg->installed_files;
while (1) {
char *file_name;
-
+
line = file_read_line_alloc(list_file);
if (line == NULL) {
break;
}
file_name = line;
- if (pkg->state_status == SS_NOT_INSTALLED || pkg->dest == NULL) {
+ if (list_from_package) {
if (*file_name == '.') {
file_name++;
}
fclose(list_file);
- if (pkg->state_status == SS_NOT_INSTALLED || pkg->dest == NULL) {
+ if (list_from_package) {
unlink(list_file_name);
free(list_file_name);
}
/* XXX: FEATURE: When conf->offline_root is set, we should run the
maintainer script within a chroot environment. */
- if (conf->offline_root) {
+ if (conf->offline_root && !conf->force_postinstall) {
opkg_msg(INFO, "Offline root mode: not running %s.%s.\n",
pkg->name, script);
return 0;
free(cmd);
if (err) {
- opkg_msg(ERROR, "%s script returned status %d.\n", script, err);
+ opkg_msg(ERROR, "package \"%s\" %s script returned status %d.\n",
+ pkg->name, script, err);
return err;
}
return 0;
}
-static int
-pkg_get_arch_priority(const char *archname)
-{
- nv_pair_list_elt_t *l;
-
- list_for_each_entry(l , &conf->arch_list.head, node) {
- nv_pair_t *nv = (nv_pair_t *)l->data;
- if (strcmp(nv->name, archname) == 0) {
- int priority = strtol(nv->value, NULL, 0);
- return priority;
- }
- }
- return 0;
-}
-
void
pkg_info_preinstall_check(void)
{
int i;
- pkg_vec_t *available_pkgs = pkg_vec_alloc();
pkg_vec_t *installed_pkgs = pkg_vec_alloc();
- opkg_msg(INFO, "Updating arch priority for each package.\n");
- pkg_hash_fetch_available(available_pkgs);
- /* update arch_priority for each package */
- for (i = 0; i < available_pkgs->len; i++) {
- pkg_t *pkg = available_pkgs->pkgs[i];
- int arch_priority = 1;
- if (!pkg)
- continue;
- arch_priority = pkg_get_arch_priority(pkg->architecture);
- pkg->arch_priority = arch_priority;
- }
-
- for (i = 0; i < available_pkgs->len; i++) {
- pkg_t *pkg = available_pkgs->pkgs[i];
- if (!pkg->arch_priority && (pkg->state_flag || (pkg->state_want != SW_UNKNOWN))) {
- /* clear flags and want for any uninstallable package */
- opkg_msg(DEBUG, "Clearing state_want and state_flag for pkg=%s "
- "(arch_priority=%d flag=%d want=%d)\n",
- pkg->name, pkg->arch_priority,
- pkg->state_flag, pkg->state_want);
- pkg->state_want = SW_UNKNOWN;
- pkg->state_flag = 0;
- }
- }
- pkg_vec_free(available_pkgs);
-
/* update the file owner data structure */
opkg_msg(INFO, "Updating file owner list.\n");
pkg_hash_fetch_all_installed(installed_pkgs);
"files for pkg %s.\n", pkg->name);
break;
}
- for (iter = str_list_first(installed_files), niter = str_list_next(installed_files, iter);
- iter;
+ for (iter = str_list_first(installed_files), niter = str_list_next(installed_files, iter);
+ iter;
iter = niter, niter = str_list_next(installed_files, iter)) {
char *installed_file = (char *) iter->data;
file_hash_set_file_owner(installed_file, pkg);