From e62fc971a19b43df377d8beee9e691ab179ca075 Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Fri, 10 Feb 2017 10:16:33 +0100 Subject: [PATCH] cli: implement --nocase flag Introduce a new --nocase flag which causes all opkg pattern matching operations to ignore the case. This is useful to find packages with uppercase letters in their name. Signed-off-by: Jo-Philipp Wich --- libopkg/opkg_cmd.c | 20 ++++++++++---------- libopkg/opkg_conf.c | 1 + libopkg/opkg_conf.h | 2 ++ src/opkg-cl.c | 11 ++++++++++- 4 files changed, 23 insertions(+), 11 deletions(-) diff --git a/libopkg/opkg_cmd.c b/libopkg/opkg_cmd.c index eba833b..b98b86f 100644 --- a/libopkg/opkg_cmd.c +++ b/libopkg/opkg_cmd.c @@ -436,7 +436,7 @@ opkg_configure_packages(char *pkg_name) for(i = 0; i < ordered->len; i++) { pkg = ordered->pkgs[i]; - if (pkg_name && fnmatch(pkg_name, pkg->name, 0)) + if (pkg_name && fnmatch(pkg_name, pkg->name, conf->nocase)) continue; if (pkg->state_status == SS_UNPACKED) { @@ -610,7 +610,7 @@ opkg_list_cmd(int argc, char **argv) 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 */ - if (pkg_name && fnmatch(pkg_name, pkg->name, 0)) + if (pkg_name && fnmatch(pkg_name, pkg->name, conf->nocase)) continue; print_pkg(pkg); } @@ -637,7 +637,7 @@ opkg_list_installed_cmd(int argc, char **argv) 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 */ - if (pkg_name && fnmatch(pkg_name, pkg->name, 0)) + if (pkg_name && fnmatch(pkg_name, pkg->name, conf->nocase)) continue; print_pkg(pkg); } @@ -666,7 +666,7 @@ opkg_list_changed_conffiles_cmd(int argc, char **argv) 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 */ - if (pkg_name && fnmatch(pkg_name, pkg->name, 0)) + if (pkg_name && fnmatch(pkg_name, pkg->name, conf->nocase)) continue; if (nv_pair_list_empty(&pkg->conffiles)) continue; @@ -722,7 +722,7 @@ opkg_info_status_cmd(int argc, char **argv, int installed_only) for (i=0; i < available->len; i++) { pkg = available->pkgs[i]; - if (pkg_name && fnmatch(pkg_name, pkg->name, 0)) { + if (pkg_name && fnmatch(pkg_name, pkg->name, conf->nocase)) { continue; } @@ -792,7 +792,7 @@ opkg_remove_cmd(int argc, char **argv) for (i=0; ilen; a++) { pkg = available->pkgs[a]; - if (fnmatch(argv[i], pkg->name, 0)) { + if (fnmatch(argv[i], pkg->name, conf->nocase)) { continue; } if (conf->restrict_to_default_dest) { @@ -926,7 +926,7 @@ opkg_depends_cmd(int argc, char **argv) for (j=0; jlen; j++) { pkg = available_pkgs->pkgs[j]; - if (fnmatch(argv[i], pkg->name, 0) != 0) + if (fnmatch(argv[i], pkg->name, conf->nocase) != 0) continue; depends_count = pkg->depends_count + @@ -1147,9 +1147,9 @@ opkg_what_provides_replaces_cmd(enum what_field_type what_field_type, int argc, ((what_field_type == WHATPROVIDES) ? pkg->provides[k] : pkg->replaces[k]); - if (fnmatch(target, apkg->name, 0) == 0) { + if (fnmatch(target, apkg->name, conf->nocase) == 0) { opkg_msg(NOTICE, " %s", pkg->name); - if (strcmp(target, apkg->name) != 0) + if ((conf->nocase ? strcasecmp(target, apkg->name) : strcmp(target, apkg->name)) != 0) opkg_msg(NOTICE, "\t%s %s\n", rel_str, apkg->name); opkg_message(NOTICE, "\n"); @@ -1200,7 +1200,7 @@ opkg_search_cmd(int argc, char **argv) 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 (fnmatch(argv[0], installed_file, conf->nocase)==0) print_pkg(pkg); } diff --git a/libopkg/opkg_conf.c b/libopkg/opkg_conf.c index 4711ce7..bf7a563 100644 --- a/libopkg/opkg_conf.c +++ b/libopkg/opkg_conf.c @@ -62,6 +62,7 @@ opkg_option_t options[] = { { "noaction", OPKG_OPT_TYPE_BOOL, &_conf.noaction }, { "download_only", OPKG_OPT_TYPE_BOOL, &_conf.download_only }, { "nodeps", OPKG_OPT_TYPE_BOOL, &_conf.nodeps }, + { "nocase", OPKG_OPT_TYPE_BOOL, &_conf.nocase }, { "offline_root", OPKG_OPT_TYPE_STRING, &_conf.offline_root }, { "overlay_root", OPKG_OPT_TYPE_STRING, &_conf.overlay_root }, { "proxy_passwd", OPKG_OPT_TYPE_STRING, &_conf.proxy_passwd }, diff --git a/libopkg/opkg_conf.h b/libopkg/opkg_conf.h index 3a60bc5..10bfc60 100644 --- a/libopkg/opkg_conf.h +++ b/libopkg/opkg_conf.h @@ -24,6 +24,7 @@ extern opkg_conf_t *conf; #include "config.h" #include +#include /* FNM_CASEFOLD */ #include "hash_table.h" #include "pkg_src_list.h" @@ -79,6 +80,7 @@ struct opkg_conf int force_remove; int check_signature; int nodeps; /* do not follow dependencies */ + int nocase; /* perform case insensitive matching */ char *offline_root; char *overlay_root; int query_all; diff --git a/src/opkg-cl.c b/src/opkg-cl.c index 687bb9e..1e7642f 100644 --- a/src/opkg-cl.c +++ b/src/opkg-cl.c @@ -47,6 +47,7 @@ enum { ARGS_OPT_NOACTION, ARGS_OPT_DOWNLOAD_ONLY, ARGS_OPT_NODEPS, + ARGS_OPT_NOCASE, ARGS_OPT_AUTOREMOVE, ARGS_OPT_CACHE, }; @@ -86,6 +87,7 @@ static struct option long_options[] = { {"noaction", 0, 0, ARGS_OPT_NOACTION}, {"download-only", 0, 0, ARGS_OPT_DOWNLOAD_ONLY}, {"nodeps", 0, 0, ARGS_OPT_NODEPS}, + {"nocase", 0, 0, ARGS_OPT_NOCASE}, {"offline", 1, 0, 'o'}, {"offline-root", 1, 0, 'o'}, {"add-arch", 1, 0, ARGS_OPT_ADD_ARCH}, @@ -107,7 +109,7 @@ args_parse(int argc, char *argv[]) char *tuple, *targ; while (1) { - c = getopt_long_only(argc, argv, "Ad:f:no:p:t:vV::", + c = getopt_long_only(argc, argv, "Ad:f:ino:p:t:vV::", long_options, &option_index); if (c == -1) break; @@ -122,6 +124,9 @@ args_parse(int argc, char *argv[]) case 'f': conf->conf_file = xstrdup(optarg); break; + case 'i': + conf->nocase = FNM_CASEFOLD; + break; case 'o': conf->offline_root = xstrdup(optarg); break; @@ -176,6 +181,9 @@ args_parse(int argc, char *argv[]) case ARGS_OPT_NODEPS: conf->nodeps = 1; break; + case ARGS_OPT_NOCASE: + conf->nocase = FNM_CASEFOLD; + break; case ARGS_OPT_ADD_ARCH: case ARGS_OPT_ADD_DEST: tuple = xstrdup(optarg); @@ -287,6 +295,7 @@ usage() printf("\t--noaction No action -- test only\n"); printf("\t--download-only No action -- download only\n"); printf("\t--nodeps Do not follow dependencies\n"); + printf("\t--nocase Perform case insensitive pattern matching\n"); printf("\t--force-removal-of-dependent-packages\n"); printf("\t Remove package and all dependencies\n"); printf("\t--autoremove Remove packages that were installed\n"); -- 2.30.2