[flashrom] [PATCH] Add logfile support to flashrom
Carl-Daniel Hailfinger
c-d.hailfinger.devel.2006 at gmx.net
Thu Jun 9 22:32:30 CEST 2011
Add log file support to flashrom.
The log file will always contain all verbose messages even if the user
doesn't specify -V. If the user specifies -VV, SPEW messages will be
logged as well.
Proof of concept, comments welcome.
Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006 at gmx.net>
Index: flashrom-logfile/flash.h
===================================================================
--- flashrom-logfile/flash.h (Revision 1326)
+++ flashrom-logfile/flash.h (Arbeitskopie)
@@ -229,6 +229,8 @@
#define ERROR_NONFATAL 0x100
/* cli_output.c */
+int open_logfile(char *filename);
+int msg_log(const char *fmt, ...);
/* Let gcc and clang check for correct printf-style format strings. */
int print(int type, const char *fmt, ...) __attribute__((format(printf, 2, 3)));
#define MSG_ERROR 0
Index: flashrom-logfile/cli_output.c
===================================================================
--- flashrom-logfile/cli_output.c (Revision 1326)
+++ flashrom-logfile/cli_output.c (Arbeitskopie)
@@ -2,6 +2,7 @@
* This file is part of the flashrom project.
*
* Copyright (C) 2009 Sean Nelson <audiohacked at gmail.com>
+ * Copyright (C) 2011 Carl-Daniel Hailfinger
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -22,30 +23,70 @@
#include <stdarg.h>
#include "flash.h"
-int print(int type, const char *fmt, ...)
+static FILE *logfile = NULL;
+
+int open_logfile(char *filename)
{
+ if (!filename) {
+ msg_gerr("No filename specified.\n");
+ return 1;
+ }
+ if ((logfile = fopen(filename, "w")) == NULL) {
+ perror(filename);
+ return 1;
+ }
+ return 0;
+}
+
+int msg_log(const char *fmt, ...)
+{
va_list ap;
int ret;
- FILE *output_type;
+ if (!logfile)
+ return -1;
+ va_start(ap, fmt);
+ ret = vfprintf(logfile, fmt, ap);
+ va_end(ap);
+ return ret;
+}
+
+int print(int type, const char *fmt, ...)
+{
+ va_list ap;
+ int ret = 0;
+ int want_screen = 1;
+ int want_file = 1;
+ FILE *output_type = stdout;
+
switch (type) {
case MSG_ERROR:
output_type = stderr;
break;
case MSG_BARF:
- if (verbose < 2)
- return 0;
+ if (verbose < 2) {
+ want_screen = 0;
+ want_file = 0;
+ }
+ break;
case MSG_DEBUG:
if (verbose < 1)
- return 0;
+ want_screen = 0;
+ break;
case MSG_INFO:
default:
- output_type = stdout;
break;
}
- va_start(ap, fmt);
- ret = vfprintf(output_type, fmt, ap);
- va_end(ap);
+ if (want_screen) {
+ va_start(ap, fmt);
+ ret = vfprintf(output_type, fmt, ap);
+ va_end(ap);
+ }
+ if (want_file && logfile) {
+ va_start(ap, fmt);
+ ret = vfprintf(logfile, fmt, ap);
+ va_end(ap);
+ }
return ret;
}
Index: flashrom-logfile/cli_classic.c
===================================================================
--- flashrom-logfile/cli_classic.c (Revision 1326)
+++ flashrom-logfile/cli_classic.c (Arbeitskopie)
@@ -38,7 +38,8 @@
"-z|"
#endif
"-E|-r <file>|-w <file>|-v <file>]\n"
- " [-c <chipname>] [-m [<vendor>:]<part>] [-l <file>]\n"
+ " [-c <chipname>] [-m [<vendor>:]<part>] [-l <file>] "
+ "[-o <file>]\n"
" [-i <image>] [-p <programmername>[:<parameters>]]\n\n");
printf("Please note that the command line interface for flashrom has "
@@ -72,6 +73,7 @@
"<file>\n"
" -i | --image <name> only flash image <name> "
"from flash layout\n"
+ " -o | --output <name> log to file <name>\n"
" -L | --list-supported print supported devices\n"
#if CONFIG_PRINT_WIKI == 1
" -z | --list-supported-wiki print supported devices "
@@ -118,7 +120,7 @@
int operation_specified = 0;
int i;
- static const char optstring[] = "r:Rw:v:nVEfc:m:l:i:p:Lzh";
+ static const char optstring[] = "r:Rw:v:nVEfc:m:l:i:p:Lzho:";
static const struct option long_options[] = {
{"read", 1, NULL, 'r'},
{"write", 1, NULL, 'w'},
@@ -136,6 +138,7 @@
{"programmer", 1, NULL, 'p'},
{"help", 0, NULL, 'h'},
{"version", 0, NULL, 'R'},
+ {"output", 1, NULL, 'o'},
{NULL, 0, NULL, 0}
};
@@ -307,14 +310,17 @@
cli_classic_usage(argv[0]);
exit(0);
break;
+ case 'o':
+ tempstr = strdup(optarg);
+ if (open_logfile(tempstr))
+ cli_classic_abort_usage();
+ break;
default:
cli_classic_abort_usage();
break;
}
}
- /* FIXME: Print the actions flashrom will take. */
-
if (list_supported) {
print_supported();
exit(0);
@@ -355,6 +361,10 @@
flash = NULL;
}
+ /* FIXME: Print the actions flashrom will take. */
+ /* For the log. FIXME: Print this only to the log file. */
+ print_version();
+
/* FIXME: Delay calibration should happen in programmer code. */
myusec_calibrate_delay();
--
http://www.hailfinger.org/
More information about the flashrom
mailing list