X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=libopkg%2Fopkg_cmd.c;h=6ac847a775b0d04862807418eaa45b16a7d84777;hb=018b48569297b7319cad88d8e94e2fb406304117;hp=d883c7b02b2e0fbf7efae44a40312d822886b869;hpb=6e5ac111a68f68c28e973719154a0acfdbeaf7d6;p=oweals%2Fopkg-lede.git diff --git a/libopkg/opkg_cmd.c b/libopkg/opkg_cmd.c index d883c7b..6ac847a 100644 --- a/libopkg/opkg_cmd.c +++ b/libopkg/opkg_cmd.c @@ -55,6 +55,7 @@ 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); @@ -72,6 +73,7 @@ static int opkg_whatreplaces_cmd(opkg_conf_t *conf, int argc, char **argv); static int opkg_compare_versions_cmd(opkg_conf_t *conf, int argc, char **argv); static int opkg_print_architecture_cmd(opkg_conf_t *conf, int argc, char **argv); static int opkg_configure_cmd(opkg_conf_t *conf, int argc, char **argv); +static int pkg_mark_provides(pkg_t *pkg); /* XXX: CLEANUP: The usage strings should be incorporated into this array for easier maintenance */ @@ -80,6 +82,7 @@ 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_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}, @@ -116,7 +119,7 @@ static void write_status_files_if_changed(opkg_conf_t *conf) opkg_conf_write_status_files(conf); pkg_write_changed_filelists(conf); } else { - opkg_message(conf, OPKG_NOTICE, "Nothing to be done\n"); + opkg_message(conf, OPKG_DEBUG, "Nothing to be done\n"); } } @@ -138,6 +141,23 @@ opkg_cmd_t *opkg_cmd_find(const char *name) return NULL; } +void opkg_print_error_list (opkg_conf_t *conf) +{ + if ( error_list ) { + reverse_error_list(&error_list); + + printf ("Collected errors:\n"); + /* Here we print the errors collected and free the list */ + while (error_list != NULL) { + printf (" * %s", error_list->errmsg); + error_list = error_list->next; + + } + free_error_list(); + } + +} + int opkg_cmd_exec(opkg_cmd_t *cmd, opkg_conf_t *conf, int argc, const char **argv, void *userdata) { int result; @@ -146,24 +166,12 @@ int opkg_cmd_exec(opkg_cmd_t *cmd, opkg_conf_t *conf, int argc, const char **arg result = (cmd->fun)(conf, argc, argv); - if ( result != 0 ) { - opkg_message(conf, OPKG_NOTICE, "An error ocurred, return value: %d.\n", result); + if ( result != 0 && !error_list) { + opkg_message(conf, OPKG_NOTICE, "An error occurred, return value: %d.\n", result); } - if ( error_list ) { - reverse_error_list(&error_list); - - opkg_message(conf, OPKG_NOTICE, "Collected errors:\n"); - /* Here we print the errors collected and free the list */ - while (error_list != NULL) { - opkg_message(conf, OPKG_NOTICE, "%s",error_list->errmsg); - error_list = error_list->next; + opkg_print_error_list (conf); - } - free_error_list(&error_list); - - } - p_userdata = NULL; return result; } @@ -209,10 +217,10 @@ static int opkg_update_cmd(opkg_conf_t *conf, int argc, char **argv) } - for (iter = conf->pkg_src_list.head; iter; iter = iter->next) { + for (iter = void_list_first(&conf->pkg_src_list); iter; iter = void_list_next(&conf->pkg_src_list, iter)) { char *url, *list_file_name; - src = iter->data; + src = (pkg_src_t *)iter->data; if (src->extra_data) /* debian style? */ sprintf_alloc(&url, "%s/%s/%s", src->value, src->extra_data, @@ -253,37 +261,38 @@ static int opkg_update_cmd(opkg_conf_t *conf, int argc, char **argv) free(url); #ifdef HAVE_GPGME - /* download detached signitures to verify the package lists */ - /* get the url for the sig file */ - if (src->extra_data) /* debian style? */ - sprintf_alloc(&url, "%s/%s/%s", src->value, src->extra_data, - "Packages.sig"); - else - sprintf_alloc(&url, "%s/%s", src->value, "Packages.sig"); - - /* create temporary file for it */ - char *tmp_file_name; - - sprintf_alloc (&tmp_file_name, "%s/%s", tmp, "Packages.sig"); - - err = opkg_download(conf, url, tmp_file_name, NULL, NULL); - if (err) { - failures++; - opkg_message (conf, OPKG_NOTICE, "Signature check failed\n"); - } else { - int err; - err = opkg_verify_file (conf, list_file_name, tmp_file_name); - if (err == 0) - opkg_message (conf, OPKG_NOTICE, "Signature check passed\n"); - else - opkg_message (conf, OPKG_NOTICE, "Signature check failed\n"); - } - unlink (tmp_file_name); - free (tmp_file_name); - free (url); + if (conf->check_signature) { + /* download detached signitures to verify the package lists */ + /* get the url for the sig file */ + if (src->extra_data) /* debian style? */ + sprintf_alloc(&url, "%s/%s/%s", src->value, src->extra_data, + "Packages.sig"); + else + sprintf_alloc(&url, "%s/%s", src->value, "Packages.sig"); + + /* create temporary file for it */ + char *tmp_file_name; + + sprintf_alloc (&tmp_file_name, "%s/%s", tmp, "Packages.sig"); + + err = opkg_download(conf, url, tmp_file_name, NULL, NULL); + if (err) { + failures++; + opkg_message (conf, OPKG_NOTICE, "Signature check failed\n"); + } else { + int err; + err = opkg_verify_file (conf, list_file_name, tmp_file_name); + if (err == 0) + opkg_message (conf, OPKG_NOTICE, "Signature check passed\n"); + else + opkg_message (conf, OPKG_NOTICE, "Signature check failed\n"); + } + unlink (tmp_file_name); + free (tmp_file_name); + free (url); + } #else - opkg_message (conf, OPKG_NOTICE, "Signiture check for %s skipped " - "because GPG support was not enabled in this build\n", src->name); + // Do nothing #endif free(list_file_name); } @@ -295,36 +304,6 @@ static int opkg_update_cmd(opkg_conf_t *conf, int argc, char **argv) } -/* scan the args passed and cache the local filenames of the packages */ -int opkg_multiple_files_scan(opkg_conf_t *conf, int argc, char **argv) -{ - int i; - int err; - - /* - * First scan through package names/urls - * For any urls, download the packages and install in database. - * For any files, install package info in database. - */ - for (i = 0; i < argc; i ++) { - char *filename = argv [i]; - //char *tmp = basename (tmp); - //int tmplen = strlen (tmp); - - //if (strcmp (tmp + (tmplen - strlen (OPKG_PKG_EXTENSION)), OPKG_PKG_EXTENSION) != 0) - // continue; - //if (strcmp (tmp + (tmplen - strlen (DPKG_PKG_EXTENSION)), DPKG_PKG_EXTENSION) != 0) - // continue; - - opkg_message(conf, OPKG_DEBUG2, "Debug mfs: %s \n",filename ); - - err = opkg_prepare_url_for_install(conf, filename, &argv[i]); - if (err) - return err; - } - return 0; -} - struct opkg_intercept { char *oldpath; @@ -333,14 +312,21 @@ struct opkg_intercept typedef struct opkg_intercept *opkg_intercept_t; -opkg_intercept_t opkg_prep_intercepts(opkg_conf_t *conf) +static opkg_intercept_t opkg_prep_intercepts(opkg_conf_t *conf) { opkg_intercept_t ctx; + char *oldpath; char *newpath; int gen; - ctx = malloc (sizeof (*ctx)); - ctx->oldpath = strdup (getenv ("PATH")); + ctx = calloc (1, sizeof (*ctx)); + oldpath = getenv ("PATH"); + if (oldpath) { + ctx->oldpath = strdup (oldpath); + } else { + ctx->oldpath = 0; + } + sprintf_alloc (&newpath, "%s/opkg/intercept:%s", DATADIR, ctx->oldpath); setenv ("PATH", newpath, 1); @@ -362,14 +348,18 @@ opkg_intercept_t opkg_prep_intercepts(opkg_conf_t *conf) return ctx; } -int opkg_finalize_intercepts(opkg_intercept_t ctx) +static int opkg_finalize_intercepts(opkg_intercept_t ctx) { char *cmd; DIR *dir; int err = 0; - setenv ("PATH", ctx->oldpath, 1); - free (ctx->oldpath); + if (ctx->oldpath) { + setenv ("PATH", ctx->oldpath, 1); + free (ctx->oldpath); + } else { + unsetenv("PATH"); + } dir = opendir (ctx->statedir); if (dir) { @@ -389,11 +379,12 @@ int opkg_finalize_intercepts(opkg_intercept_t ctx) } free (path); } + closedir(dir); } else perror (ctx->statedir); sprintf_alloc (&cmd, "rm -rf %s", ctx->statedir); - system (cmd); + err = system (cmd); free (cmd); free (ctx->statedir); @@ -410,7 +401,7 @@ int opkg_finalize_intercepts(opkg_intercept_t ctx) used to end recursion and avoid an infinite loop on graph cycles. pkg_vec ordered will finally contain the ordered set of packages. */ -int opkg_recurse_pkgs_in_order(opkg_conf_t *conf, pkg_t *pkg, pkg_vec_t *all, +static int opkg_recurse_pkgs_in_order(opkg_conf_t *conf, pkg_t *pkg, pkg_vec_t *all, pkg_vec_t *visited, pkg_vec_t *ordered) { int j,k,l,m; @@ -492,7 +483,7 @@ int opkg_recurse_pkgs_in_order(opkg_conf_t *conf, pkg_t *pkg, pkg_vec_t *all, } -int opkg_configure_packages(opkg_conf_t *conf, char *pkg_name) +static int opkg_configure_packages(opkg_conf_t *conf, char *pkg_name) { pkg_vec_t *all, *ordered, *visited; int i; @@ -593,8 +584,7 @@ static int opkg_install_cmd(opkg_conf_t *conf, int argc, char **argv) err = opkg_install_by_name(conf, arg); if (err == OPKG_PKG_HAS_NO_CANDIDATE) { opkg_message(conf, OPKG_ERROR, - "Cannot find package %s.\n" - "Check the spelling or perhaps run 'opkg update'\n", + "Cannot find package %s.\n", arg); } } @@ -683,7 +673,7 @@ static int opkg_download_cmd(opkg_conf_t *conf, int argc, char **argv) for (i = 0; i < argc; i++) { arg = argv[i]; - pkg = pkg_hash_fetch_best_installation_candidate_by_name(conf, arg); + pkg = pkg_hash_fetch_best_installation_candidate_by_name(conf, arg, &err); if (pkg == NULL) { opkg_message(conf, OPKG_ERROR, "Cannot find package %s.\n" @@ -723,6 +713,7 @@ static int opkg_list_cmd(opkg_conf_t *conf, int argc, char **argv) } available = pkg_vec_alloc(); pkg_hash_fetch_available(&conf->pkg_hash, available); + pkg_vec_sort(available, pkg_compare_names); for (i=0; i < available->len; i++) { pkg = available->pkgs[i]; /* if we have package name or pattern and pkg does not match, then skip it */ @@ -768,6 +759,7 @@ static int opkg_list_installed_cmd(opkg_conf_t *conf, int argc, char **argv) } available = pkg_vec_alloc(); pkg_hash_fetch_all_installed(&conf->pkg_hash, available); + pkg_vec_sort(available, pkg_compare_names); for (i=0; i < available->len; i++) { pkg = available->pkgs[i]; /* if we have package name or pattern and pkg does not match, then skip it */ @@ -796,6 +788,26 @@ static int opkg_list_installed_cmd(opkg_conf_t *conf, int argc, char **argv) return 0; } +static int opkg_list_upgradable_cmd(opkg_conf_t *conf, int argc, char **argv) +{ + struct active_list *head = prepare_upgrade_list(conf); + struct active_list *node=NULL; + pkg_t *_old_pkg, *_new_pkg; + char *old_v, *new_v; + for (node = active_list_next(head, head); node;node = active_list_next(head,node)) { + _old_pkg = list_entry(node, pkg_t, list); + _new_pkg = pkg_hash_fetch_best_installation_candidate_by_name(conf, _old_pkg->name, NULL); + old_v = pkg_version_str_alloc(_old_pkg); + new_v = pkg_version_str_alloc(_new_pkg); + if (opkg_cb_list) + opkg_cb_list(_old_pkg->name, new_v, old_v, _old_pkg->state_status, p_userdata); + free(old_v); + free(new_v); + } + active_list_head_delete(head); + return 0; +} + static int opkg_info_status_cmd(opkg_conf_t *conf, int argc, char **argv, int installed_only) { int i; @@ -804,7 +816,7 @@ static int opkg_info_status_cmd(opkg_conf_t *conf, int argc, char **argv, int in char *pkg_name = NULL; char **pkg_fields = NULL; int n_fields = 0; - char *buff ; // = (char *)malloc(1); + char *buff = NULL; if (argc > 0) { pkg_name = argv[0]; @@ -836,11 +848,12 @@ static int opkg_info_status_cmd(opkg_conf_t *conf, int argc, char **argv, int in We need to free it :) ( Thanks florian for seeing the error ) */ free(buff); + buff = NULL; } if (conf->verbosity > 1) { conffile_list_elt_t *iter; - for (iter = pkg->conffiles.head; iter; iter = iter->next) { - conffile_t *cf = iter->data; + for (iter = nv_pair_list_first(&pkg->conffiles); iter; iter = nv_pair_list_next(&pkg->conffiles, iter)) { + conffile_t *cf = (conffile_t *)iter->data; int modified = conffile_has_been_modified(conf, cf); opkg_message(conf, OPKG_NOTICE, "conffile=%s md5sum=%s modified=%d\n", cf->name, cf->value, modified); @@ -934,12 +947,12 @@ static int opkg_remove_cmd(opkg_conf_t *conf, int argc, char **argv) done = 0; - available = pkg_vec_alloc(); 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 = malloc(strlen(argv[i])+2); + pkg_name = calloc(1, strlen(argv[i])+2); strcpy(pkg_name,argv[i]); for (a=0; a < available->len; a++) { pkg = available->pkgs[a]; @@ -1100,7 +1113,7 @@ static int opkg_files_cmd(opkg_conf_t *conf, int argc, char **argv) size_t used_len; char *buff ; - buff = (char *)malloc(buff_len); + buff = (char *)calloc(1, buff_len); if ( buff == NULL ) { fprintf( stderr,"%s: Unable to allocate memory \n",__FUNCTION__); return ENOMEM; @@ -1130,7 +1143,7 @@ static int opkg_files_cmd(opkg_conf_t *conf, int argc, char **argv) buff = realloc (buff, buff_len); goto try_again; } - for (iter = installed_files->head; iter; iter = iter->next) { + for (iter = str_list_first(installed_files); iter; iter = str_list_next(installed_files, iter)) { used_len += strlen (iter->data) + 1; while (buff_len <= used_len) { buff_len *= 2; @@ -1325,7 +1338,7 @@ static int opkg_what_depends_conflicts_cmd(opkg_conf_t *conf, enum what_field_ty return 0; } -int pkg_mark_provides(pkg_t *pkg) +static int pkg_mark_provides(pkg_t *pkg) { int provides_count = pkg->provides_count; abstract_pkg_t **provides = pkg->provides; @@ -1430,14 +1443,15 @@ static int opkg_search_cmd(opkg_conf_t *conf, int argc, char **argv) installed = pkg_vec_alloc(); pkg_hash_fetch_all_installed(&conf->pkg_hash, installed); + pkg_vec_sort(installed, pkg_compare_names); for (i=0; i < installed->len; i++) { pkg = installed->pkgs[i]; installed_files = pkg_get_installed_files(pkg); - for (iter = installed_files->head; iter; iter = iter->next) { - installed_file = iter->data; + for (iter = str_list_first(installed_files); iter; iter = str_list_next(installed_files, iter)) { + installed_file = (char *)iter->data; if (fnmatch(argv[0], installed_file, 0)==0) { if (opkg_cb_list) opkg_cb_list(pkg->name, installed_file, @@ -1449,9 +1463,6 @@ static int opkg_search_cmd(opkg_conf_t *conf, int argc, char **argv) pkg_free_installed_files(pkg); } - /* XXX: CLEANUP: It's not obvious from the name of - pkg_hash_fetch_all_installed that we need to call - pkg_vec_free to avoid a memory leak. */ pkg_vec_free(installed); return 0; @@ -1483,11 +1494,9 @@ static int opkg_print_architecture_cmd(opkg_conf_t *conf, int argc, char **argv) { nv_pair_list_elt_t *l; - l = conf->arch_list.head; - while (l) { - nv_pair_t *nv = l->data; + list_for_each_entry(l, &conf->arch_list.head, node) { + nv_pair_t *nv = (nv_pair_t *)l->data; printf("arch %s %s\n", nv->name, nv->value); - l = l->next; } return 0; }