X-Git-Url: https://git.librecmc.org/?p=oweals%2Fopkg-lede.git;a=blobdiff_plain;f=libopkg%2Fopkg_install.c;h=a76322d12358aa45ca8bf89374e0b37ec5c0459d;hp=aae72be6cb0909e3c675468d3c7e1fdf9d165782;hb=4c22d4a7b34aeea993310a65c6c4c15a15df5646;hpb=31d07533a12024a5a6c6f50d538cacda055f57b8 diff --git a/libopkg/opkg_install.c b/libopkg/opkg_install.c index aae72be..a76322d 100644 --- a/libopkg/opkg_install.c +++ b/libopkg/opkg_install.c @@ -36,7 +36,7 @@ typedef void (*sighandler_t)(int); #include "opkg_utils.h" #include "opkg_message.h" -#include "opkg_state.h" +#include "opkg_cmd.h" #include "opkg_defines.h" #include "sprintf_alloc.h" @@ -44,6 +44,7 @@ typedef void (*sighandler_t)(int); #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); @@ -85,9 +86,6 @@ int opkg_install_from_file(opkg_conf_t *conf, const char *filename) char *old_version, *new_version; pkg = pkg_new(); - if (pkg == NULL) { - return ENOMEM; - } err = pkg_init_from_file(pkg, filename); if (err) { @@ -105,8 +103,6 @@ int opkg_install_from_file(opkg_conf_t *conf, const char *filename) 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); @@ -207,6 +203,8 @@ opkg_error_t opkg_install_by_name(opkg_conf_t *conf, const char *pkg_name) } 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); } } @@ -582,14 +580,13 @@ static int pkg_remove_orphan_dependent(opkg_conf_t *conf, pkg_t *pkg, pkg_t *old 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;idepends_count;i++) { found = 0; for (j=0;jdepends_count;j++) { @@ -601,14 +598,14 @@ static int pkg_remove_orphan_dependent(opkg_conf_t *conf, pkg_t *pkg, pkg_t *old 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); @@ -685,12 +682,6 @@ int pkg_remove_installed_replacees_unwind(opkg_conf_t *conf, pkg_vec_t *replacee 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) { @@ -769,8 +760,7 @@ int opkg_install_pkg(opkg_conf_t *conf, pkg_t *pkg, int from_upgrade) #ifdef HAVE_SHA256 char* file_sha256; #endif - char *pkgid; - + if ( from_upgrade ) message = 1; /* Coming from an upgrade, and should change the output message */ @@ -873,7 +863,7 @@ int opkg_install_pkg(opkg_conf_t *conf, pkg_t *pkg, int from_upgrade) 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", @@ -881,7 +871,8 @@ int opkg_install_pkg(opkg_conf_t *conf, pkg_t *pkg, int from_upgrade) free(file_md5); return OPKG_INSTALL_ERR_MD5; } - free(file_md5); + if (file_md5) + free(file_md5); } #ifdef HAVE_SHA256 @@ -889,7 +880,7 @@ int opkg_install_pkg(opkg_conf_t *conf, pkg_t *pkg, int from_upgrade) if(pkg->sha256sum) { file_sha256 = file_sha256sum_alloc(pkg->local_filename); - if (strcmp(file_sha256, pkg->sha256sum)) + 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", @@ -897,7 +888,8 @@ int opkg_install_pkg(opkg_conf_t *conf, pkg_t *pkg, int from_upgrade) free(file_sha256); return OPKG_INSTALL_ERR_SHA256; } - free(file_sha256); + if (file_sha256) + free(file_sha256); } #endif @@ -914,28 +906,21 @@ int opkg_install_pkg(opkg_conf_t *conf, pkg_t *pkg, int from_upgrade) 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; @@ -1029,10 +1014,7 @@ int opkg_install_pkg(opkg_conf_t *conf, pkg_t *pkg, int from_upgrade) 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; @@ -1058,15 +1040,12 @@ int opkg_install_pkg(opkg_conf_t *conf, pkg_t *pkg, int from_upgrade) 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) @@ -1141,7 +1120,7 @@ static int preinst_configure(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); @@ -1475,42 +1454,11 @@ static int remove_obsolesced_files(opkg_conf_t *conf, pkg_t *pkg, pkg_t *old_pkg 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, @@ -1593,10 +1541,8 @@ static int resolve_conffiles(opkg_conf_t *conf, pkg_t *pkg) 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)) { @@ -1620,7 +1566,7 @@ static int resolve_conffiles(opkg_conf_t *conf, pkg_t *pkg) 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 @@ -1629,7 +1575,8 @@ static int resolve_conffiles(opkg_conf_t *conf, pkg_t *pkg) } } unlink(cf_backup); - free(md5sum); + if (md5sum) + free(md5sum); } free(cf_backup);