#include "opkg_utils.h"
#include "opkg_message.h"
-#include "opkg_state.h"
+#include "opkg_cmd.h"
#include "opkg_defines.h"
#include "sprintf_alloc.h"
#include "str_util.h"
#include "xsystem.h"
#include "user.h"
+#include "libbb/libbb.h"
static int verify_pkg_installable(opkg_conf_t *conf, pkg_t *pkg);
static int unpack_pkg_control_files(opkg_conf_t *conf, pkg_t *pkg);
static int install_data_files(opkg_conf_t *conf, pkg_t *pkg);
static int resolve_conffiles(opkg_conf_t *conf, pkg_t *pkg);
-static int cleanup_temporary_files(opkg_conf_t *conf, pkg_t *pkg);
-
static int user_prefers_old_conffile(const char *file, const char *backup);
static char *backup_filename_alloc(const char *file_name);
char *old_version, *new_version;
pkg = pkg_new();
- if (pkg == NULL) {
- return ENOMEM;
- }
err = pkg_init_from_file(pkg, filename);
if (err) {
pkg = hash_insert_pkg(&conf->pkg_hash, pkg, 1,conf);
old = pkg_hash_fetch_installed_by_name(&conf->pkg_hash, pkg->name);
- pkg->local_filename = strdup(filename);
-
if (old) {
old_version = pkg_version_str_alloc(old);
new_version = pkg_version_str_alloc(pkg);
} else if (cmp < 0) {
new->dest = old->dest;
old->state_want = SW_DEINSTALL; /* Here probably the problem for bug 1277 */
+ free(old_version);
+ free(new_version);
}
}
static int update_file_ownership(opkg_conf_t *conf, pkg_t *new_pkg, pkg_t *old_pkg)
{
- str_list_t *new_list = pkg_get_installed_files(new_pkg);
+ str_list_t *new_list = pkg_get_installed_files(conf, new_pkg);
str_list_elt_t *iter, *niter;
for (iter = str_list_first(new_list), niter = str_list_next(new_list, iter);
file_hash_set_file_owner(conf, new_file, new_pkg);
}
if (old_pkg) {
- str_list_t *old_list = pkg_get_installed_files(old_pkg);
+ str_list_t *old_list = pkg_get_installed_files(conf, old_pkg);
for (iter = str_list_first(old_list), niter = str_list_next(old_list, iter);
iter;
iter = niter, niter = str_list_next(old_list, niter)) {
int i, j, found;
char *buf, *d_str;
pkg_t *p;
+
if (!old_pkg)
return 0;
- if (!pkg) {
- fprintf(stderr, "pkg shall not be NULL here. please send to the bugzilla!! [%s %d]\n", __FILE__, __LINE__);
- return -1;
- }
+
if (old_pkg->depends_count == 0)
return 0;
+
for (i=0;i<old_pkg->depends_count;i++) {
found = 0;
for (j=0;j<pkg->depends_count;j++) {
if (found)
continue;
d_str = old_pkg->depends_str[i];
- buf = calloc (1, strlen (d_str) + 1);
+ buf = xcalloc(1, strlen (d_str) + 1);
j=0;
while (d_str[j] != '\0' && d_str[j] != ' ') {
buf[j]=d_str[j];
++j;
}
buf[j]='\0';
- buf = realloc (buf, strlen (buf) + 1);
+ buf = xrealloc (buf, strlen (buf) + 1);
p = pkg_hash_fetch_installed_by_name (&conf->pkg_hash, buf);
if (!p) {
fprintf(stderr, "The pkg %s had been removed!!\n", buf);
return 0;
}
-int caught_sigint = 0;
-static void opkg_install_pkg_sigint_handler(int sig)
-{
- caught_sigint = sig;
-}
-
/* compares versions of pkg and old_pkg, returns 0 if OK to proceed with installation of pkg, 1 otherwise */
static int opkg_install_check_downgrade(opkg_conf_t *conf, pkg_t *pkg, pkg_t *old_pkg, int message)
{
abstract_pkg_t *ab_pkg = NULL;
int old_state_flag;
char* file_md5;
- char *pkgid;
-
+#ifdef HAVE_SHA256
+ char* file_sha256;
+#endif
+
if ( from_upgrade )
message = 1; /* Coming from an upgrade, and should change the output message */
}
/* check that the repository is valid */
- #if HAVE_GPGME
+ #if defined(HAVE_GPGME) || defined(HAVE_OPENSSL)
char *list_file_name, *sig_file_name, *lists_dir;
/* check to ensure the package has come from a repository */
if (file_exists (sig_file_name))
{
- if (opkg_verify_file (conf, list_file_name, sig_file_name))
+ if (opkg_verify_file (conf, list_file_name, sig_file_name)){
+ opkg_message(conf, OPKG_ERROR, "Failed to verify the signature of: %s\n",
+ list_file_name);
return OPKG_INSTALL_ERR_SIGNATURE;
+ }
+ }else{
+ opkg_message(conf, OPKG_ERROR, "Signature file is missing. "
+ "Perhaps you need to run 'opkg update'?\n");
+ return OPKG_INSTALL_ERR_SIGNATURE;
}
free (lists_dir);
if (pkg->md5sum)
{
file_md5 = file_md5sum_alloc(pkg->local_filename);
- if (strcmp(file_md5, pkg->md5sum))
+ if (file_md5 && strcmp(file_md5, pkg->md5sum))
{
opkg_message(conf, OPKG_ERROR,
"Package %s md5sum mismatch. Either the opkg or the package index are corrupt. Try 'opkg update'.\n",
free(file_md5);
return OPKG_INSTALL_ERR_MD5;
}
- free(file_md5);
+ if (file_md5)
+ free(file_md5);
}
+#ifdef HAVE_SHA256
+ /* Check for sha256 value */
+ if(pkg->sha256sum)
+ {
+ file_sha256 = file_sha256sum_alloc(pkg->local_filename);
+ if (file_sha256 && strcmp(file_sha256, pkg->sha256sum))
+ {
+ opkg_message(conf, OPKG_ERROR,
+ "Package %s sha256sum mismatch. Either the opkg or the package index are corrupt. Try 'opkg update'.\n",
+ pkg->name);
+ free(file_sha256);
+ return OPKG_INSTALL_ERR_SHA256;
+ }
+ if (file_sha256)
+ free(file_sha256);
+ }
+#endif
+
if (pkg->tmp_unpack_dir == NULL) {
unpack_pkg_control_files(conf, pkg);
}
if (conf->nodeps == 0) {
err = satisfy_dependencies_for(conf, pkg);
if (err) { return OPKG_INSTALL_ERR_DEPENDENCIES; }
+ if (pkg->state_status == SS_UNPACKED)
+ /* Circular dependency has installed it for us. */
+ return 0;
}
replacees = pkg_vec_alloc();
pkg_get_installed_replacees(conf, pkg, replacees);
- sprintf_alloc (&pkgid, "%s;%s;%s;", pkg->name, pkg->version, pkg->architecture);
- opkg_set_current_state (conf, OPKG_STATE_INSTALLING_PKG, pkgid);
- free (pkgid);
-
/* this next section we do with SIGINT blocked to prevent inconsistency between opkg database and filesystem */
{
sigset_t newset, oldset;
- sighandler_t old_handler = NULL;
- int use_signal = 0;
- caught_sigint = 0;
- if (use_signal) {
- old_handler = signal(SIGINT, opkg_install_pkg_sigint_handler);
- } else {
- sigemptyset(&newset);
- sigaddset(&newset, SIGINT);
- sigprocmask(SIG_BLOCK, &newset, &oldset);
- }
+
+ sigemptyset(&newset);
+ sigaddset(&newset, SIGINT);
+ sigprocmask(SIG_BLOCK, &newset, &oldset);
opkg_state_changed++;
pkg->state_flag |= SF_FILELIST_CHANGED;
time(&pkg->installed_time);
- opkg_message(conf, OPKG_INFO,
- " cleanup temp files\n");
- cleanup_temporary_files(conf, pkg);
-
ab_pkg = pkg->parent;
if (ab_pkg)
ab_pkg->state_status = pkg->state_status;
opkg_message(conf, OPKG_INFO, "Done.\n");
- if (use_signal)
- signal(SIGINT, old_handler);
- else
- sigprocmask(SIG_UNBLOCK, &newset, &oldset);
+ sigprocmask(SIG_UNBLOCK, &newset, &oldset);
pkg_vec_free (replacees);
return 0;
UNWIND_REMOVE_INSTALLED_REPLACEES:
pkg_remove_installed_replacees_unwind(conf, replacees);
- opkg_message(conf, OPKG_INFO,
- " cleanup temp files\n");
- cleanup_temporary_files(conf, pkg);
-
opkg_message(conf, OPKG_INFO,
"Failed.\n");
- if (use_signal)
- signal(SIGINT, old_handler);
- else
- sigprocmask(SIG_UNBLOCK, &newset, &oldset);
+
+ sigprocmask(SIG_UNBLOCK, &newset, &oldset);
pkg_vec_free (replacees);
return OPKG_ERR_UNKNOWN;
}
- opkg_set_current_state (conf, OPKG_STATE_NONE, NULL);
}
static int prerm_upgrade_old_pkg(opkg_conf_t *conf, pkg_t *pkg, pkg_t *old_pkg)
sprintf_alloc(&preinst_args, "install %s", pkg_version);
free(pkg_version);
} else {
- preinst_args = strdup("install");
+ preinst_args = xstrdup("install");
}
err = pkg_run_script(conf, pkg, "preinst", preinst_args);
int clashes = 0;
- files_list = pkg_get_installed_files(pkg);
+ files_list = pkg_get_installed_files(conf, pkg);
for (iter = str_list_first(files_list), niter = str_list_next(files_list, iter);
iter;
iter = niter, niter = str_list_next(files_list, iter)) {
int clashes = 0;
- files_list = pkg_get_installed_files(pkg);
+ files_list = pkg_get_installed_files(conf, pkg);
for (iter = str_list_first(files_list), niter = str_list_next(files_list, iter);
iter;
iter = niter, niter = str_list_next(files_list, niter)) {
return 0;
}
- old_files = pkg_get_installed_files(old_pkg);
- new_files = pkg_get_installed_files(pkg);
+ old_files = pkg_get_installed_files(conf, old_pkg);
+ new_files = pkg_get_installed_files(conf, pkg);
new_files_table.entries = NULL;
hash_table_init("new_files" , &new_files_table, 20);
return 0;
}
-static int remove_obsolete_maintainer_scripts(opkg_conf_t *conf, pkg_t *pkg, pkg_t *old_pkg)
-{
- int i;
- int err = 0;
- char *globpattern;
- glob_t globbuf;
- if (0) {
- if (!pkg->dest) {
- opkg_message(conf, OPKG_ERROR, "%s: no dest for package %s\n", __FUNCTION__, pkg->name);
- return -1;
- }
- sprintf_alloc(&globpattern, "%s/%s.*", pkg->dest->info_dir, pkg->name);
- err = glob(globpattern, 0, NULL, &globbuf);
- free(globpattern);
- if (err) {
- return err;
- }
- /* XXXX this should perhaps only remove the ones that are not overwritten in new package. Jamey 11/11/2003 */
- for (i = 0; i < globbuf.gl_pathc; i++) {
- opkg_message(conf, OPKG_DEBUG, "Removing control file %s from old_pkg %s\n",
- globbuf.gl_pathv[i], old_pkg->name);
- if (!conf->noaction)
- unlink(globbuf.gl_pathv[i]);
- }
- globfree(&globbuf);
- }
- return err;
-}
-
static int install_maintainer_scripts(opkg_conf_t *conf, pkg_t *pkg, pkg_t *old_pkg)
{
int ret;
char *prefix;
- if (old_pkg)
- remove_obsolete_maintainer_scripts(conf, pkg, old_pkg);
sprintf_alloc(&prefix, "%s.", pkg->name);
ret = pkg_extract_control_files_to_dir_with_prefix(pkg,
pkg->dest->info_dir,
conffile_list_elt_t *iter;
conffile_t *cf;
char *cf_backup;
+ char *md5sum;
- char *md5sum;
-
-
if (conf->noaction) return 0;
for (iter = nv_pair_list_first(&pkg->conffiles); iter; iter = nv_pair_list_next(&pkg->conffiles, iter)) {
if (file_exists(cf_backup)) {
/* Let's compute md5 to test if files are changed */
md5sum = file_md5sum_alloc(cf_backup);
- if (strcmp( cf->value,md5sum) != 0 ) {
+ if (md5sum && cf->value && strcmp(cf->value,md5sum) != 0 ) {
if (conf->force_maintainer) {
opkg_message(conf, OPKG_NOTICE, "Conffile %s using maintainer's setting.\n", cf_backup);
} else if (conf->force_defaults
- || user_prefers_old_conffile(cf->name, cf_backup) ) {
+ || user_prefers_old_conffile(root_filename, cf_backup) ) {
rename(cf_backup, root_filename);
}
}
unlink(cf_backup);
- free(md5sum);
+ if (md5sum)
+ free(md5sum);
}
free(cf_backup);
" D : show the differences between the versions (if diff is installed)\n"
" The default action is to keep your current version.\n"
" *** %s (Y/I/N/O/D) [default=N] ? ", file_name, short_file_name);
+
+ if (response == NULL)
+ return 1;
+
if (strcmp(response, "y") == 0
|| strcmp(response, "i") == 0
|| strcmp(response, "yes") == 0) {
}
if (strcmp(response, "d") == 0) {
- char *cmd;
-
- free(response);
- /* XXX: BUG rewrite to use exec or busybox's internal diff */
- sprintf_alloc(&cmd, "diff -u %s %s", backup, file_name);
- xsystem(cmd);
- free(cmd);
+ const char *argv[] = {"diff", "-u", backup, file_name, NULL};
+ xsystem(argv);
printf(" [Press ENTER to continue]\n");
response = file_read_line_alloc(stdin);
free(response);
}
}
-/* XXX: CLEANUP: I'd like to move all of the code for
- creating/cleaning pkg->tmp_unpack_dir directly into pkg.c. (Then,
- it would make sense to cleanup pkg->tmp_unpack_dir directly from
- pkg_deinit for example). */
-static int cleanup_temporary_files(opkg_conf_t *conf, pkg_t *pkg)
-{
- DIR *tmp_dir;
- struct dirent *dirent;
- char *tmp_file;
-
-#ifdef OPKG_DEBUG_NO_TMP_CLEANUP
-#error
- opkg_message(conf, OPKG_DEBUG,
- "%s: Not cleaning up %s since opkg compiled with OPKG_DEBUG_NO_TMP_CLEANUP\n",
- __FUNCTION__, pkg->tmp_unpack_dir);
- return 0;
-#endif
-
- if (pkg->tmp_unpack_dir && file_is_dir(pkg->tmp_unpack_dir)) {
- tmp_dir = opendir(pkg->tmp_unpack_dir);
- if (tmp_dir) {
- while (1) {
- dirent = readdir(tmp_dir);
- if (dirent == NULL) {
- break;
- }
- sprintf_alloc(&tmp_file, "%s/%s",
- pkg->tmp_unpack_dir, dirent->d_name);
- if (! file_is_dir(tmp_file)) {
- unlink(tmp_file);
- }
- free(tmp_file);
- }
- closedir(tmp_dir);
- rmdir(pkg->tmp_unpack_dir);
- free(pkg->tmp_unpack_dir);
- pkg->tmp_unpack_dir = NULL;
- }
- }
-
- opkg_message(conf, OPKG_INFO, "cleanup_temporary_files: pkg=%s local_filename=%s tmp_dir=%s\n",
- pkg->name, pkg->local_filename, conf->tmp_dir);
- if (pkg->local_filename && strncmp(pkg->local_filename, conf->tmp_dir, strlen(conf->tmp_dir)) == 0) {
- unlink(pkg->local_filename);
- free(pkg->local_filename);
- pkg->local_filename = NULL;
- }
-
- return 0;
-}
-
static char *backup_filename_alloc(const char *file_name)
{
char *backup;