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>