From 75390455cbc4a73a775c610863073f01f195d688 Mon Sep 17 00:00:00 2001 From: "Dmitry V. Levin" Date: Thu, 18 May 2023 12:00:00 +0000 Subject: [PATCH 1/3] testsuite-17.11.sh: fix assert_1() Fix assert_1() to exit with an error status in case of a failed assertion. --- test/units/testsuite-17.11.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/units/testsuite-17.11.sh b/test/units/testsuite-17.11.sh index f1897b6785..4b9e188b22 100755 --- a/test/units/testsuite-17.11.sh +++ b/test/units/testsuite-17.11.sh @@ -60,10 +60,12 @@ assert_0() { } assert_1() { + local rc set +e udevadm verify "$@" >"${out}" 2>"${err}" - assert_eq "$?" 1 + rc=$? set -e + assert_eq "$rc" 1 if [ -f "${exp}" ]; then diff -u "${exp}" "${err}" From f366434090cee751712b89fe2e315797ecdfa066 Mon Sep 17 00:00:00 2001 From: "Dmitry V. Levin" Date: Thu, 18 May 2023 17:00:00 +0000 Subject: [PATCH 2/3] udev-rules: avoid issuing redundant diagnostics in verify mode When udevadm verify is given an argument that doesn't point to an existing file, there used to be two diagnostics messages, the first one at a warning level, and the second one at an error level: $ build/udevadm verify /no/such/directory Failed to open /no/such/directory, ignoring: No such file or directory Failed to parse rules file /no/such/directory: No such file or directory Fix this by issuing just the error message. --- src/udev/udev-rules.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/udev/udev-rules.c b/src/udev/udev-rules.c index fc1ef34964..e5a25bd119 100644 --- a/src/udev/udev-rules.c +++ b/src/udev/udev-rules.c @@ -1454,7 +1454,10 @@ int udev_rules_parse_file(UdevRules *rules, const char *filename, bool extra_che f = fopen(filename, "re"); if (!f) { - if (!extra_checks && errno == ENOENT) + if (extra_checks) + return -errno; + + if (errno == ENOENT) return 0; return log_warning_errno(errno, "Failed to open %s, ignoring: %m", filename); From a9802abaee78e1f6dfb71de9254f845077be06d8 Mon Sep 17 00:00:00 2001 From: "Dmitry V. Levin" Date: Wed, 17 May 2023 14:00:00 +0000 Subject: [PATCH 3/3] udevadm-verify: add support for directory arguments MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When an argument specified to udevadm verify is a directory, verify all *.rules files in that directory. Suggested-by: Zbigniew Jędrzejewski-Szmek --- src/udev/udevadm-verify.c | 59 +++++++++++++++++++++++++++++------ test/units/testsuite-17.11.sh | 41 +++++++++++++++++++----- 2 files changed, 83 insertions(+), 17 deletions(-) diff --git a/src/udev/udevadm-verify.c b/src/udev/udevadm-verify.c index 48aeb8f7e7..37c477da6a 100644 --- a/src/udev/udevadm-verify.c +++ b/src/udev/udevadm-verify.c @@ -12,6 +12,7 @@ #include "log.h" #include "parse-argument.h" #include "pretty-print.h" +#include "stat-util.h" #include "static-destruct.h" #include "strv.h" #include "udev-rules.h" @@ -119,20 +120,58 @@ static int verify_rules_file(UdevRules *rules, const char *fname) { return 0; } -static int verify_rules(UdevRules *rules, char **files) { - size_t fail_count = 0, success_count = 0; +static int verify_rules_filelist(UdevRules *rules, char **files, size_t *fail_count, size_t *success_count, bool walk_dirs); + +static int verify_rules_dir(UdevRules *rules, const char *dir, size_t *fail_count, size_t *success_count) { + int r; + _cleanup_strv_free_ char **files = NULL; + + assert(rules); + assert(dir); + assert(fail_count); + assert(success_count); + + r = conf_files_list(&files, ".rules", NULL, 0, dir); + if (r < 0) + return log_error_errno(r, "Failed to enumerate rules files: %m"); + + return verify_rules_filelist(rules, files, fail_count, success_count, /* walk_dirs */ false); +} + +static int verify_rules_filelist(UdevRules *rules, char **files, size_t *fail_count, size_t *success_count, bool walk_dirs) { int r, rv = 0; + assert(rules); + assert(files); + assert(fail_count); + assert(success_count); + STRV_FOREACH(fp, files) { - r = verify_rules_file(rules, *fp); - if (r < 0) { - fail_count++; - if (rv >= 0) - rv = r; - } else - success_count++; + if (walk_dirs && is_dir(*fp, /* follow = */ true) > 0) + r = verify_rules_dir(rules, *fp, fail_count, success_count); + else { + r = verify_rules_file(rules, *fp); + if (r < 0) + ++(*fail_count); + else + ++(*success_count); + } + if (r < 0 && rv >= 0) + rv = r; } + return rv; +} + +static int verify_rules(UdevRules *rules, char **files) { + size_t fail_count = 0, success_count = 0; + int r; + + assert(rules); + assert(files); + + r = verify_rules_filelist(rules, files, &fail_count, &success_count, /* walk_dirs */ true); + printf("\n%s%zu udev rules files have been checked.%s\n" " Success: %zu\n" "%s Fail: %zu%s\n", @@ -144,7 +183,7 @@ static int verify_rules(UdevRules *rules, char **files) { fail_count, fail_count > 0 ? ansi_normal() : ""); - return rv; + return r; } int verify_main(int argc, char *argv[], void *userdata) { diff --git a/test/units/testsuite-17.11.sh b/test/units/testsuite-17.11.sh index 4b9e188b22..d70a93b74f 100755 --- a/test/units/testsuite-17.11.sh +++ b/test/units/testsuite-17.11.sh @@ -31,6 +31,12 @@ cat >"${workdir}/default_output_1_fail" <"${workdir}/output_0_files" <"${out}" - if [ -f "${rules}" ]; then - diff -u "${workdir}/default_output_1_success" "${out}" + if [ -f "${exo}" ]; then + diff -u "${exo}" "${out}" + elif [ -f "${rules}" ]; then + diff -u "${workdir}/default_output_1_success" "${out}" fi next_test_number @@ -97,28 +105,40 @@ assert_1 -N now assert_1 --resolve-names # --resolve-names= takes "early" or "never" assert_1 --resolve-names=now -# Failed to parse rules file .: Is a directory -cp "${workdir}/default_output_1_fail" "${exo}" -assert_1 . # Failed to parse rules file ./nosuchfile: No such file or directory assert_1 ./nosuchfile -# Failed to parse rules file .: Is a directory +# Failed to parse rules file ./nosuchfile: No such file or directory cat >"${exo}" <"${workdir}/${exp}" cd - assert_1 --root="${workdir}" +cd - + +# udevadm verify path/ +sed "s|sample-[0-9]*.rules|${workdir}/${rules_dir}/&|" sample-*.exp >"${workdir}/${exp}" +cd - +assert_1 "${rules_dir}" +cd - exit 0