[Midnightbsd-cvs] src [9007] trunk/usr.bin/find: find: include nanoseconds when comparing timestamps.

laffer1 at midnightbsd.org laffer1 at midnightbsd.org
Thu Sep 29 21:44:59 EDT 2016


Revision: 9007
          http://svnweb.midnightbsd.org/src/?rev=9007
Author:   laffer1
Date:     2016-09-29 21:44:59 -0400 (Thu, 29 Sep 2016)
Log Message:
-----------
find: include nanoseconds when comparing timestamps.

Modified Paths:
--------------
    trunk/usr.bin/find/find.h
    trunk/usr.bin/find/function.c

Modified: trunk/usr.bin/find/find.h
===================================================================
--- trunk/usr.bin/find/find.h	2016-09-30 01:44:32 UTC (rev 9006)
+++ trunk/usr.bin/find/find.h	2016-09-30 01:44:59 UTC (rev 9007)
@@ -88,7 +88,7 @@
 		nlink_t _l_data;		/* link count */
 		short _d_data;			/* level depth (-1 to N) */
 		off_t _o_data;			/* file size */
-		time_t _t_data;			/* time value */
+		struct timespec _t_data;	/* time value */
 		uid_t _u_data;			/* uid */
 		short _mt_data;			/* mount flags */
 		struct _plandata *_p_data[2];	/* PLAN trees */

Modified: trunk/usr.bin/find/function.c
===================================================================
--- trunk/usr.bin/find/function.c	2016-09-30 01:44:32 UTC (rev 9006)
+++ trunk/usr.bin/find/function.c	2016-09-30 01:44:59 UTC (rev 9007)
@@ -238,7 +238,7 @@
  */
 #define	TIME_CORRECT(p) \
 	if (((p)->flags & F_ELG_MASK) == F_LESSTHAN) \
-		++((p)->t_data);
+		++((p)->t_data.tv_sec);
 
 /*
  * -[acm]min n functions --
@@ -255,16 +255,16 @@
 {
 	if (plan->flags & F_TIME_C) {
 		COMPARE((now - entry->fts_statp->st_ctime +
-		    60 - 1) / 60, plan->t_data);
+		    60 - 1) / 60, plan->t_data.tv_sec);
 	} else if (plan->flags & F_TIME_A) {
 		COMPARE((now - entry->fts_statp->st_atime +
-		    60 - 1) / 60, plan->t_data);
+		    60 - 1) / 60, plan->t_data.tv_sec);
 	} else if (plan->flags & F_TIME_B) {
 		COMPARE((now - entry->fts_statp->st_birthtime +
-		    60 - 1) / 60, plan->t_data);
+		    60 - 1) / 60, plan->t_data.tv_sec);
 	} else {
 		COMPARE((now - entry->fts_statp->st_mtime +
-		    60 - 1) / 60, plan->t_data);
+		    60 - 1) / 60, plan->t_data.tv_sec);
 	}
 }
 
@@ -278,7 +278,8 @@
 	ftsoptions &= ~FTS_NOSTAT;
 
 	new = palloc(option);
-	new->t_data = find_parsenum(new, option->name, nmins, NULL);
+	new->t_data.tv_sec = find_parsenum(new, option->name, nmins, NULL);
+	new->t_data.tv_nsec = 0;
 	TIME_CORRECT(new);
 	return new;
 }
@@ -309,9 +310,9 @@
 		xtime = entry->fts_statp->st_mtime;
 
 	if (plan->flags & F_EXACTTIME)
-		COMPARE(now - xtime, plan->t_data);
+		COMPARE(now - xtime, plan->t_data.tv_sec);
 	else
-		COMPARE((now - xtime + 86400 - 1) / 86400, plan->t_data);
+		COMPARE((now - xtime + 86400 - 1) / 86400, plan->t_data.tv_sec);
 }
 
 PLAN *
@@ -324,7 +325,8 @@
 	ftsoptions &= ~FTS_NOSTAT;
 
 	new = palloc(option);
-	new->t_data = find_parsetime(new, option->name, value);
+	new->t_data.tv_sec = find_parsetime(new, option->name, value);
+	new->t_data.tv_nsec = 0;
 	if (!(new->flags & F_EXACTTIME))
 		TIME_CORRECT(new);
 	return new;
@@ -1113,14 +1115,19 @@
 int
 f_newer(PLAN *plan, FTSENT *entry)
 {
+	struct timespec ft;
+
 	if (plan->flags & F_TIME_C)
-		return entry->fts_statp->st_ctime > plan->t_data;
+		ft = entry->fts_statp->st_ctim;
 	else if (plan->flags & F_TIME_A)
-		return entry->fts_statp->st_atime > plan->t_data;
+		ft = entry->fts_statp->st_atim;
 	else if (plan->flags & F_TIME_B)
-		return entry->fts_statp->st_birthtime > plan->t_data;
+		ft = entry->fts_statp->st_birthtim;
 	else
-		return entry->fts_statp->st_mtime > plan->t_data;
+		ft = entry->fts_statp->st_mtim;
+	return (ft.tv_sec > plan->t_data.tv_sec ||
+	    (ft.tv_sec == plan->t_data.tv_sec &&
+	    ft.tv_nsec > plan->t_data.tv_nsec));
 }
 
 PLAN *
@@ -1136,20 +1143,22 @@
 	new = palloc(option);
 	/* compare against what */
 	if (option->flags & F_TIME2_T) {
-		new->t_data = get_date(fn_or_tspec);
-		if (new->t_data == (time_t) -1)
+		new->t_data.tv_sec = get_date(fn_or_tspec);
+		if (new->t_data.tv_sec == (time_t) -1)
 			errx(1, "Can't parse date/time: %s", fn_or_tspec);
+		/* Use the seconds only in the comparison. */
+		new->t_data.tv_nsec = 999999999;
 	} else {
 		if (stat(fn_or_tspec, &sb))
 			err(1, "%s", fn_or_tspec);
 		if (option->flags & F_TIME2_C)
-			new->t_data = sb.st_ctime;
+			new->t_data = sb.st_ctim;
 		else if (option->flags & F_TIME2_A)
-			new->t_data = sb.st_atime;
+			new->t_data = sb.st_atim;
 		else if (option->flags & F_TIME2_B)
-			new->t_data = sb.st_birthtime;
+			new->t_data = sb.st_birthtim;
 		else
-			new->t_data = sb.st_mtime;
+			new->t_data = sb.st_mtim;
 	}
 	return new;
 }



More information about the Midnightbsd-cvs mailing list