Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 9 Mar 1999 22:39:12 +0100 (MET)
From:      Jens Schweikhardt <schweikh@noc.dfn.de>
To:        FreeBSD-gnats-submit@freebsd.org
Subject:   bin/10515: time(1) not POSIX.2 compliant (patch included)
Message-ID:  <199903092139.WAA16301@obsidian.noc.dfn.de>

next in thread | raw e-mail | index | archive | help

>Number:         10515
>Category:       bin
>Synopsis:       time(1) not POSIX.2 compliant (patch included)
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Tue Mar  9 13:40:00 PST 1999
>Closed-Date:
>Last-Modified:
>Originator:     Jens Schweikhardt
>Release:        FreeBSD 2.2.7-RELEASE i386
>Organization:
DFN
>Environment:

	2.2.7-RELEASE off of the CD ROM.

>Description:

	POSIX.2 requires time(1) to support the -p option which must
	produce output that looks like "real %f\nuser %f\nsys %f\n".
	The current format is all on one line and numbers first and
	-p is not supported.

>How-To-Repeat:

	/usr/bin/time -p
	[barfs: no -p]

>Fix:

This fix simply adds the missing -p option to time(1). It also makes
time's exit status conform to POSIX.2, which should not harm anyone
(haha, famous last words). I've also updated the man page time.1 to
reflect all changes (DIAGNOSTICS and STANDARDS sections plus more).

A small step towards POSIX compliance but a giant leap for my
application, which *needs* it :-)

	Jens Schweikhardt


diff -u against the 2.2.7R files:

--- time.c.old	Tue Mar  9 22:20:52 1999
+++ time.c	Tue Mar  9 22:20:29 1999
@@ -55,6 +55,7 @@
 
 #include <err.h>
 #include <stdio.h>
+#include <errno.h>
 #include <unistd.h>
 
 static int getstathz __P((void));
@@ -66,16 +67,19 @@
 	char **argv;
 {
 	register int pid;
-	int ch, status, lflag;
+	int ch, status, lflag, pflag;
 	struct timeval before, after;
 	struct rusage ru;
 
-	lflag = 0;
-	while ((ch = getopt(argc, argv, "l")) != -1)
+	lflag = pflag = 0;
+	while ((ch = getopt(argc, argv, "lp")) != -1)
 		switch((char)ch) {
 		case 'l':
 			lflag = 1;
 			break;
+		case 'p':
+			pflag = 1;
+			break;
 		case '?':
 		default:
 			usage();
@@ -91,10 +95,16 @@
 		err(1, "time");
 		/* NOTREACHED */
 	case 0:				/* child */
+		errno = 0;
 		execvp(*argv, argv);
-		warn("%s", *argv);
-		_exit(1);
 		/* NOTREACHED */
+		if (errno == ENOENT) {
+			warn("%s", *argv);
+			_exit(127); /* POSIX: utility could not be found */
+		} else {
+			warn("%s", *argv);
+			_exit(126); /* POSIX: utility could not be invoked */
+		}
 	}
 	/* parent */
 	(void)signal(SIGINT, SIG_IGN);
@@ -107,11 +117,22 @@
 	after.tv_usec -= before.tv_usec;
 	if (after.tv_usec < 0)
 		after.tv_sec--, after.tv_usec += 1000000;
-	fprintf(stderr, "%9ld.%02ld real ", after.tv_sec, after.tv_usec/10000);
-	fprintf(stderr, "%9ld.%02ld user ",
-	    ru.ru_utime.tv_sec, ru.ru_utime.tv_usec/10000);
-	fprintf(stderr, "%9ld.%02ld sys\n",
-	    ru.ru_stime.tv_sec, ru.ru_stime.tv_usec/10000);
+	if (pflag) {
+		/* POSIX wants output that must look like
+		   "real %f\nuser %f\nsys %f\n" and requires
+		   at least two digits after the radix. */
+		fprintf(stderr, "real %ld.%02ld\n", after.tv_sec, after.tv_usec/10000);
+		fprintf(stderr, "user %ld.%02ld\n",
+			ru.ru_utime.tv_sec, ru.ru_utime.tv_usec/10000);
+		fprintf(stderr, "sys %ld.%02ld\n",
+			ru.ru_stime.tv_sec, ru.ru_stime.tv_usec/10000);
+	} else {
+		fprintf(stderr, "%9ld.%02ld real ", after.tv_sec, after.tv_usec/10000);
+		fprintf(stderr, "%9ld.%02ld user ",
+			ru.ru_utime.tv_sec, ru.ru_utime.tv_usec/10000);
+		fprintf(stderr, "%9ld.%02ld sys\n",
+			ru.ru_stime.tv_sec, ru.ru_stime.tv_usec/10000);
+	}
 	if (lflag) {
 		int hz = getstathz();
 		u_long ticks;
@@ -161,7 +182,7 @@
 static void
 usage()
 {
-	fprintf(stderr, "usage: time [-l] command\n");
+	fprintf(stderr, "usage: time [-l] [-p] command\n");
 	exit(1);
 }
 
--- time.1.old	Tue Mar  9 21:19:10 1999
+++ time.1	Tue Mar  9 22:14:05 1999
@@ -40,6 +40,7 @@
 .Sh SYNOPSIS
 .Nm
 .Op Fl l
+.Op Fl p
 .Ar command
 .Sh DESCRIPTION
 The
@@ -59,10 +60,9 @@
 writes to the standard error stream,
 (in seconds): 
 the total time elapsed,
-time consumed by system overhead,
-and the time used to execute the
+the time used to execute the
 .Ar command
-process.
+process, and the time consumed by system overhead.
 .Pp
 Available options:
 .Bl -tag -width Ds
@@ -71,25 +71,44 @@
 .Em rusage
 structure are printed as well.
 .El
+.Bl -tag -width Ds
+.It Fl p
+Use the POSIX output format, "real %f\\nuser %f\\nsys %f\\n".
+.El
 .Pp
-The
-.Xr csh 1
-has its own and syntactically different builtin version of
+Most shells have their own and syntactically different builtin version of
 .Nm time .
 The command described here
 is available as
 .Pa /usr/bin/time
-to
-.Xr csh
-users.
+to users of those shells.
+.Sh DIAGNOSTICS
+If
+.Ar command
+could be timed successfully, its exit status is returned. In case
+.Ar command
+terminated abnormally, a warning message is output to stderr.
+If the 
+.Ar command
+was found but could not be run, the exit status is 126.
+If no
+.Ar command
+could be found at all, the exit status is 127.
+If
+.Nm
+encounters any other error, the exit status is between 1 and 125
+including.
 .Sh BUGS
 The granularity of seconds on micro processors is crude and
 can result in times being reported for CPU usage which are too large by
 a second.
 .Sh SEE ALSO
-.Xr csh 1 ,
 .Xr getrusage 2 ,
 .Xr wait 2
+.Sh STANDARDS
+The
+.Nm
+utility is expected to conform to ISO/IEC 9945-2:1993 (``POSIX'').
 .Sh HISTORY
 A
 .Nm

>Release-Note:
>Audit-Trail:
>Unformatted:
 To: FreeBSD-gnats-submit@freebsd.org
 Subject: time(1) not POSIX.2 compliant (patch included)
 From: schweikh@noc.dfn.de
 Reply-To: schweikh@noc.dfn.de
 X-send-pr-version: 3.2
 
 


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?199903092139.WAA16301>