Date: Mon, 23 Jul 2001 15:34:58 +0200 (CEST) From: Marc Olzheim <marcolz@ilse.nl> To: FreeBSD-gnats-submit@freebsd.org Cc: marcolz@ilse.nl Subject: bin/29165: The time related functions are limited to units of one day or one minute. Message-ID: <200107231334.f6NDYwS11128@serv4.ilse.nl>
next in thread | raw e-mail | index | archive | help
>Number: 29165
>Category: bin
>Synopsis: The time related functions are limited to units of one day or one minute.
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: change-request
>Submitter-Id: current-users
>Arrival-Date: Mon Jul 23 06:40:01 PDT 2001
>Closed-Date:
>Last-Modified:
>Originator: Marc Olzheim
>Release: FreeBSD 4.3-STABLE i386
>Organization:
ilse technology
>Environment:
System: FreeBSD serv4.ilse.nl 4.3-STABLE FreeBSD 4.3-STABLE #0: Thu Jun 14 16:50:54 CEST 2001 marcolz@serv4.ilse.nl:/usr/src/sys/compile/serv4 i386
>Description:
find's time related functions are only capable of calculations with
minutes or days. With this patch, it's possible to specify time units
for -[acm]time.
--- /usr/src/usr.bin/find/find.1 Wed Jul 4 14:16:59 2001
--- /usr/src/usr.bin/find/find.1 Mon Jul 23 13:26:19 2001
@@ -534,14 +534,16 @@
.Pp
All primaries which take a numeric argument allow the number to be
preceded by a plus sign
-.Pq Dq Li +
+.Pq Dq Li + ,
+an equals sign
+.Pq Dq Li =
or a minus sign
.Pq Dq Li - .
A preceding plus sign means
.Dq more than n ,
a preceding minus sign means
.Dq less than n
-and neither means
+and a preceding equals sign or neither means
.Dq exactly n .
.Sh OPERATORS
The primaries may be combined using the following operators.
--- /usr/src/usr.bin/find/find.h Sun May 6 11:53:22 2001
--- /usr/src/usr.bin/find/find.h Mon Jul 23 13:19:03 2001
@@ -74,6 +74,7 @@
struct _plandata *next; /* next node */
exec_f *execute; /* node evaluation function */
int flags; /* private flags */
+ int t_unit;
union {
gid_t _g_data; /* gid */
ino_t _i_data; /* inode */
--- /usr/src/usr.bin/find/function.c Sun May 6 11:53:22 2001
--- /usr/src/usr.bin/find/function.c Mon Jul 23 13:25:43 2001
@@ -94,12 +94,47 @@
return new;
}
+#define UNIT_STR "smhdwMy"
+
+#define TIME_UNIT(a, b) { \
+ switch(b) { \
+ case 's': /* 1 second */ \
+ a->t_unit = 1; \
+ break; \
+ case 'm': /* 1 minute */ \
+ a->t_unit = 60; \
+ break; \
+ case 'q': /* 15 minutes */ \
+ a->t_unit = 900; \
+ break; \
+ case 'h': /* 1 hour */ \
+ a->t_unit = 3600; \
+ break; \
+ case 0: /* default */ \
+ case 'd': /* 1 day */ \
+ a->t_unit = 86400; \
+ break; \
+ case 'w': /* 1 week */ \
+ a->t_unit = 604800; \
+ break; \
+ case 'M': /* 1 synodic month */ \
+ a->t_unit = 2551478; \
+ break; \
+ case 'y': /* 1 sidereal year */ \
+ a->t_unit = 31558118; \
+ break; \
+ default: \
+ errx(1, "Unknown time unit %c\n", b ); \
+ } \
+}
+
+
/*
* find_parsenum --
- * Parse a string of the form [+-]# and return the value.
+ * Parse a string of the form [+-=]# and return the value.
*/
static long long
-find_parsenum(plan, option, vp, endch)
+find_parsenum(plan, option, vp, endstr, endch)
PLAN *plan;
char *option, *vp, *endch;
{
@@ -117,6 +152,9 @@
++str;
plan->flags |= F_LESSTHAN;
break;
+ case '=':
+ ++str;
+ /* Fallthrough */
default:
plan->flags |= F_EQUAL;
break;
@@ -130,10 +168,14 @@
value = strtoq(str, &endchar, 10);
if (value == 0 && endchar == str)
errx(1, "%s: %s: illegal numeric value", option, vp);
- if (endchar[0] && (endch == NULL || endchar[0] != *endch))
- errx(1, "%s: %s: illegal trailing character", option, vp);
+ if (endchar[0] && (endstr == NULL || !strchr(endstr, endchar[0])))
+ errx(1, "%s: %s: %c: illegal trailing character",
+ option, vp, endchar[0]);
if (endch)
*endch = endchar[0];
+ if (endchar[0] && endchar[1])
+ errx(1, "%s: %s: %c: illegal trailing character",
+ option, vp, endchar[1]);
return value;
}
@@ -205,7 +247,7 @@
ftsoptions &= ~FTS_NOSTAT;
new = palloc(option);
- new->t_data = find_parsenum(new, option->name, nmins, NULL);
+ new->t_data = find_parsenum(new, option->name, nmins, NULL, NULL);
TIME_CORRECT(new);
return new;
}
@@ -229,13 +271,13 @@
if (plan->flags & F_TIME_C) {
COMPARE((now - entry->fts_statp->st_ctime +
- 86400 - 1) / 86400, plan->t_data);
+ plan->t_unit - 1) / plan->t_unit, plan->t_data);
} else if (plan->flags & F_TIME_A) {
COMPARE((now - entry->fts_statp->st_atime +
- 86400 - 1) / 86400, plan->t_data);
+ plan->t_unit - 1) / plan->t_unit, plan->t_data);
} else {
COMPARE((now - entry->fts_statp->st_mtime +
- 86400 - 1) / 86400, plan->t_data);
+ plan->t_unit - 1) / plan->t_unit, plan->t_data);
}
}
@@ -246,13 +288,15 @@
{
char *ndays;
PLAN *new;
+ char endch;
ndays = nextarg(option, argvp);
ftsoptions &= ~FTS_NOSTAT;
new = palloc(option);
- new->t_data = find_parsenum(new, option->name, ndays, NULL);
+ new->t_data = find_parsenum(new, option->name, ndays, UNIT_STR, &endch);
TIME_CORRECT(new);
+ TIME_UNIT(new, endch);
return new;
}
@@ -280,9 +324,9 @@
new = palloc(option);
if (option->flags & F_MAXDEPTH)
- maxdepth = find_parsenum(new, option->name, dstr, NULL);
+ maxdepth = find_parsenum(new, option->name, dstr, NULL, NULL);
else
- mindepth = find_parsenum(new, option->name, dstr, NULL);
+ mindepth = find_parsenum(new, option->name, dstr, NULL, NULL);
return new;
}
@@ -778,7 +822,7 @@
ftsoptions &= ~FTS_NOSTAT;
new = palloc(option);
- new->i_data = find_parsenum(new, option->name, inum_str, NULL);
+ new->i_data = find_parsenum(new, option->name, inum_str, NULL, NULL);
return new;
}
@@ -807,7 +851,7 @@
ftsoptions &= ~FTS_NOSTAT;
new = palloc(option);
- new->l_data = (nlink_t)find_parsenum(new, option->name, nlinks, NULL);
+ new->l_data = (nlink_t)find_parsenum(new, option->name, nlinks, NULL, NULL);
return new;
}
@@ -1213,7 +1257,7 @@
new = palloc(option);
endch = 'c';
- new->o_data = find_parsenum(new, option->name, size_str, &endch);
+ new->o_data = find_parsenum(new, option->name, size_str, "c", &endch);
if (endch == 'c')
divsize = 0;
return new;
>How-To-Repeat:
>Fix:
>Release-Note:
>Audit-Trail:
>Unformatted:
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200107231334.f6NDYwS11128>
