rtctest implements its own main() function with a rigid switch (argc)
check that only accepts an optional single argument for the RTC device
node path. This prevents kselftest_harness standard arguments from
working properly:

1. Passing filter options like -t <name> or -T <name> triggers a usage
   error because argc is greater than 2.
2. Passing -l or -h causes rtctest to treat "-l" or "-h" as the device
   node path and fail with access() errors before ever reaching the
   harness argument checker.

Parse command line arguments with getopt() to pass all kselftest harness
options (such as -t, -T, -v, -V, -f, -F, -r, -d, -h, and -l) through to
test_harness_run(), while preserving the ability to specify an optional
RTC device node path as a non-option argument. Also ensure optind is
reset before invoking test_harness_run() so the harness can inspect the
options, and bypass device accessibility checks when help or test
listing is requested.

Signed-off-by: Wake Liu <[email protected]>
---
 tools/testing/selftests/rtc/rtctest.c | 44 +++++++++++++++++++++------
 1 file changed, 35 insertions(+), 9 deletions(-)

diff --git a/tools/testing/selftests/rtc/rtctest.c 
b/tools/testing/selftests/rtc/rtctest.c
index 8047d9879039..57dda87ba813 100644
--- a/tools/testing/selftests/rtc/rtctest.c
+++ b/tools/testing/selftests/rtc/rtctest.c
@@ -486,18 +486,44 @@ TEST_F_TIMEOUT(rtc, alarm_wkalm_set_minute, 65) {
 int main(int argc, char **argv)
 {
        int ret = -1;
+       int opt, i;
+       int non_opt = 0;
+
+       while ((opt = getopt(argc, argv, "dhlF:f:V:v:t:T:r:")) != -1) {
+               switch (opt) {
+               case 'h':
+                       fprintf(stderr,
+                               "Usage: %s [-h|-l|-d] [-t|-T|-v|-V|-f|-F|-r 
name] [rtcdev]\n\n",
+                               argv[0]);
+                       optind = 1;
+                       return test_harness_run(argc, argv);
+               case 'l':
+                       optind = 1;
+                       return test_harness_run(argc, argv);
+               case '?':
+                       fprintf(stderr,
+                               "Usage: %s [-h|-l|-d] [-t|-T|-v|-V|-f|-F|-r 
name] [rtcdev]\n",
+                               argv[0]);
+                       return KSFT_FAIL;
+               default:
+                       break;
+               }
+       }
 
-       switch (argc) {
-       case 2:
-               rtc_file = argv[1];
-               /* FALLTHROUGH */
-       case 1:
-               break;
-       default:
-               fprintf(stderr, "usage: %s [rtcdev]\n", argv[0]);
-               return 1;
+       for (i = optind; i < argc; i++) {
+               if (non_opt == 0) {
+                       rtc_file = argv[i];
+                       non_opt++;
+               } else {
+                       fprintf(stderr,
+                               "Usage: %s [-h|-l|-d] [-t|-T|-v|-V|-f|-F|-r 
name] [rtcdev]\n",
+                               argv[0]);
+                       return KSFT_FAIL;
+               }
        }
 
+       optind = 1;
+
        /* Run the test if rtc_file is accessible */
        if (access(rtc_file, R_OK) == 0)
                ret = test_harness_run(argc, argv);
-- 
2.55.0.979.g7e5102b832-goog


Reply via email to