add time. do not mark complete/POSIX compliant as exit status is wrong.

This commit is contained in:
Evan Gates 2015-02-27 13:31:04 -08:00 committed by sin
parent 7cc4ef0734
commit 5c8d5c1dca
3 changed files with 65 additions and 0 deletions

View File

@ -137,6 +137,7 @@ BIN =\
tar\ tar\
tee\ tee\
test\ test\
time\
touch\ touch\
tr\ tr\
true\ true\

1
README
View File

@ -74,6 +74,7 @@ The following tools are implemented ('*' == finished, '#' == UTF-8 support,
=* tar non-posix none =* tar non-posix none
=* tee yes none =* tee yes none
=* test yes none =* test yes none
= time no none (incorrect exit status)
=* touch yes none =* touch yes none
#* tr yes none #* tr yes none
=* true yes none =* true yes none

63
time.c Normal file
View File

@ -0,0 +1,63 @@
#include <stdio.h>
#include <unistd.h>
#include <sys/times.h>
#include <sys/wait.h>
#include "util.h"
void
usage(void)
{
eprintf("usage: %s [-p] utility [argument ...]\n", argv0);
}
int
main(int argc, char *argv[])
{
pid_t pid;
struct tms tms; /* hold user and sys times */
clock_t rbeg, rend; /* real time */
long ticks; /* per second */
int status;
ARGBEGIN {
case 'p':
/* used to specify POSIX output format, but that's the only format we
* have for now */
break;
default:
usage();
} ARGEND;
if (!*argv)
usage();
if ((ticks = sysconf(_SC_CLK_TCK)) < 0)
eprintf("sysconf() failed to retrieve clock ticks per second:");
if ((rbeg = times(&tms)) < 0) /* POSIX doesn't say NULL is ok... */
eprintf("times() failed to retrieve start times:");
if (!(pid = fork())) { /* child */
execvp(*argv, argv);
/* FIXME: check errno for POSIX exit status
* 126: found could not be invoked
* 127: could not be found
* problem is some like EACCESS can mean either...
* worth doing manual path search for correct value? also gives more
* accurate time as the patch search wouldn't be included in child's
* user/sys times... */
enprintf(127, "failed to exec %s:", *argv);
}
waitpid(pid, &status, 0);
if ((rend = times(&tms)) < 0)
eprintf("times() failed to retrieve end times:");
fprintf(stderr, "real %f\nuser %f\nsys %f\n",
(rend - rbeg) / (double)ticks,
tms.tms_cutime / (double)ticks,
tms.tms_cstime / (double)ticks);
return WIFEXITED(status) ? WEXITSTATUS(status) : 0;
}