X-Git-Url: https://git.librecmc.org/?p=oweals%2Fopkg-lede.git;a=blobdiff_plain;f=libopkg%2Fopkg_cmd.c;h=26ec73d5d5279ea94973de20b971e569bb0eabc6;hp=41e7c3131c7d77beb45fad85ed540d6789813d0a;hb=6e6742af3d1dbc27a84afb7c78e296afa976a39d;hpb=6d6c9232a3225b0d5b2e53b087af8f0122db3853 diff --git a/libopkg/opkg_cmd.c b/libopkg/opkg_cmd.c index 41e7c31..26ec73d 100644 --- a/libopkg/opkg_cmd.c +++ b/libopkg/opkg_cmd.c @@ -48,12 +48,10 @@ static int opkg_upgrade_cmd(opkg_conf_t *conf, int argc, char **argv); static int opkg_list_cmd(opkg_conf_t *conf, int argc, char **argv); static int opkg_info_cmd(opkg_conf_t *conf, int argc, char **argv); static int opkg_status_cmd(opkg_conf_t *conf, int argc, char **argv); -static int opkg_install_pending_cmd(opkg_conf_t *conf, int argc, char **argv); static int opkg_install_cmd(opkg_conf_t *conf, int argc, char **argv); static int opkg_list_installed_cmd(opkg_conf_t *conf, int argc, char **argv); static int opkg_list_upgradable_cmd(opkg_conf_t *conf, int argc, char **argv); static int opkg_remove_cmd(opkg_conf_t *conf, int argc, char **argv); -static int opkg_purge_cmd(opkg_conf_t *conf, int argc, char **argv); static int opkg_flag_cmd(opkg_conf_t *conf, int argc, char **argv); static int opkg_files_cmd(opkg_conf_t *conf, int argc, char **argv); static int opkg_search_cmd(opkg_conf_t *conf, int argc, char **argv); @@ -78,14 +76,14 @@ static opkg_cmd_t cmds[] = { {"upgrade", 0, (opkg_cmd_fun_t)opkg_upgrade_cmd}, {"list", 0, (opkg_cmd_fun_t)opkg_list_cmd}, {"list_installed", 0, (opkg_cmd_fun_t)opkg_list_installed_cmd}, + {"list-installed", 0, (opkg_cmd_fun_t)opkg_list_installed_cmd}, {"list_upgradable", 0, (opkg_cmd_fun_t)opkg_list_upgradable_cmd}, + {"list-upgradable", 0, (opkg_cmd_fun_t)opkg_list_upgradable_cmd}, {"info", 0, (opkg_cmd_fun_t)opkg_info_cmd}, {"flag", 1, (opkg_cmd_fun_t)opkg_flag_cmd}, {"status", 0, (opkg_cmd_fun_t)opkg_status_cmd}, - {"install_pending", 0, (opkg_cmd_fun_t)opkg_install_pending_cmd}, {"install", 1, (opkg_cmd_fun_t)opkg_install_cmd}, {"remove", 1, (opkg_cmd_fun_t)opkg_remove_cmd}, - {"purge", 1, (opkg_cmd_fun_t)opkg_purge_cmd}, {"configure", 0, (opkg_cmd_fun_t)opkg_configure_cmd}, {"files", 1, (opkg_cmd_fun_t)opkg_files_cmd}, {"search", 1, (opkg_cmd_fun_t)opkg_search_cmd}, @@ -802,167 +800,54 @@ static int opkg_configure_cmd(opkg_conf_t *conf, int argc, char **argv) return err; } -static int opkg_install_pending_cmd(opkg_conf_t *conf, int argc, char **argv) -{ - int i, err; - char *globpattern; - glob_t globbuf; - - sprintf_alloc(&globpattern, "%s/*" OPKG_PKG_EXTENSION, conf->pending_dir); - err = glob(globpattern, 0, NULL, &globbuf); - free(globpattern); - if (err) { - return 0; - } - - opkg_message(conf, OPKG_NOTICE, - "The following packages in %s will now be installed.\n", - conf->pending_dir); - for (i = 0; i < globbuf.gl_pathc; i++) { - opkg_message(conf, OPKG_NOTICE, - "%s%s", i == 0 ? "" : " ", globbuf.gl_pathv[i]); - } - opkg_message(conf, OPKG_NOTICE, "\n"); - for (i = 0; i < globbuf.gl_pathc; i++) { - err = opkg_install_from_file(conf, globbuf.gl_pathv[i]); - if (err == 0) { - err = unlink(globbuf.gl_pathv[i]); - if (err) { - opkg_message(conf, OPKG_ERROR, - "%s: ERROR: failed to unlink %s: %s\n", - __FUNCTION__, globbuf.gl_pathv[i], strerror(err)); - return err; - } - } - } - globfree(&globbuf); - - return err; -} - static int opkg_remove_cmd(opkg_conf_t *conf, int argc, char **argv) { - int i,a,done; + int i, a, done; pkg_t *pkg; pkg_t *pkg_to_remove; pkg_vec_t *available; - char *pkg_name = NULL; + global_conf = conf; + done = 0; + signal(SIGINT, sigint_handler); -// ENH: Add the "no pkg removed" just in case. + pkg_info_preinstall_check(conf); - done = 0; + available = pkg_vec_alloc(); + pkg_hash_fetch_all_installed(&conf->pkg_hash, available); - pkg_info_preinstall_check(conf); - if ( argc > 0 ) { - available = pkg_vec_alloc(); - pkg_hash_fetch_all_installed(&conf->pkg_hash, available); - for (i=0; i < argc; i++) { - pkg_name = xcalloc(1, strlen(argv[i])+2); - strcpy(pkg_name,argv[i]); - for (a=0; a < available->len; a++) { - pkg = available->pkgs[a]; - if (pkg_name && fnmatch(pkg_name, pkg->name, 0)) { - continue; - } - if (conf->restrict_to_default_dest) { - pkg_to_remove = pkg_hash_fetch_installed_by_name_dest(&conf->pkg_hash, - pkg->name, - conf->default_dest); - } else { - pkg_to_remove = pkg_hash_fetch_installed_by_name(&conf->pkg_hash, pkg->name ); - } + for (i=0; ilen; a++) { + pkg = available->pkgs[a]; + if (fnmatch(argv[i], pkg->name, 0)) { + continue; + } + if (conf->restrict_to_default_dest) { + pkg_to_remove = pkg_hash_fetch_installed_by_name_dest(&conf->pkg_hash, + pkg->name, + conf->default_dest); + } else { + pkg_to_remove = pkg_hash_fetch_installed_by_name(&conf->pkg_hash, pkg->name ); + } - if (pkg_to_remove == NULL) { - opkg_message(conf, OPKG_ERROR, "Package %s is not installed.\n", pkg->name); - continue; - } - if (pkg->state_status == SS_NOT_INSTALLED) { // Added the control, so every already removed package could be skipped - opkg_message(conf, OPKG_ERROR, "Package seems to be %s not installed (STATUS = NOT_INSTALLED).\n", pkg->name); - continue; - } - opkg_remove_pkg(conf, pkg_to_remove,0); - done = 1; - } - free (pkg_name); + if (pkg_to_remove == NULL) { + opkg_message(conf, OPKG_ERROR, "Package %s is not installed.\n", pkg->name); + continue; + } + if (pkg->state_status == SS_NOT_INSTALLED) { // Added the control, so every already removed package could be skipped + opkg_message(conf, OPKG_ERROR, "Package seems to be %s not installed (STATUS = NOT_INSTALLED).\n", pkg->name); + continue; + } + opkg_remove_pkg(conf, pkg_to_remove, 0); + done = 1; } - pkg_vec_free(available); - } else { - pkg_vec_t *installed_pkgs = pkg_vec_alloc(); - int i; - int flagged_pkg_count = 0; - int removed; - - pkg_hash_fetch_all_installed(&conf->pkg_hash, installed_pkgs); - - for (i = 0; i < installed_pkgs->len; i++) { - pkg_t *pkg = installed_pkgs->pkgs[i]; - if (pkg->state_flag & SF_USER) { - flagged_pkg_count++; - } else { - if (!pkg_has_installed_dependents(conf, pkg->parent, pkg, NULL)) - opkg_message(conf, OPKG_NOTICE, "Non-user leaf package: %s\n", pkg->name); - } - } - if (!flagged_pkg_count) { - opkg_message(conf, OPKG_NOTICE, "No packages flagged as installed by user, \n" - "so refusing to uninstall unflagged non-leaf packages\n"); - return 0; - } - - /* find packages not flagged SF_USER (i.e., installed to - * satisfy a dependence) and not having any dependents, and - * remove them */ - do { - removed = 0; - for (i = 0; i < installed_pkgs->len; i++) { - pkg_t *pkg = installed_pkgs->pkgs[i]; - if (!(pkg->state_flag & SF_USER) - && !pkg_has_installed_dependents(conf, pkg->parent, pkg, NULL)) { - removed++; - opkg_message(conf, OPKG_NOTICE, "Removing non-user leaf package %s\n"); - opkg_remove_pkg(conf, pkg,0); - done = 1; - } - } - } while (removed); - pkg_vec_free(installed_pkgs); } - if ( done == 0 ) - opkg_message(conf, OPKG_NOTICE, "No packages removed.\n"); - - write_status_files_if_changed(conf); - return 0; -} - -static int opkg_purge_cmd(opkg_conf_t *conf, int argc, char **argv) -{ - int i; - pkg_t *pkg; - - global_conf = conf; - signal(SIGINT, sigint_handler); - - pkg_info_preinstall_check(conf); - - for (i=0; i < argc; i++) { - if (conf->restrict_to_default_dest) { - pkg = pkg_hash_fetch_installed_by_name_dest(&conf->pkg_hash, - argv[i], - conf->default_dest); - } else { - pkg = pkg_hash_fetch_installed_by_name(&conf->pkg_hash, argv[i]); - } + pkg_vec_free(available); - if (pkg == NULL) { - opkg_message(conf, OPKG_ERROR, - "Package %s is not installed.\n", argv[i]); - continue; - } - opkg_purge_pkg(conf, pkg); - } + if (done == 0) + opkg_message(conf, OPKG_NOTICE, "No packages removed.\n"); write_status_files_if_changed(conf); return 0; @@ -995,11 +880,15 @@ static int opkg_flag_cmd(opkg_conf_t *conf, int argc, char **argv) ( strcmp(flags,"user")==0)||( strcmp(flags,"ok")==0)) { pkg->state_flag = pkg_state_flag_from_str(flags); } -/* pb_ asked this feature 03292004 */ -/* Actually I will use only this two, but this is an open for various status */ + + /* + * Useful if a package is installed in an offline_root, and + * should be configured by opkg-cl configure at a later date. + */ if (( strcmp(flags,"installed")==0)||( strcmp(flags,"unpacked")==0)){ pkg->state_status = pkg_state_status_from_str(flags); } + opkg_state_changed++; opkg_message(conf, OPKG_NOTICE, "Setting flags for package %s to %s\n", @@ -1112,7 +1001,7 @@ enum what_field_type { WHATSUGGESTS }; -static int opkg_what_depends_conflicts_cmd(opkg_conf_t *conf, enum what_field_type what_field_type, int recursive, int argc, char **argv) +static int opkg_what_depends_conflicts_cmd(opkg_conf_t *conf, enum depend_type what_field_type, int recursive, int argc, char **argv) { if (argc > 0) { @@ -1122,12 +1011,11 @@ static int opkg_what_depends_conflicts_cmd(opkg_conf_t *conf, enum what_field_ty int changed; switch (what_field_type) { - case WHATDEPENDS: rel_str = "depends on"; break; - case WHATCONFLICTS: rel_str = "conflicts with"; break; - case WHATSUGGESTS: rel_str = "suggests"; break; - case WHATRECOMMENDS: rel_str = "recommends"; break; - case WHATPROVIDES: rel_str = "provides"; break; - case WHATREPLACES: rel_str = "replaces"; break; + case DEPEND: rel_str = "depends on"; break; + case CONFLICTS: rel_str = "conflicts with"; break; + case SUGGEST: rel_str = "suggests"; break; + case RECOMMEND: rel_str = "recommends"; break; + default: return -1; } if (conf->query_all) @@ -1159,7 +1047,7 @@ static int opkg_what_depends_conflicts_cmd(opkg_conf_t *conf, enum what_field_ty for (j = 0; j < available_pkgs->len; j++) { pkg_t *pkg = available_pkgs->pkgs[j]; int k; - int count = ((what_field_type == WHATCONFLICTS) + int count = ((what_field_type == CONFLICTS) ? pkg->conflicts_count : pkg->pre_depends_count + pkg->depends_count + pkg->recommends_count + pkg->suggests_count); /* skip this package if it is already marked */ @@ -1168,8 +1056,10 @@ static int opkg_what_depends_conflicts_cmd(opkg_conf_t *conf, enum what_field_ty } for (k = 0; k < count; k++) { compound_depend_t *cdepend = - (what_field_type == WHATCONFLICTS) ? &pkg->conflicts[k] : &pkg->depends[k]; + (what_field_type == CONFLICTS) ? &pkg->conflicts[k] : &pkg->depends[k]; int l; + if (what_field_type != cdepend->type) + continue; for (l = 0; l < cdepend->possibility_count; l++) { depend_t *possibility = cdepend->possibilities[l]; if (possibility->pkg->state_flag & SF_MARKED) { @@ -1228,26 +1118,26 @@ static int pkg_mark_provides(pkg_t *pkg) static int opkg_whatdepends_recursively_cmd(opkg_conf_t *conf, int argc, char **argv) { - return opkg_what_depends_conflicts_cmd(conf, WHATDEPENDS, 1, argc, argv); + return opkg_what_depends_conflicts_cmd(conf, DEPEND, 1, argc, argv); } static int opkg_whatdepends_cmd(opkg_conf_t *conf, int argc, char **argv) { - return opkg_what_depends_conflicts_cmd(conf, WHATDEPENDS, 0, argc, argv); + return opkg_what_depends_conflicts_cmd(conf, DEPEND, 0, argc, argv); } static int opkg_whatsuggests_cmd(opkg_conf_t *conf, int argc, char **argv) { - return opkg_what_depends_conflicts_cmd(conf, WHATSUGGESTS, 0, argc, argv); + return opkg_what_depends_conflicts_cmd(conf, SUGGEST, 0, argc, argv); } static int opkg_whatrecommends_cmd(opkg_conf_t *conf, int argc, char **argv) { - return opkg_what_depends_conflicts_cmd(conf, WHATRECOMMENDS, 0, argc, argv); + return opkg_what_depends_conflicts_cmd(conf, RECOMMEND, 0, argc, argv); } static int opkg_whatconflicts_cmd(opkg_conf_t *conf, int argc, char **argv) { - return opkg_what_depends_conflicts_cmd(conf, WHATCONFLICTS, 0, argc, argv); + return opkg_what_depends_conflicts_cmd(conf, CONFLICTS, 0, argc, argv); } static int opkg_what_provides_replaces_cmd(opkg_conf_t *conf, enum what_field_type what_field_type, int argc, char **argv)