@@ -3,6 +3,7 @@
* This file contains code for the times builtin.
*/
+#include <math.h>
#include <sys/times.h>
#include <unistd.h>
#ifdef USE_GLIBC_STDIO
@@ -19,12 +20,12 @@ int timescmd() {
times(&buf);
printf("%dm%fs %dm%fs\n%dm%fs %dm%fs\n",
(int) (buf.tms_utime / clk_tck / 60),
- ((double) buf.tms_utime) / clk_tck,
+ fmod(((double) buf.tms_utime) / clk_tck, 60),
(int) (buf.tms_stime / clk_tck / 60),
- ((double) buf.tms_stime) / clk_tck,
+ fmod(((double) buf.tms_stime) / clk_tck, 60),
(int) (buf.tms_cutime / clk_tck / 60),
- ((double) buf.tms_cutime) / clk_tck,
+ fmod(((double) buf.tms_cutime) / clk_tck, 60),
(int) (buf.tms_cstime / clk_tck / 60),
- ((double) buf.tms_cstime) / clk_tck);
+ fmod(((double) buf.tms_cstime) / clk_tck, 60));
return 0;
}
Hi all, The `times` builtin in dash fails to compute the seconds part properly. To see the bug, I ran the following script: ```sh delay() { case "$#" in ( 0 ) secs=1 ;; ( 1 ) secs=$(($1+0)) ;; ( * ) exit 2 ;; esac start=$(date "+%s") while now=$(date "+%s") ; [ $((now - start)) -lt "$secs" ] do : done } times delay $((5 * 60)) times ``` The script implements a 5min sleep. An unpatched dash produces the following output: ``` 0m0.000000s 0m0.000000s 0m0.000000s 0m0.000000s 0m8.330000s 0m26.690000s 1m97.670000s 1m107.150000s ``` With the patch, the seconds are computed correctly (NB that this is a different run so times vary slightly): ``` 0m0.000000s 0m0.000000s 0m0.000000s 0m0.000000s 0m8.260000s 0m27.050000s 1m38.130000s 1m45.960000s ``` If folks are opposed to including math.h for some reason, I'm sure the computation could be done another way. Cheers, Michael Signed-off-by: Michael Greenberg <michael.greenberg@pomona.edu>