[PATCH] bltin/test: align -nt and -ot with POSIX.1-2024
наб <[email protected]>
| Newsgroups | org.kernel.vger.dash |
|---|---|
| Message-ID | <qup6njf3q6f5nharnzzvq55dggdollemf6hifsudqn5sx7spwb@tarta.nabijaczleweli.xyz> |
117027 pathname1 −nt pathname2
117028 True if pathname1 resolves to an existing file and pathname2 cannot be resolved, or if
117029 both resolve to existing files and pathname1 is newer than pathname2 according to
117030 their last data modification timestamps; otherwise, false.
117031 pathname1 −ot pathname2
117032 True if pathname2 resolves to an existing file and pathname1 cannot be resolved, or if
117033 both resolve to existing files and pathname1 is older than pathname2 according to
117034 their last data modification timestamps; otherwise, false.
The correct output is
$ [ 2024 -nt 2023 ] && echo yes
yes
$ [ 2023 -nt 2024 ] && echo yes
$ [ 2023 -nt ENOENT ] && echo yes
yes
$ [ ENOENT -nt 2024 ] && echo yes
and
$ [ 2024 -ot 2023 ] && echo yes
$ [ 2023 -ot 2024 ] && echo yes
yes
$ [ 2023 -ot ENOENT ] && echo yes
$ [ ENOENT -ot 2024 ] && echo yes
yes
but dash currently returned only the first yes out of both blocks.
---
Currently updating voreutils for POSIX.1-2024, so looked at dash
built-ins as well.
src/bltin/test.c | 31 +++++++++++++++++--------------
src/dash.1 | 14 ++++++++++++--
2 files changed, 29 insertions(+), 16 deletions(-)
diff --git a/src/bltin/test.c b/src/bltin/test.c
index 2db4d0f..06f6818 100644
--- a/src/bltin/test.c
+++ b/src/bltin/test.c
@@ -17,6 +17,7 @@
#include <string.h>
#include <unistd.h>
#include <stdarg.h>
+#include <stdbool.h>
#include "bltin.h"
#include "../exec.h"
@@ -471,16 +472,17 @@ newerf (const char *f1, const char *f2)
{
struct stat64 b1, b2;
+ if(stat64(f1, &b1) != 0)
+ return false;
+ if(stat64(f2, &b2) != 0)
+ return true;
+
#ifdef HAVE_ST_MTIM
- return (stat64(f1, &b1) == 0 &&
- stat64(f2, &b2) == 0 &&
+ return
( b1.st_mtim.tv_sec > b2.st_mtim.tv_sec ||
- (b1.st_mtim.tv_sec == b2.st_mtim.tv_sec && (b1.st_mtim.tv_nsec > b2.st_mtim.tv_nsec )))
- );
+ (b1.st_mtim.tv_sec == b2.st_mtim.tv_sec && (b1.st_mtim.tv_nsec > b2.st_mtim.tv_nsec )));
#else
- return (stat64(f1, &b1) == 0 &&
- stat64(f2, &b2) == 0 &&
- b1.st_mtime > b2.st_mtime);
+ return b1.st_mtime > b2.st_mtime;
#endif
}
@@ -489,16 +491,17 @@ olderf (const char *f1, const char *f2)
{
struct stat64 b1, b2;
+ if(stat64(f2, &b2) != 0)
+ return false;
+ if(stat64(f1, &b1) != 0)
+ return true;
+
#ifdef HAVE_ST_MTIM
- return (stat64(f1, &b1) == 0 &&
- stat64(f2, &b2) == 0 &&
+ return
(b1.st_mtim.tv_sec < b2.st_mtim.tv_sec ||
- (b1.st_mtim.tv_sec == b2.st_mtim.tv_sec && (b1.st_mtim.tv_nsec < b2.st_mtim.tv_nsec )))
- );
+ (b1.st_mtim.tv_sec == b2.st_mtim.tv_sec && (b1.st_mtim.tv_nsec < b2.st_mtim.tv_nsec )));
#else
- return (stat64(f1, &b1) == 0 &&
- stat64(f2, &b2) == 0 &&
- b1.st_mtime < b2.st_mtime);
+ return b1.st_mtime < b2.st_mtime;
#endif
}
diff --git a/src/dash.1 b/src/dash.1
index 6c4ee2d..96ce89e 100644
--- a/src/dash.1
+++ b/src/dash.1
@@ -2019,7 +2019,12 @@ .Ss Builtins
exist and
.Ar file1
is newer than
-.Ar file2 .
+.Ar file2 ,
+or if
+.Ar file1
+exists but
+.Ar file2
+doesn't.
.It Ar file1 Fl ot Ar file2
True if
.Ar file1
@@ -2028,7 +2033,12 @@ .Ss Builtins
exist and
.Ar file1
is older than
-.Ar file2 .
+.Ar file2 ,
+or if
+.Ar file2
+exists but
+.Ar file1
+doesn't.
.It Ar file1 Fl ef Ar file2
True if
.Ar file1
--
2.39.2
signature.asc
(application/pgp-signature, 833 B)
-----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEfWlHToQCjFzAxEFjvP0LAY0mWPEFAmaMKXQACgkQvP0LAY0m WPG6FxAArQM8pdQdvMUNahGcIRMqOc42jxyfUe/x8gexvDboarskA5IReqPvDirK J1KkbgB43g/zcfVyfFMSxXmDX6AICx25H045jD++BCSJCbAyrForgZZ1uVUvAL+1 g2OKp27tIpk3vGwkUg6MJttM6Iwfei9N2bwZ3q+4AYVsKsT7l8Evh2yVpdusvX+p ZSTAEOwPK9aOjMHYzFnyopAHjZyeFfzSKz3ReQa9Mo5jKM00ksIfHzsLjdoCOoRl B23tj1QaOkPfjFgSpMG3pABFFghr/FeZsyPaOWeG5T9lIKP+2c6g4BrtyH+KM55T fKqXiVUChCM1CRmA9STzWuHVecROV4xhy/JN9aBV/JaG2oK0gDGhrHAFM9n8/5Cd InbTU812MKCjpEIHGR9H/qfG2Jvt6DDIENKryY5GjdY6Ner4Kpk3jCMxXvrZIwTP sM0jdTHz2mjRxWn8zfSlZ0LhlgE8rG+9Z4W7hXtPz5My513J45gDzpuN9XVxD5Pr RTvDfY5lulab8csi24ZTAO3usNfVFMJQ8AfWxcSHXgENQQVTB97QGgCDsMhw7Zft on7h9IGMkkzPhMcAaXR8HYEazdMlQLEJMLyWhuITzif3gBEOpD5z49HvND4jRmQg qSHbc3R/UA+z8Rent9gkzkFwtAEJEf/5t2ZGS34w6CJXjeDriVQ= =9UoT -----END PGP SIGNATURE-----