1/* times.c, created from times.def. */
2#line 23 "times.def"
3
4#line 30 "times.def"
5
6#include <config.h>
7
8#if defined (HAVE_UNISTD_H)
9#  ifdef _MINIX
10#    include <sys/types.h>
11#  endif
12#  include <unistd.h>
13#endif
14
15#include <stdio.h>
16#include "../bashtypes.h"
17#include "../shell.h"
18
19#include <posixtime.h>
20
21#if defined (HAVE_SYS_TIMES_H)
22#  include <sys/times.h>
23#endif /* HAVE_SYS_TIMES_H */
24
25#if defined (HAVE_SYS_RESOURCE_H) && !defined (RLIMTYPE)
26#  include <sys/resource.h>
27#endif
28
29#include "common.h"
30
31/* Print the totals for system and user time used. */
32int
33times_builtin (list)
34     WORD_LIST *list;
35{
36#if defined (HAVE_GETRUSAGE) && defined (HAVE_TIMEVAL) && defined (RUSAGE_SELF)
37  struct rusage self, kids;
38
39  USE_VAR(list);
40
41  if (no_options (list))
42    return (EX_USAGE);
43
44  getrusage (RUSAGE_SELF, &self);
45  getrusage (RUSAGE_CHILDREN, &kids);	/* terminated child processes */
46
47  print_timeval (stdout, &self.ru_utime);
48  putchar (' ');
49  print_timeval (stdout, &self.ru_stime);
50  putchar ('\n');
51  print_timeval (stdout, &kids.ru_utime);
52  putchar (' ');
53  print_timeval (stdout, &kids.ru_stime);
54  putchar ('\n');
55
56#else
57#  if defined (HAVE_TIMES)
58  /* This uses the POSIX.1/XPG5 times(2) interface, which fills in a
59     `struct tms' with values of type clock_t. */
60  struct tms t;
61
62  USE_VAR(list);
63
64  if (no_options (list))
65    return (EX_USAGE);
66
67  times (&t);
68
69  print_clock_t (stdout, t.tms_utime);
70  putchar (' ');
71  print_clock_t (stdout, t.tms_stime);
72  putchar ('\n');
73  print_clock_t (stdout, t.tms_cutime);
74  putchar (' ');
75  print_clock_t (stdout, t.tms_cstime);
76  putchar ('\n');
77
78#  else /* !HAVE_TIMES */
79
80  USE_VAR(list);
81
82  if (no_options (list))
83    return (EX_USAGE);
84  printf ("0.00 0.00\n0.00 0.00\n");
85
86#  endif /* HAVE_TIMES */
87#endif /* !HAVE_TIMES */
88
89  return (EXECUTION_SUCCESS);
90}
91