From owner-freebsd-bugs Thu Sep 6 10:10:25 2001 Delivered-To: freebsd-bugs@hub.freebsd.org Received: from freefall.freebsd.org (freefall.freebsd.org [216.136.204.21]) by hub.freebsd.org (Postfix) with ESMTP id 84F7337B403 for ; Thu, 6 Sep 2001 10:10:01 -0700 (PDT) Received: (from gnats@localhost) by freefall.freebsd.org (8.11.4/8.11.4) id f86HA1q35219; Thu, 6 Sep 2001 10:10:01 -0700 (PDT) (envelope-from gnats) Date: Thu, 6 Sep 2001 10:10:01 -0700 (PDT) Message-Id: <200109061710.f86HA1q35219@freefall.freebsd.org> To: freebsd-bugs@FreeBSD.org Cc: From: Ruslan Ermilov Subject: Re: bin/30309: New FIND(1) option Reply-To: Ruslan Ermilov Sender: owner-freebsd-bugs@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.org The following reply was made to PR bin/30309; it has been noted by GNATS. From: Ruslan Ermilov To: Nils M Holm Cc: FreeBSD-gnats-submit@FreeBSD.ORG Subject: Re: bin/30309: New FIND(1) option Date: Thu, 6 Sep 2001 20:05:16 +0300 On Thu, Sep 06, 2001 at 03:17:48PM +0200, Nils M Holm wrote: > > On Tue, Sep 04, 2001 at 02:45:11PM +0200, Nils M Holm wrote: > > [...] > > What do you think of just extending the -mtime functionality > > so that it accepts time units in hours and minutes? > > I have extended the -mtime (and -ctime, -atime) syntax to accept units, > as suggested. In addition to hours and minutes, it also accepts seconds, > days, weeks, months, and years. > > When no units are specified, the original semantics are used. > Uh oh, this already applies to 4.2-RELEASE sources, which have since been heavily modified in -CURRENT and -STABLE. How about the following patch instead (without the manpage bit)? Index: find.h =================================================================== RCS file: /home/ncvs/src/usr.bin/find/find.h,v retrieving revision 1.12 diff -u -p -r1.12 find.h --- find.h 2001/09/04 16:09:01 1.12 +++ find.h 2001/09/06 17:04:29 @@ -69,6 +69,7 @@ typedef struct _plandata *creat_f(struct #define F_MTTYPE 0x00001000 #define F_MTUNKNOWN 0x00002000 #define F_IGNCASE 0x00010000 /* iname ipath iregex */ +#define F_EXACTTIME F_IGNCASE /* -[acm]time units syntax */ /* node definition */ typedef struct _plandata { Index: function.c =================================================================== RCS file: /home/ncvs/src/usr.bin/find/function.c,v retrieving revision 1.33 diff -u -p -r1.33 function.c --- function.c 2001/09/04 16:09:01 1.33 +++ function.c 2001/09/06 17:04:31 @@ -67,7 +67,7 @@ static const char rcsid[] = time_t get_date __P((char *date, struct timeb *now)); -#define COMPARE(a, b) { \ +#define COMPARE(a, b) do { \ switch (plan->flags & F_ELG_MASK) { \ case F_EQUAL: \ return (a == b); \ @@ -78,7 +78,7 @@ time_t get_date __P((char *date, struct default: \ abort(); \ } \ -} +} while(0) static PLAN * palloc(option) @@ -138,6 +138,82 @@ find_parsenum(plan, option, vp, endch) } /* + * find_parsetime -- + * Parse a string of the form [+-]([0-9]+[smhdw]?)+ and return the value. + */ +static long long +find_parsetime(plan, option, vp) + PLAN *plan; + char *option, *vp; +{ + long long secs, value; + char *str, *unit; /* Pointer to character ending conversion. */ + + /* Determine comparison from leading + or -. */ + str = vp; + switch (*str) { + case '+': + ++str; + plan->flags |= F_GREATER; + break; + case '-': + ++str; + plan->flags |= F_LESSTHAN; + break; + default: + plan->flags |= F_EQUAL; + break; + } + + value = strtoq(str, &unit, 10); + if (value == 0 && unit == str) { + errx(1, "%s: %s: illegal time value", option, vp); + /* NOTREACHED */ + } + if (*unit == '\0') + return value; + + /* Units syntax. */ + secs = 0; + for (;;) { + switch(*unit) { + case 's': /* seconds */ + secs += value; + break; + case 'm': /* minutes */ + secs += value * 60; + break; + case 'h': /* hours */ + secs += value * 3600; + break; + case 'd': /* days */ + secs += value * 86400; + break; + case 'w': /* weeks */ + secs += value * 604800; + break; + default: + errx(1, "%s: %s: bad unit '%c'", option, vp, *unit); + /* NOTREACHED */ + } + str = unit + 1; + if (*str == '\0') /* EOS */ + break; + value = strtoq(str, &unit, 10); + if (value == 0 && unit == str) { + errx(1, "%s: %s: illegal time value", option, vp); + /* NOTREACHED */ + } + if (*unit == '\0') { + errx(1, "%s: %s: missing trailing unit", option, vp); + /* NOTREACHED */ + } + } + plan->flags |= F_EXACTTIME; + return secs; +} + +/* * nextarg -- * Check that another argument still exists, return a pointer to it, * and increment the argument vector pointer. @@ -226,16 +302,31 @@ f_Xtime(plan, entry) FTSENT *entry; { extern time_t now; + int exact_time; + + exact_time = plan->flags & F_EXACTTIME; if (plan->flags & F_TIME_C) { - COMPARE((now - entry->fts_statp->st_ctime + - 86400 - 1) / 86400, plan->t_data); + if (exact_time) + COMPARE(now - entry->fts_statp->st_ctime, + plan->t_data); + else + COMPARE((now - entry->fts_statp->st_ctime + + 86400 - 1) / 86400, plan->t_data); } else if (plan->flags & F_TIME_A) { - COMPARE((now - entry->fts_statp->st_atime + - 86400 - 1) / 86400, plan->t_data); + if (exact_time) + COMPARE(now - entry->fts_statp->st_atime, + plan->t_data); + else + COMPARE((now - entry->fts_statp->st_atime + + 86400 - 1) / 86400, plan->t_data); } else { - COMPARE((now - entry->fts_statp->st_mtime + - 86400 - 1) / 86400, plan->t_data); + if (exact_time) + COMPARE(now - entry->fts_statp->st_mtime, + plan->t_data); + else + COMPARE((now - entry->fts_statp->st_mtime + + 86400 - 1) / 86400, plan->t_data); } } @@ -244,15 +335,16 @@ c_Xtime(option, argvp) OPTION *option; char ***argvp; { - char *ndays; + char *value; PLAN *new; - ndays = nextarg(option, argvp); + value = nextarg(option, argvp); ftsoptions &= ~FTS_NOSTAT; new = palloc(option); - new->t_data = find_parsenum(new, option->name, ndays, NULL); - TIME_CORRECT(new); + new->t_data = find_parsetime(new, option->name, value); + if (!(new->flags & F_EXACTTIME)) + TIME_CORRECT(new); return new; } Cheers, -- Ruslan Ermilov Oracle Developer/DBA, ru@sunbay.com Sunbay Software AG, ru@FreeBSD.org FreeBSD committer, +380.652.512.251 Simferopol, Ukraine http://www.FreeBSD.org The Power To Serve http://www.oracle.com Enabling The Information Age To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message