Index | Thread | Search

From:
Todd C. Miller <millert@openbsd.org>
Subject:
Re: ksh: use nanosecond resolution in the test builtin
To:
Collin Funk <collin.funk1@gmail.com>
Cc:
tech@openbsd.org
Date:
Mon, 24 Mar 2025 14:12:16 -0600

Download raw body.

Thread
On Sun, 23 Mar 2025 23:29:58 -0700, Collin Funk wrote:

> The ksh test builtin does not support nanosecond resolution which is
> possible with the timespec structure.
>
> This caused a failure in the autoconf test suite, but that can easily be
> fixed with a sleep.

I think we want to retain the existing behavior for when the file
doesn't exist.  That would look something like this.

 - todd

Index: bin/ksh/c_test.c
===================================================================
RCS file: /cvs/src/bin/ksh/c_test.c,v
diff -u -p -u -r1.28 c_test.c
--- bin/ksh/c_test.c	10 Jun 2023 07:24:21 -0000	1.28
+++ bin/ksh/c_test.c	24 Mar 2025 20:05:43 -0000
@@ -327,7 +327,8 @@ test_eval(Test_env *te, Test_op op, cons
 			 */
 			return stat(opnd1, &b1) == 0 &&
 			    (((s2 = stat(opnd2, &b2)) == 0 &&
-			    b1.st_mtime > b2.st_mtime) || s2 < 0);
+			    timespeccmp(&b1.st_mtim, &b2.st_mtim, >)) ||
+			    s2 != 0);
 		}
 	case TO_FILOT: /* -ot */
 		{
@@ -337,7 +338,8 @@ test_eval(Test_env *te, Test_op op, cons
 			 */
 			return stat(opnd2, &b2) == 0 &&
 			    (((s1 = stat(opnd1, &b1)) == 0 &&
-			    b1.st_mtime < b2.st_mtime) || s1 < 0);
+			    timespeccmp(&b1.st_mtim, &b2.st_mtim, <)) ||
+			    s1 != 0);
 		}
 	case TO_FILEQ: /* -ef */
 		return stat (opnd1, &b1) == 0 && stat (opnd2, &b2) == 0 &&