Applied with a fix to check for bad filenames. See earlier commit in the tree.

On Fri, Aug 22, 2014 at 1:58 PM, pi-cheng.chen <pi-cheng.c...@linaro.org> wrote:
> Currently the serial terminal connected to the boards running idlestat are
> restricted to be at least 80 characters wide to output the report. Otherwise
> idlestat quits with message "The terminal must be at least 80 columns wide".
>
> Changes v1 to v2:
> * Duplicate opened report file to stdout instead of replacing all printf()
>
> Fix it by adding a "-o" option to save report output to a file.
>
> Signed-off-by: Pi-Cheng Chen <pi-cheng.c...@linaro.org>
> ---
>  idlestat.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++------
>  idlestat.h |  1 +
>  2 files changed, 51 insertions(+), 6 deletions(-)
>
> diff --git a/idlestat.c b/idlestat.c
> index bba8951..7aa9d74 100644
> --- a/idlestat.c
> +++ b/idlestat.c
> @@ -34,6 +34,7 @@
>  #include <sched.h>
>  #include <string.h>
>  #include <float.h>
> +#include <fcntl.h>
>  #include <sys/ioctl.h>
>  #include <sys/time.h>
>  #include <sys/types.h>
> @@ -71,6 +72,33 @@ static void charrep(char c, int count)
>                 printf("%c", c);
>  }
>
> +static int open_report_file(const char *path)
> +{
> +       int fd;
> +       int ret = 0;
> +
> +       if (path) {
> +               fd = open(path, O_RDWR | O_CREAT | O_TRUNC,
> +                                       S_IRUSR | S_IWUSR | S_IRGRP |S_IROTH);
> +               if (fd < 0) {
> +                       fprintf(stderr, "%s: failed to open '%s'\n", 
> __func__, path);
> +                       return -1;
> +               }
> +
> +               close(STDOUT_FILENO);
> +
> +               ret = dup2(fd, STDOUT_FILENO);
> +               close(fd);
> +
> +               if (ret < 0) {
> +                       fprintf(stderr, "%s: failed to duplicate '%s'\n", 
> __func__, path);
> +                       return ret;
> +               }
> +       }
> +
> +       return 0;
> +}
> +
>  static void display_cpu_header(char *cpu, int length)
>  {
>         charrep('-', length);
> @@ -1111,11 +1139,11 @@ static void help(const char *cmd)
>  {
>         fprintf(stderr,
>                 "\nUsage:\nTrace mode:\n\t%s --trace -f|--trace-file 
> <filename>"
> -               " -t|--duration <seconds> -c|--idle -p|--frequency 
> -w|--wakeup",
> -               basename(cmd));
> +               " -o|--output-file <filename> -t|--duration <seconds>"
> +               " -c|--idle -p|--frequency -w|--wakeup", basename(cmd));
>         fprintf(stderr,
> -               "\nReporting mode:\n\t%s --import -f|--trace-file <filename>",
> -               basename(cmd));
> +               "\nReporting mode:\n\t%s --import -f|--trace-file <filename>"
> +               " -o|--output-file <filename>", basename(cmd));
>         fprintf(stderr,
>                 "\n\nExamples:\n1. Run a trace, post-process the results"
>                 " (default is to show only C-state statistics):\n\tsudo "
> @@ -1131,6 +1159,15 @@ static void help(const char *cmd)
>         fprintf(stderr,
>                 "\n4. Post-process a trace captured earlier:\n\tsudo ./%s"
>                 " --import -f /tmp/mytrace\n", basename(cmd));
> +       fprintf(stderr,
> +               "\n5. Run a trace, post-process the results and print all"
> +               " statistics into a file:\n\tsudo ./%s --trace -f 
> /tmp/mytrace -t 10 -p -c -w"
> +               " -o /tmp/myreport\n", basename(cmd));
> +       fprintf(stderr,
> +               "\n6. Post-process a trace captured earlier and print all"
> +               " statistics into a file:\n\tsudo ./%s --import -f 
> /tmp/mytrace -p -c -w"
> +               " -o /tmp/myreport\n",
> +               basename(cmd));
>  }
>
>  static void version(const char *cmd)
> @@ -1144,6 +1181,7 @@ int getoptions(int argc, char *argv[], struct 
> program_options *options)
>                 { "trace",       no_argument,       &options->mode, TRACE },
>                 { "import",      no_argument,       &options->mode, IMPORT },
>                 { "trace-file",  required_argument, NULL, 'f' },
> +               { "output-file", required_argument, NULL, 'o' },
>                 { "help",        no_argument,       NULL, 'h' },
>                 { "duration",    required_argument, NULL, 't' },
>                 { "version",     no_argument,       NULL, 'V' },
> @@ -1157,13 +1195,14 @@ int getoptions(int argc, char *argv[], struct 
> program_options *options)
>
>         memset(options, 0, sizeof(*options));
>         options->filename = NULL;
> +       options->outfilename = NULL;
>         options->mode = -1;
>         options->format = -1;
>         while (1) {
>
>                 int optindex = 0;
>
> -               c = getopt_long(argc, argv, ":df:ht:cpwVv",
> +               c = getopt_long(argc, argv, ":df:o:ht:cpwVv",
>                                 long_options, &optindex);
>                 if (c == -1)
>                         break;
> @@ -1172,6 +1211,9 @@ int getoptions(int argc, char *argv[], struct 
> program_options *options)
>                 case 'f':
>                         options->filename = optarg;
>                         break;
> +               case 'o':
> +                       options->outfilename = optarg;
> +                       break;
>                 case 'h':
>                         help(argv[0]);
>                         exit(0);
> @@ -1427,7 +1469,7 @@ int main(int argc, char *argv[], char *const envp[])
>                 return -1;
>         }
>
> -       if (check_window_size()) {
> +       if (check_window_size() && !options.outfilename) {
>                 fprintf(stderr, "The terminal must be at least "
>                         "80 columns wide\n");
>                 return -1;
> @@ -1501,6 +1543,8 @@ int main(int argc, char *argv[], char *const envp[])
>          * the same cluster
>          */
>         if (0 == establish_idledata_to_topo(datas)) {
> +               if (open_report_file(options.outfilename))
> +                       return -1;
>
>                 if (options.display & IDLE_DISPLAY) {
>                         display_cstates_header();
> diff --git a/idlestat.h b/idlestat.h
> index 1d5f961..735f0fe 100644
> --- a/idlestat.h
> +++ b/idlestat.h
> @@ -132,6 +132,7 @@ struct program_options {
>         int display;
>         unsigned int duration;
>         char *filename;
> +       char *outfilename;
>         int verbose;
>  };
>
> --
> 1.9.1
>

_______________________________________________
linaro-dev mailing list
linaro-dev@lists.linaro.org
http://lists.linaro.org/mailman/listinfo/linaro-dev

Reply via email to