1*0d6140beSAndroid Build Coastguard Worker /*
2*0d6140beSAndroid Build Coastguard Worker * This file is part of the flashrom project.
3*0d6140beSAndroid Build Coastguard Worker *
4*0d6140beSAndroid Build Coastguard Worker * Copyright (C) 2009 Sean Nelson <[email protected]>
5*0d6140beSAndroid Build Coastguard Worker * Copyright (C) 2011 Carl-Daniel Hailfinger
6*0d6140beSAndroid Build Coastguard Worker *
7*0d6140beSAndroid Build Coastguard Worker * This program is free software; you can redistribute it and/or modify
8*0d6140beSAndroid Build Coastguard Worker * it under the terms of the GNU General Public License as published by
9*0d6140beSAndroid Build Coastguard Worker * the Free Software Foundation; either version 2 of the License, or
10*0d6140beSAndroid Build Coastguard Worker * (at your option) any later version.
11*0d6140beSAndroid Build Coastguard Worker *
12*0d6140beSAndroid Build Coastguard Worker * This program is distributed in the hope that it will be useful,
13*0d6140beSAndroid Build Coastguard Worker * but WITHOUT ANY WARRANTY; without even the implied warranty of
14*0d6140beSAndroid Build Coastguard Worker * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15*0d6140beSAndroid Build Coastguard Worker * GNU General Public License for more details.
16*0d6140beSAndroid Build Coastguard Worker */
17*0d6140beSAndroid Build Coastguard Worker
18*0d6140beSAndroid Build Coastguard Worker #include <stdio.h>
19*0d6140beSAndroid Build Coastguard Worker #include <stdarg.h>
20*0d6140beSAndroid Build Coastguard Worker #include <string.h>
21*0d6140beSAndroid Build Coastguard Worker #include <errno.h>
22*0d6140beSAndroid Build Coastguard Worker #include "flash.h"
23*0d6140beSAndroid Build Coastguard Worker
24*0d6140beSAndroid Build Coastguard Worker enum flashrom_log_level verbose_screen = FLASHROM_MSG_INFO;
25*0d6140beSAndroid Build Coastguard Worker enum flashrom_log_level verbose_logfile = FLASHROM_MSG_DEBUG2;
26*0d6140beSAndroid Build Coastguard Worker
27*0d6140beSAndroid Build Coastguard Worker static FILE *logfile = NULL;
28*0d6140beSAndroid Build Coastguard Worker
close_logfile(void)29*0d6140beSAndroid Build Coastguard Worker int close_logfile(void)
30*0d6140beSAndroid Build Coastguard Worker {
31*0d6140beSAndroid Build Coastguard Worker if (!logfile)
32*0d6140beSAndroid Build Coastguard Worker return 0;
33*0d6140beSAndroid Build Coastguard Worker /* No need to call fflush() explicitly, fclose() already does that. */
34*0d6140beSAndroid Build Coastguard Worker if (fclose(logfile)) {
35*0d6140beSAndroid Build Coastguard Worker /* fclose returned an error. Stop writing to be safe. */
36*0d6140beSAndroid Build Coastguard Worker logfile = NULL;
37*0d6140beSAndroid Build Coastguard Worker msg_gerr("Closing the log file returned error %s\n", strerror(errno));
38*0d6140beSAndroid Build Coastguard Worker return 1;
39*0d6140beSAndroid Build Coastguard Worker }
40*0d6140beSAndroid Build Coastguard Worker logfile = NULL;
41*0d6140beSAndroid Build Coastguard Worker return 0;
42*0d6140beSAndroid Build Coastguard Worker }
43*0d6140beSAndroid Build Coastguard Worker
open_logfile(const char * const filename)44*0d6140beSAndroid Build Coastguard Worker int open_logfile(const char * const filename)
45*0d6140beSAndroid Build Coastguard Worker {
46*0d6140beSAndroid Build Coastguard Worker if (!filename) {
47*0d6140beSAndroid Build Coastguard Worker msg_gerr("No logfile name specified.\n");
48*0d6140beSAndroid Build Coastguard Worker return 1;
49*0d6140beSAndroid Build Coastguard Worker }
50*0d6140beSAndroid Build Coastguard Worker if ((logfile = fopen(filename, "w")) == NULL) {
51*0d6140beSAndroid Build Coastguard Worker msg_gerr("Error: opening log file \"%s\" failed: %s\n", filename, strerror(errno));
52*0d6140beSAndroid Build Coastguard Worker return 1;
53*0d6140beSAndroid Build Coastguard Worker }
54*0d6140beSAndroid Build Coastguard Worker return 0;
55*0d6140beSAndroid Build Coastguard Worker }
56*0d6140beSAndroid Build Coastguard Worker
start_logging(void)57*0d6140beSAndroid Build Coastguard Worker void start_logging(void)
58*0d6140beSAndroid Build Coastguard Worker {
59*0d6140beSAndroid Build Coastguard Worker enum flashrom_log_level oldverbose_screen = verbose_screen;
60*0d6140beSAndroid Build Coastguard Worker
61*0d6140beSAndroid Build Coastguard Worker /* Shut up the console. */
62*0d6140beSAndroid Build Coastguard Worker verbose_screen = FLASHROM_MSG_ERROR;
63*0d6140beSAndroid Build Coastguard Worker print_version();
64*0d6140beSAndroid Build Coastguard Worker verbose_screen = oldverbose_screen;
65*0d6140beSAndroid Build Coastguard Worker }
66*0d6140beSAndroid Build Coastguard Worker
flashrom_progress_stage_to_string(enum flashrom_progress_stage stage)67*0d6140beSAndroid Build Coastguard Worker static const char *flashrom_progress_stage_to_string(enum flashrom_progress_stage stage)
68*0d6140beSAndroid Build Coastguard Worker {
69*0d6140beSAndroid Build Coastguard Worker if (stage == FLASHROM_PROGRESS_READ)
70*0d6140beSAndroid Build Coastguard Worker return "READ";
71*0d6140beSAndroid Build Coastguard Worker if (stage == FLASHROM_PROGRESS_WRITE)
72*0d6140beSAndroid Build Coastguard Worker return "WRITE";
73*0d6140beSAndroid Build Coastguard Worker if (stage == FLASHROM_PROGRESS_ERASE)
74*0d6140beSAndroid Build Coastguard Worker return "ERASE";
75*0d6140beSAndroid Build Coastguard Worker return "UNKNOWN";
76*0d6140beSAndroid Build Coastguard Worker }
77*0d6140beSAndroid Build Coastguard Worker
flashrom_progress_cb(struct flashrom_flashctx * flashctx)78*0d6140beSAndroid Build Coastguard Worker void flashrom_progress_cb(struct flashrom_flashctx *flashctx)
79*0d6140beSAndroid Build Coastguard Worker {
80*0d6140beSAndroid Build Coastguard Worker struct flashrom_progress *progress_state = flashctx->progress_state;
81*0d6140beSAndroid Build Coastguard Worker unsigned int pc = 0;
82*0d6140beSAndroid Build Coastguard Worker unsigned int *percentages = progress_state->user_data;
83*0d6140beSAndroid Build Coastguard Worker if (progress_state->current > 0 && progress_state->total > 0)
84*0d6140beSAndroid Build Coastguard Worker pc = ((unsigned long long) progress_state->current * 10000llu) /
85*0d6140beSAndroid Build Coastguard Worker ((unsigned long long) progress_state->total * 100llu);
86*0d6140beSAndroid Build Coastguard Worker if (percentages[progress_state->stage] != pc) {
87*0d6140beSAndroid Build Coastguard Worker percentages[progress_state->stage] = pc;
88*0d6140beSAndroid Build Coastguard Worker msg_ginfo("[%s] %u%% complete... ", flashrom_progress_stage_to_string(progress_state->stage), pc);
89*0d6140beSAndroid Build Coastguard Worker }
90*0d6140beSAndroid Build Coastguard Worker }
91*0d6140beSAndroid Build Coastguard Worker
92*0d6140beSAndroid Build Coastguard Worker /* Please note that level is the verbosity, not the importance of the message. */
flashrom_print_cb(enum flashrom_log_level level,const char * fmt,va_list ap)93*0d6140beSAndroid Build Coastguard Worker int flashrom_print_cb(enum flashrom_log_level level, const char *fmt, va_list ap)
94*0d6140beSAndroid Build Coastguard Worker {
95*0d6140beSAndroid Build Coastguard Worker int ret = 0;
96*0d6140beSAndroid Build Coastguard Worker FILE *output_type = stdout;
97*0d6140beSAndroid Build Coastguard Worker
98*0d6140beSAndroid Build Coastguard Worker va_list logfile_args;
99*0d6140beSAndroid Build Coastguard Worker va_copy(logfile_args, ap);
100*0d6140beSAndroid Build Coastguard Worker
101*0d6140beSAndroid Build Coastguard Worker if (level < FLASHROM_MSG_INFO)
102*0d6140beSAndroid Build Coastguard Worker output_type = stderr;
103*0d6140beSAndroid Build Coastguard Worker
104*0d6140beSAndroid Build Coastguard Worker if (level <= verbose_screen) {
105*0d6140beSAndroid Build Coastguard Worker ret = vfprintf(output_type, fmt, ap);
106*0d6140beSAndroid Build Coastguard Worker /* msg_*spew often happens inside chip accessors in possibly
107*0d6140beSAndroid Build Coastguard Worker * time-critical operations. Don't slow them down by flushing. */
108*0d6140beSAndroid Build Coastguard Worker if (level != FLASHROM_MSG_SPEW)
109*0d6140beSAndroid Build Coastguard Worker fflush(output_type);
110*0d6140beSAndroid Build Coastguard Worker }
111*0d6140beSAndroid Build Coastguard Worker
112*0d6140beSAndroid Build Coastguard Worker if ((level <= verbose_logfile) && logfile) {
113*0d6140beSAndroid Build Coastguard Worker ret = vfprintf(logfile, fmt, logfile_args);
114*0d6140beSAndroid Build Coastguard Worker if (level != FLASHROM_MSG_SPEW)
115*0d6140beSAndroid Build Coastguard Worker fflush(logfile);
116*0d6140beSAndroid Build Coastguard Worker }
117*0d6140beSAndroid Build Coastguard Worker
118*0d6140beSAndroid Build Coastguard Worker va_end(logfile_args);
119*0d6140beSAndroid Build Coastguard Worker return ret;
120*0d6140beSAndroid Build Coastguard Worker }
121