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 <[email protected]>
diff --git a/src/bltin/times.c b/src/bltin/times.c
index 8eabc1f..7e66f90 100644
--- a/src/bltin/times.c
+++ b/src/bltin/times.c
@@ -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;
}