changeset 887:b042cd34e564

Fix find -mtime
author Felix Janda <felix.janda@posteo.de>
date Fri, 26 Apr 2013 23:15:29 +0200
parents 6bb5c8ace240
children c5e80c74ec6c
files toys/pending/find.c
diffstat 1 files changed, 12 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/toys/pending/find.c	Mon Apr 22 23:18:05 2013 +0200
+++ b/toys/pending/find.c	Fri Apr 26 23:15:29 2013 +0200
@@ -35,7 +35,7 @@
   union {
     char *name_regex;
     struct {
-      char time_op;
+      int sign;
       time_t time;
     } t;
     mode_t type;
@@ -49,10 +49,9 @@
 GLOBALS(
   char *dir;
   struct filter_node *filter_root;
+  time_t itime;
 )
 
-#define SECONDS_PER_DAY (24*60*60)
-
 /* filter operation types */
 #define OP_UNKNOWN	0
 #define OP_OR		2
@@ -74,10 +73,6 @@
 
 #define IS_ACTION(x)    (x >= 20)
 
-#define TEST_LT		0
-#define TEST_EQ		1
-#define TEST_GT		2
-
 /* executes the command for a filter node
    returns 0 for failure or 1 for success
  */
@@ -145,27 +140,9 @@
     return !strcmp(filter->data.name_regex, node->name);
 
   if (op==CHECK_MTIME) {
-    time_t node_time = node->st.st_mtime/SECONDS_PER_DAY;
-    result = 1;
-    switch (filter->data.t.time_op) {
-      /* do time compare here */
-      case TEST_LT:
-        /* FIXTHIS - should result be < or <= ?*/
-        if (node_time > filter->data.t.time) result = 0;
-        break;
-      case TEST_GT:
-        if (node_time < filter->data.t.time) result = 0;
-        break;
-      case TEST_EQ:
-        if (node_time != filter->data.t.time) result = 0;
-        break;
-      default:
-        /* how'd I get here? */
-        result = 0;
-        break;
-    }
-    return result;
-
+    long delta = (long)(((double)TT.itime - node->st.st_mtime) / 86400)
+                 -filter->data.t.time;
+    return filter->data.t.sign == (delta > 0) - (delta < 0);
   }
   if (op==CHECK_TYPE) return (node->st.st_mode & S_IFMT) == filter->data.type;
 
@@ -253,19 +230,18 @@
       case CHECK_MTIME:
         switch(**arg) {
           case '+':
-            node->data.t.time_op=TEST_GT;
-            arg++;
+            node->data.t.sign=+1;
+            (*arg)++;
             break;
           case '-':
-            node->data.t.time_op=TEST_LT;
-            arg++;
+            node->data.t.sign=-1;
+            (*arg)++;
             break;
           default:
-            node->data.t.time_op=TEST_EQ;
+            node->data.t.sign=0;
             break;
         }
-        /* convert to days (very crudely) */
-        node->data.t.time = atoi(*arg)/SECONDS_PER_DAY;
+        node->data.t.time = atoi(*arg);
         break;
       case CHECK_TYPE:
         if (-1 == (j = stridx("fdcblsp", **arg)))
@@ -373,6 +349,7 @@
 
 void find_main(void)
 {
+  TT.itime = time(NULL);
   /* parse filters, if present */
   build_filter_list();