Date: Sat, 29 Dec 2001 15:33:28 -0500 From: Mike Barcroft <mike@FreeBSD.ORG> To: Joe Halpin <joe.halpin@attbi.com> Cc: "standards@FreeBSD.ORG" <standards@FreeBSD.ORG> Subject: Re: at utility changes Message-ID: <20011229153328.D99161@espresso.q9media.com> In-Reply-To: <3C2DF35D.1F54BBC3@attbi.com>; from joe.halpin@attbi.com on Sat, Dec 29, 2001 at 10:46:21AM -0600 References: <3C200BBA.9D26ED93@attbi.com> <20011228031537.B99161@espresso.q9media.com> <3C2DF35D.1F54BBC3@attbi.com>
next in thread | previous in thread | raw e-mail | index | archive | help
Joe Halpin <joe.halpin@attbi.com> writes:
> Here are a new set of changes. I think I got the style more or less
> right this time, and cloned the stime_arg1() function from touch.
I like this version much better. It only needs a few changes.
> Index: at/at.c
> ===================================================================
> RCS file: /home/ncvs/src/usr.bin/at/at.c,v
> retrieving revision 1.18.2.1
> diff -u -r1.18.2.1 at.c
> --- at/at.c 2001/08/02 00:55:58 1.18.2.1
> +++ at/at.c 2001/12/29 16:41:19
> @@ -121,6 +121,7 @@
> static char *cwdname(void);
> static void writefile(time_t runtimer, char queue);
> static void list_jobs(void);
> +static time_t ttime(const char *arg);
>
> /* Signal catching functions */
>
> @@ -588,6 +589,80 @@
> }
> } /* delete_jobs */
>
> +#define ATOI2(ar) ((ar)[0] - '0') * 10 + ((ar)[1] - '0'); (ar) += 2;
> +
> +static time_t
> +ttime(const char *arg)
> +{
> + /*
> + * This is pretty much a copy of stime_arg1() from touch.c. I changed
This needs a second space after the period.
> + * the return value and the argument list because it's more convenient
> + * (IMO) to do everything in one place. - Joe Halpin
> + */
> + struct timeval tv[2];
> + time_t now;
> + struct tm *t;
> + int yearset;
> + char *p;
> +
> + if (gettimeofday(&tv[0], NULL))
> + panic("Cannot get current time");
> +
> + /* Start with the current time. */
> + now = tv[0].tv_sec;
> + if ((t = localtime(&now)) == NULL)
> + panic("localtime");
> + /* [[CC]YY]MMDDhhmm[.SS] */
> + if ((p = strchr(arg, '.')) == NULL)
> + t->tm_sec = 0; /* Seconds defaults to 0. */
> + else {
> + if (strlen(p + 1) != 2)
> + goto terr;
> + *p++ = '\0';
> + t->tm_sec = ATOI2(p);
> + }
> +
> + yearset = 0;
> + switch(strlen(arg)) {
> + case 12: /* CCYYMMDDhhmm */
> + t->tm_year = ATOI2(arg);
> + t->tm_year *= 100;
> + yearset = 1;
> + /* FALLTHROUGH */
> + case 10: /* YYMMDDhhmm */
> + if (yearset) {
> + yearset = ATOI2(arg);
> + t->tm_year += yearset;
> + } else {
> + yearset = ATOI2(arg);
> + if (yearset < 69)
> + t->tm_year = yearset + 2000;
> + else
> + t->tm_year = yearset + 1900;
> + }
The else section can be reduced to something like:
%%%
yearset = ATOI2(arg);
t->tm_year = yearset + 2000;
%%%
...since it's impossible to schedule events to take place in the past.
> + t->tm_year -= 1900; /* Convert to UNIX time. */
> + /* FALLTHROUGH */
> + case 8: /* MMDDhhmm */
> + t->tm_mon = ATOI2(arg);
> + --t->tm_mon; /* Convert from 01-12 to 00-11 */
> + t->tm_mday = ATOI2(arg);
> + t->tm_hour = ATOI2(arg);
> + t->tm_min = ATOI2(arg);
> + break;
> + default:
> + goto terr;
> + }
> +
> + t->tm_isdst = -1; /* Figure out DST. */
> + tv[0].tv_sec = tv[1].tv_sec = mktime(t);
> + if (tv[0].tv_sec != -1)
> + return tv[0].tv_sec;
> + else
> + terr:
> + panic("out of range or illegal time specification: [[CC]YY]MMDDhhmm[.SS]");
> + return -1; /* get rid of "control reaches end of non-void function" msg */
The panic and return line should probably be indented more since they
apply to the else case in normal operation. Return values should be
wrapped in parens.
> +}
> +
> int
> main(int argc, char **argv)
> {
> @@ -598,10 +673,12 @@
>
> enum { ATQ, ATRM, AT, BATCH, CAT }; /* what program we want to run */
> int program = AT; /* our default program */
> - char *options = "q:f:mvldbVc"; /* default options for at */
> + char *options = "q:f:t:rmvldbVc"; /* default options for at */
> int disp_version = 0;
> time_t timer;
>
> + timer = -1;
Much better.
> +
Gratuitous vertical space.
> RELINQUISH_PRIVS
>
> /* Eat any leading paths
> @@ -655,6 +732,9 @@
> break;
>
> case 'd':
> + warnx("-d is deprecated; you should use -r in the future");
> + /* fall through to 'r' */
> + case 'r':
> if (program != AT)
> usage();
>
> @@ -662,6 +742,14 @@
> options = "V";
> break;
>
> + case 't':
> + if (program != AT)
> + usage();
> +
This vertical space isn't needed either.
> + options = "V";
> + timer = ttime(optarg);
> + break;
> +
> case 'l':
> if (program != AT)
> usage();
> @@ -696,7 +784,7 @@
>
> if (disp_version)
> fprintf(stderr, "at version " VERSION "\n"
> - "Bug reports to: ig25@rz.uni-karlsruhe.de (Thomas Koenig)\n");
> + "Bug reports to: ig25@rz.uni-karlsruhe.de (Thomas Koenig)\n");
I wonder if the author accepts bug reports on customized versions of
his software.
>
> /* select our program
> */
> @@ -723,7 +811,14 @@
> break;
>
> case AT:
> - timer = parsetime(argc, argv);
> +
Gratuitous vertical space.
> + /*
> + * If timer is > -1, then the user gave the time with -t.
> + * In that case, it's already been set. If not, set it now.
> + */
Comments should go to 80 columns, then wrap. Also, this requires a
second space after the period.
> + if (timer == -1)
> + timer = parsetime(argc, argv);
> +
> if (atverify)
> {
> struct tm *tm = localtime(&timer);
usage() needs to be updated to reflect the new options. It's hidden
away in panic.c.
> Index: at/at.man
> ===================================================================
> RCS file: /home/ncvs/src/usr.bin/at/at.man,v
> retrieving revision 1.13.2.7
> diff -u -r1.13.2.7 at.man
> --- at/at.man 2001/12/14 15:53:29 1.13.2.7
> +++ at/at.man 2001/12/29 16:41:19
The SYNOPSIS sections needs to be updated to reflect the new options.
> @@ -115,6 +115,8 @@
> and to run a job at 1am tomorrow, you would do
> .Nm at Ar 1am tomorrow .
> .Pp
> +You may also use the POSIX time format (see -t argument)
Periods complete sentences.
> +.Pp
> For both
> .Nm
> and
> @@ -214,7 +216,7 @@
> .Nm atq .
> .It Fl d
> Is an alias for
> -.Nm atrm .
> +.Nm atrm (this option is deprecated; use -r instead) .
Please add a new line between `atrm' and `(this', otherwise the whole
section is sent to the macro.
> .It Fl b
> Is an alias for
> .Nm batch .
> @@ -225,6 +227,12 @@
> shows the time the job will be executed.
> .It Fl c
> Cat the jobs listed on the command line to standard output.
> +.It Fl r
> +Remove specified job(s).
> +.It Fl t
> +Give the job time using the POSIX time format, which is described in the
`Give' should be changed to `Specify'.
> +touch(1) man page.
This should be changed to:
%%%
.Xr touch 1
manual.
%%%
(I prefer manual over man page, but that's an optional change.)
> +Note that giving a date past 2038 may not work on 32-bit systems.
This should be under the BUGS section. It also applies to the Alpha
architecture, so it's probably wise to replace `32-bit' with `some'.
> .El
> .Sh FILES
> .Bl -tag -width _ATJOB_DIR/_LOCKFILE -compact
> @@ -271,4 +279,6 @@
> At was mostly written by
> .An Thomas Koenig Aq ig25@rz.uni-karlsruhe.de .
> The time parsing routines are by
> -.An David Parsons Aq orc@pell.chi.il.us .
> +.An David Parsons Aq orc@pell.chi.il.us ,
> +with minor enhancement by
This should say either "with a minor enhancement by" or
"with minor enhancements by". I prefer the latter.
> +.An Joe Halpin Aq joe.halpin@attbi.com .
A `STANDARDS' section should be added under `SEE ALSO':
%%%
.Sh STANDARDS
The
.Nm
utility conforms with
.St -p1003.1-2001 .
%%%
(Would you please verify this? I only glanced at the POSIX.1-2001
requirements.)
Once you get those problems fixed I should be able to test and commit
this for you.
Best regards,
Mike Barcroft
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-standards" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20011229153328.D99161>
