blob: 629db676d4f5dd328998e68281ca0a39b239d9b2 [file] [log] [blame]
Sean Nelson74aa7722010-01-07 20:21:58 +00001/*
2 * This file is part of the flashrom project.
3 *
4 * Copyright (C) 2009 Sean Nelson <audiohacked@gmail.com>
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +00005 * Copyright (C) 2011 Carl-Daniel Hailfinger
Sean Nelson74aa7722010-01-07 20:21:58 +00006 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
Sean Nelson74aa7722010-01-07 20:21:58 +000016 */
17
18#include <stdio.h>
19#include <stdarg.h>
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +000020#include <string.h>
21#include <errno.h>
Sean Nelson74aa7722010-01-07 20:21:58 +000022#include "flash.h"
23
Nico Huberd152fb92017-06-19 12:57:10 +020024enum flashrom_log_level verbose_screen = FLASHROM_MSG_INFO;
25enum flashrom_log_level verbose_logfile = FLASHROM_MSG_DEBUG2;
Stefan Tauner9b32de92014-08-08 23:52:33 +000026
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +000027static FILE *logfile = NULL;
28
29int close_logfile(void)
30{
31 if (!logfile)
32 return 0;
33 /* No need to call fflush() explicitly, fclose() already does that. */
34 if (fclose(logfile)) {
35 /* fclose returned an error. Stop writing to be safe. */
36 logfile = NULL;
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000037 msg_gerr("Closing the log file returned error %s\n", strerror(errno));
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +000038 return 1;
39 }
40 logfile = NULL;
41 return 0;
42}
43
44int open_logfile(const char * const filename)
45{
46 if (!filename) {
Stefan Tauner0554ca52013-07-25 22:54:25 +000047 msg_gerr("No logfile name specified.\n");
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +000048 return 1;
49 }
50 if ((logfile = fopen(filename, "w")) == NULL) {
Stefan Tauner363fd7e2013-04-07 13:08:30 +000051 msg_gerr("Error: opening log file \"%s\" failed: %s\n", filename, strerror(errno));
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +000052 return 1;
53 }
54 return 0;
55}
56
57void start_logging(void)
58{
Nico Huberd152fb92017-06-19 12:57:10 +020059 enum flashrom_log_level oldverbose_screen = verbose_screen;
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +000060
61 /* Shut up the console. */
Nico Huberd152fb92017-06-19 12:57:10 +020062 verbose_screen = FLASHROM_MSG_ERROR;
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +000063 print_version();
64 verbose_screen = oldverbose_screen;
65}
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +000066
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +000067/* Please note that level is the verbosity, not the importance of the message. */
Nico Huberd152fb92017-06-19 12:57:10 +020068int flashrom_print_cb(enum flashrom_log_level level, const char *fmt, va_list ap)
Sean Nelson74aa7722010-01-07 20:21:58 +000069{
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +000070 int ret = 0;
71 FILE *output_type = stdout;
Uwe Hermann43959702010-03-13 17:28:29 +000072
Nico Huber18781102012-12-10 13:34:12 +000073 va_list logfile_args;
74 va_copy(logfile_args, ap);
75
Nico Huberd152fb92017-06-19 12:57:10 +020076 if (level < FLASHROM_MSG_INFO)
Sean Nelson74aa7722010-01-07 20:21:58 +000077 output_type = stderr;
Uwe Hermann43959702010-03-13 17:28:29 +000078
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +000079 if (level <= verbose_screen) {
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +000080 ret = vfprintf(output_type, fmt, ap);
Stefan Taunerc6fa32d2013-01-04 22:54:07 +000081 /* msg_*spew often happens inside chip accessors in possibly
82 * time-critical operations. Don't slow them down by flushing. */
Nico Huberd152fb92017-06-19 12:57:10 +020083 if (level != FLASHROM_MSG_SPEW)
Carl-Daniel Hailfinger901a3ba2012-05-14 22:54:58 +000084 fflush(output_type);
85 }
Thomas Heijligene2767652022-04-07 17:48:53 +020086
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +000087 if ((level <= verbose_logfile) && logfile) {
Nico Huber18781102012-12-10 13:34:12 +000088 ret = vfprintf(logfile, fmt, logfile_args);
Nico Huberd152fb92017-06-19 12:57:10 +020089 if (level != FLASHROM_MSG_SPEW)
Carl-Daniel Hailfinger1c155482012-06-06 09:17:06 +000090 fflush(logfile);
91 }
Thomas Heijligene2767652022-04-07 17:48:53 +020092
Nico Huber18781102012-12-10 13:34:12 +000093 va_end(logfile_args);
Sean Nelson74aa7722010-01-07 20:21:58 +000094 return ret;
95}