From owner-freebsd-hackers@FreeBSD.ORG Sun Jun 20 14:47:12 2004 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id F1A8316A4CE for ; Sun, 20 Jun 2004 14:47:12 +0000 (GMT) Received: from mta04-svc.ntlworld.com (mta04-svc.ntlworld.com [62.253.162.44]) by mx1.FreeBSD.org (Postfix) with ESMTP id 2DFE643D49 for ; Sun, 20 Jun 2004 14:47:12 +0000 (GMT) (envelope-from scott@fishballoon.org) Received: from llama.fishballoon.org ([81.104.195.124]) by mta04-svc.ntlworld.comESMTP <20040620144558.LPSY24958.mta04-svc.ntlworld.com@llama.fishballoon.org>; Sun, 20 Jun 2004 15:45:58 +0100 Received: from tuatara.fishballoon.org ([192.168.1.6]) by llama.fishballoon.org with esmtp (Exim 4.34 (FreeBSD)) id 1Bc3ax-000OUH-UM; Sun, 20 Jun 2004 15:46:55 +0100 Received: (from scott@localhost) by tuatara.fishballoon.org (8.12.11/8.12.11/Submit) id i5KEkt18085327; Sun, 20 Jun 2004 15:46:55 +0100 (BST) (envelope-from scott) Date: Sun, 20 Jun 2004 15:46:54 +0100 From: Scott Mitchell To: David Malone Message-ID: <20040620144654.GG462@tuatara.fishballoon.org> References: <20040619175007.GB462@tuatara.fishballoon.org> <414787887.20040619210137@andric.com> <20040619193545.GC462@tuatara.fishballoon.org> <14210101.20040619220601@andric.com> <20040619225229.GE462@tuatara.fishballoon.org> <20040620085912.GA7301@walton.maths.tcd.ie> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="oC1+HKm2/end4ao3" Content-Disposition: inline In-Reply-To: <20040620085912.GA7301@walton.maths.tcd.ie> User-Agent: Mutt/1.4.2.1i X-Operating-System: FreeBSD 4.10-PRERELEASE i386 cc: freebsd-hackers@freebsd.org cc: Dimitry Andric Subject: Re: /bin/ls sorting bug? X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 20 Jun 2004 14:47:13 -0000 --oC1+HKm2/end4ao3 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Sun, Jun 20, 2004 at 09:59:12AM +0100, David Malone wrote: > On Sat, Jun 19, 2004 at 11:52:29PM +0100, Scott Mitchell wrote: > > On Sat, Jun 19, 2004 at 10:06:01PM +0200, Dimitry Andric wrote: > > > Looking through ls source shows that the sorting is done by passing a > > > comparison function to fts_open(3). In the case of sorting by > > > modification time, the *only* comparison made is of the mtime fields: > > > > You did see the patch attached to my original post, right? It modifies all > > of these comparison functions to sort the two items by name (or reverse > > name) in the case that their timestamps are equal. > > Hi Scott, > > Could you produce a version of your patch that uses the nanoseconds > field too? I produced the one below, but I think the style in your > patch was nicer. Also, I wonder if the revblahcmp functions should > just call blahcmp with their arguments reversed? > > David. David, New patch attached that compares against the nanos field as well. It could stand a bit of cleaning up to remove the overly long lines. I'm not sure I'd want this in the tree unless we also had an option to display the nanoseconds - as it stands you could get items apparently ordered wrongly, unless you knew the value of their nanos fields. I could do that if people thought it would be useful. Scott -- =========================================================================== Scott Mitchell | PGP Key ID | "Eagles may soar, but weasels Cambridge, England | 0x54B171B9 | don't get sucked into jet engines" scott at fishballoon.org | 0xAA775B8B | -- Anon --oC1+HKm2/end4ao3 Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="ls.patch" Index: cmp.c =================================================================== RCS file: /home/ncvs/src/bin/ls/cmp.c,v retrieving revision 1.13 diff -u -r1.13 cmp.c --- cmp.c 6 Apr 2004 20:06:47 -0000 1.13 +++ cmp.c 20 Jun 2004 14:33:14 -0000 @@ -63,35 +63,47 @@ int modcmp(const FTSENT *a, const FTSENT *b) { - return (b->fts_statp->st_mtime - a->fts_statp->st_mtime); + return (a->fts_statp->st_mtimespec.tv_sec == b->fts_statp->st_mtimespec.tv_sec ? + (a->fts_statp->st_mtimespec.tv_nsec == b->fts_statp->st_mtimespec.tv_nsec ? + namecmp(a, b) : + b->fts_statp->st_mtimespec.tv_nsec - a->fts_statp->st_mtimespec.tv_nsec) : + b->fts_statp->st_mtimespec.tv_sec - a->fts_statp->st_mtimespec.tv_sec); } int revmodcmp(const FTSENT *a, const FTSENT *b) { - return (a->fts_statp->st_mtime - b->fts_statp->st_mtime); + return modcmp(b, a); } int acccmp(const FTSENT *a, const FTSENT *b) { - return (b->fts_statp->st_atime - a->fts_statp->st_atime); + return (a->fts_statp->st_atimespec.tv_sec == b->fts_statp->st_atimespec.tv_sec ? + (a->fts_statp->st_atimespec.tv_nsec == b->fts_statp->st_atimespec.tv_nsec ? + namecmp(a, b) : + b->fts_statp->st_atimespec.tv_nsec - a->fts_statp->st_atimespec.tv_nsec) : + b->fts_statp->st_atimespec.tv_sec - a->fts_statp->st_atimespec.tv_sec); } int revacccmp(const FTSENT *a, const FTSENT *b) { - return (a->fts_statp->st_atime - b->fts_statp->st_atime); + return acccmp(b, a); } int statcmp(const FTSENT *a, const FTSENT *b) { - return (b->fts_statp->st_ctime - a->fts_statp->st_ctime); + return (a->fts_statp->st_ctimespec.tv_sec == b->fts_statp->st_ctimespec.tv_sec ? + (a->fts_statp->st_ctimespec.tv_nsec == b->fts_statp->st_ctimespec.tv_nsec ? + namecmp(a, b) : + b->fts_statp->st_ctimespec.tv_nsec - a->fts_statp->st_ctimespec.tv_nsec) : + b->fts_statp->st_ctimespec.tv_sec - a->fts_statp->st_ctimespec.tv_sec); } int revstatcmp(const FTSENT *a, const FTSENT *b) { - return (a->fts_statp->st_ctime - b->fts_statp->st_ctime); + return statcmp(b, a); } --oC1+HKm2/end4ao3--