]> git.ipfire.org Git - thirdparty/openssh-portable.git/commitdiff
portability for sftp globbed ls sort by mtime
authorDamien Miller <djm@mindrot.org>
Sat, 10 Jun 2017 13:41:25 +0000 (23:41 +1000)
committerDamien Miller <djm@mindrot.org>
Sat, 10 Jun 2017 13:41:25 +0000 (23:41 +1000)
Include replacement timespeccmp() for systems that lack it.
Support time_t struct stat->st_mtime in addition to
timespec stat->st_mtim, as well as unsorted fallback.

configure.ac
defines.h
includes.h
sftp.c

index 46f7d49572923045bcc39d3f41f9fa6634b9e723..18079acbaf2b32f629d3ca76b4fae875fa7765ee 100644 (file)
@@ -3814,6 +3814,8 @@ OSSH_CHECK_HEADER_FOR_FIELD([ut_time], [utmpx.h], [HAVE_TIME_IN_UTMPX])
 OSSH_CHECK_HEADER_FOR_FIELD([ut_tv], [utmpx.h], [HAVE_TV_IN_UTMPX])
 
 AC_CHECK_MEMBERS([struct stat.st_blksize])
+AC_CHECK_MEMBERS([struct stat.st_mtim])
+AC_CHECK_MEMBERS([struct stat.st_mtime])
 AC_CHECK_MEMBERS([struct passwd.pw_gecos, struct passwd.pw_class,
 struct passwd.pw_change, struct passwd.pw_expire],
 [], [], [[
index 0420a7e8e0ea65f46b6a41e16d425d4d21d721b7..f1662edcfea056be33a7d1b9d97cad36bb6b4d01 100644 (file)
--- a/defines.h
+++ b/defines.h
@@ -519,6 +519,13 @@ struct winsize {
 }
 #endif
 
+#ifndef timespeccmp
+#define timespeccmp(tsp, usp, cmp)                                     \
+       (((tsp)->tv_sec == (usp)->tv_sec) ?                             \
+           ((tsp)->tv_nsec cmp (usp)->tv_nsec) :                       \
+           ((tsp)->tv_sec cmp (usp)->tv_sec))
+#endif
+
 #ifndef __P
 # define __P(x) x
 #endif
index 497a038b23732d807fcdec6160b8476a00bb13a6..0fd71792e1ac2362c86b1316d91f141be9aaad5d 100644 (file)
@@ -93,6 +93,9 @@
 #ifdef HAVE_SYS_SYSMACROS_H
 # include <sys/sysmacros.h> /* For MIN, MAX, etc */
 #endif
+#ifdef HAVE_SYS_TIME_H
+# include <sys/time.h> /* for timespeccmp if present */
+#endif
 #ifdef HAVE_SYS_MMAN_H
 #include <sys/mman.h> /* for MAP_ANONYMOUS */
 #endif
diff --git a/sftp.c b/sftp.c
index 001c6ed2db3ad5c322ef3501d4bcd63e9a5c4140..67110f738f79e176d46627b4c15c4836b2363a44 100644 (file)
--- a/sftp.c
+++ b/sftp.c
@@ -894,9 +894,15 @@ sglob_comp(const void *aa, const void *bb)
 #define NCMP(a,b) (a == b ? 0 : (a < b ? 1 : -1))
        if (sort_flag & LS_NAME_SORT)
                return (rmul * strcmp(ap, bp));
-       else if (sort_flag & LS_TIME_SORT)
+       else if (sort_flag & LS_TIME_SORT) {
+#if defined(HAVE_STRUCT_STAT_ST_MTIM)
                return (rmul * timespeccmp(&as->st_mtim, &bs->st_mtim, <));
-       else if (sort_flag & LS_SIZE_SORT)
+#elif defined(HAVE_STRUCT_STAT_ST_MTIME)
+               return (rmul * NCMP(as->st_mtime, bs->st_mtime));
+#else
+       return rmul * 1;
+#endif
+       } else if (sort_flag & LS_SIZE_SORT)
                return (rmul * NCMP(as->st_size, bs->st_size));
 
        fatal("Unknown ls sort type");