NeoMutt  2019-11-11
Teaching an old dog new tricks
DOXYGEN
mutt_logging.h File Reference

NeoMutt Logging. More...

#include <stdbool.h>
#include <stdint.h>
#include <time.h>
+ Include dependency graph for mutt_logging.h:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

int log_disp_curses (time_t stamp, const char *file, int line, const char *function, int level,...)
 Display a log line in the message line - Implements log_dispatcher_t. More...
 
void mutt_log_prep (void)
 Prepare to log. More...
 
int mutt_log_start (void)
 Enable file logging. More...
 
void mutt_log_stop (void)
 Close the log file. More...
 
int mutt_log_set_level (int level, bool verbose)
 Change the logging level. More...
 
int mutt_log_set_file (const char *file, bool verbose)
 Change the logging file. More...
 
int mutt_log_observer (struct NotifyCallback *nc)
 Listen for config changes affecting the log file - Implements observer_t() More...
 
int level_validator (const struct ConfigSet *cs, const struct ConfigDef *cdef, intptr_t value, struct Buffer *err)
 Validate the "debug_level" config variable. More...
 
void mutt_clear_error (void)
 Clear the message line (bottom line of screen) More...
 

Variables

short C_DebugLevel
 Config: Logging level for debug logs. More...
 
char * C_DebugFile
 Config: File to save debug logs. More...
 

Detailed Description

NeoMutt Logging.

Authors
  • Richard Russon

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.

Definition in file mutt_logging.h.

Function Documentation

◆ log_disp_curses()

int log_disp_curses ( time_t  stamp,
const char *  file,
int  line,
const char *  function,
int  level,
  ... 
)

Display a log line in the message line - Implements log_dispatcher_t.

Definition at line 129 of file mutt_logging.c.

131 {
132  if (level > C_DebugLevel)
133  return 0;
134 
135  char buf[1024];
136 
137  va_list ap;
138  va_start(ap, level);
139  const char *fmt = va_arg(ap, const char *);
140  int ret = vsnprintf(buf, sizeof(buf), fmt, ap);
141  va_end(ap);
142 
143  if (level == LL_PERROR)
144  {
145  char *buf2 = buf + ret;
146  int len = sizeof(buf) - ret;
147  char *p = strerror(errno);
148  if (!p)
149  p = _("unknown error");
150 
151  ret += snprintf(buf2, len, ": %s (errno = %d)", p, errno);
152  }
153 
154  const bool dupe = (strcmp(buf, ErrorBuf) == 0);
155  if (!dupe)
156  {
157  /* Only log unique messages */
158  log_disp_file(stamp, file, line, function, level, "%s", buf);
159  if (stamp == 0)
160  log_disp_queue(stamp, file, line, function, level, "%s", buf);
161  }
162 
163  /* Don't display debugging message on screen */
164  if (level > LL_MESSAGE)
165  return 0;
166 
167  /* Only pause if this is a message following an error */
168  if ((level > LL_ERROR) && OptMsgErr && !dupe)
169  error_pause();
170 
173  JUSTIFY_LEFT, 0, buf, sizeof(buf), false);
174  ErrorBufMessage = true;
175 
176  if (!OptKeepQuiet)
177  {
178  switch (level)
179  {
180  case LL_ERROR:
181  mutt_beep(false);
183  break;
184  case LL_WARNING:
186  break;
187  default:
189  break;
190  }
191 
195  mutt_refresh();
196  }
197 
198  if ((level <= LL_ERROR) && !dupe)
199  {
200  OptMsgErr = true;
202  }
203  else
204  {
205  OptMsgErr = false;
206  LastError = 0;
207  }
208 
209  return ret;
210 }
Log error.
Definition: logging.h:53
size_t LastError
Time of the last error message (in milliseconds since the Unix epoch)
Definition: mutt_logging.c:48
Left justify the text.
Definition: curs_lib.h:47
Informational message.
Definition: color.h:76
void mutt_curses_set_color(enum ColorId color)
Set the current colour for text.
Definition: mutt_curses.c:49
void mutt_window_clrtoeol(struct MuttWindow *win)
Clear to the end of the line.
Definition: mutt_window.c:117
Log perror (using errno)
Definition: logging.h:52
#define _(a)
Definition: message.h:28
Log informational message.
Definition: logging.h:55
void mutt_beep(bool force)
Irritate the user.
Definition: curs_lib.c:96
int log_disp_queue(time_t stamp, const char *file, int line, const char *function, int level,...)
Save a log line to an internal queue - Implements log_dispatcher_t.
Definition: logging.c:409
Plain text.
Definition: color.h:78
void mutt_refresh(void)
Force a refresh of the screen.
Definition: curs_lib.c:105
const char * line
Definition: common.c:36
short C_DebugLevel
Config: Logging level for debug logs.
Definition: mutt_logging.c:50
size_t mutt_date_epoch_ms(void)
Return the number of milliseconds since the Unix epoch.
Definition: date.c:419
WHERE char ErrorBuf[256]
Copy of the last error message.
Definition: globals.h:47
WHERE bool ErrorBufMessage
true if the last message was an error
Definition: globals.h:46
int mutt_window_mvaddstr(struct MuttWindow *win, int row, int col, const char *str)
Move the cursor and write a fixed string to a Window.
Definition: mutt_window.c:212
Error message.
Definition: color.h:71
int log_disp_file(time_t stamp, const char *file, int line, const char *function, int level,...)
Save a log line to a file.
Definition: logging.c:255
WHERE bool OptMsgErr
(pseudo) used by mutt_error/mutt_message
Definition: options.h:39
struct MuttWindow * MuttMessageWindow
Message Window.
Definition: mutt_window.c:42
static void error_pause(void)
Wait for an error message to be read.
Definition: mutt_logging.c:62
WHERE bool OptKeepQuiet
(pseudo) shut up the message and refresh functions while we are executing an external program...
Definition: options.h:37
Warning messages.
Definition: color.h:99
void mutt_simple_format(char *buf, size_t buflen, int min_width, int max_width, enum FormatJustify justify, char pad_char, const char *s, size_t n, bool arboreal)
Format a string, like snprintf()
Definition: curs_lib.c:1021
Log warning.
Definition: logging.h:54
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_log_prep()

void mutt_log_prep ( void  )

Prepare to log.

Definition at line 215 of file mutt_logging.c.

216 {
217  char ver[64];
218  snprintf(ver, sizeof(ver), "-%s%s", PACKAGE_VERSION, GitVer);
220 }
void log_file_set_version(const char *version)
Set the program&#39;s version number.
Definition: logging.c:221
const char * GitVer
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_log_start()

int mutt_log_start ( void  )

Enable file logging.

Return values
0Success, or already running
-1Failed to start

This also handles file rotation.

Definition at line 284 of file mutt_logging.c.

285 {
286  if (C_DebugLevel < 1)
287  return 0;
288 
289  if (log_file_running())
290  return 0;
291 
293 
294  /* This will trigger the file creation */
295  if (log_file_set_level(C_DebugLevel, true) < 0)
296  return -1;
297 
298  return 0;
299 }
int mutt_log_set_file(const char *file, bool verbose)
Change the logging file.
Definition: mutt_logging.c:240
short C_DebugLevel
Config: Logging level for debug logs.
Definition: mutt_logging.c:50
bool log_file_running(void)
Is the log file running?
Definition: logging.c:230
char * C_DebugFile
Config: File to save debug logs.
Definition: mutt_logging.c:51
int log_file_set_level(int level, bool verbose)
Set the logging level.
Definition: logging.c:175
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_log_stop()

void mutt_log_stop ( void  )

Close the log file.

Definition at line 225 of file mutt_logging.c.

226 {
227  log_file_close(false);
228  FREE(&CurrentFile);
229 }
void log_file_close(bool verbose)
Close the log file.
Definition: logging.c:98
char * CurrentFile
The previous log file name.
Definition: mutt_logging.c:52
#define FREE(x)
Definition: memory.h:40
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_log_set_level()

int mutt_log_set_level ( int  level,
bool  verbose 
)

Change the logging level.

Parameters
levelLogging level
verboseIf true, then log the event
Return values
0Success
-1Error, level is out of range

Definition at line 265 of file mutt_logging.c.

266 {
267  if (!CurrentFile)
269 
270  if (log_file_set_level(level, verbose) != 0)
271  return -1;
272 
273  cs_str_native_set(Config, "debug_level", level, NULL);
274  return 0;
275 }
int mutt_log_set_file(const char *file, bool verbose)
Change the logging file.
Definition: mutt_logging.c:240
char * CurrentFile
The previous log file name.
Definition: mutt_logging.c:52
WHERE struct ConfigSet * Config
Wrapper around the user&#39;s config settings.
Definition: globals.h:41
char * C_DebugFile
Config: File to save debug logs.
Definition: mutt_logging.c:51
int log_file_set_level(int level, bool verbose)
Set the logging level.
Definition: logging.c:175
int cs_str_native_set(const struct ConfigSet *cs, const char *name, intptr_t value, struct Buffer *err)
Natively set the value of a string config item.
Definition: set.c:772
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_log_set_file()

int mutt_log_set_file ( const char *  file,
bool  verbose 
)

Change the logging file.

Parameters
fileName to use
verboseIf true, then log the event
Return values
0Success, file opened
-1Error, see errno

Close the old log, rotate the new logs and open the new log.

Definition at line 240 of file mutt_logging.c.

241 {
243  {
244  const char *name = rotate_logs(C_DebugFile, NumOfLogs);
245  if (!name)
246  return -1;
247 
248  log_file_set_filename(name, false);
249  FREE(&name);
251  }
252 
253  cs_str_string_set(Config, "debug_file", file, NULL);
254 
255  return 0;
256 }
const int NumOfLogs
How many log files to rotate.
Definition: mutt_logging.c:53
int cs_str_string_set(const struct ConfigSet *cs, const char *name, const char *value, struct Buffer *err)
Set a config item by string.
Definition: set.c:627
char * CurrentFile
The previous log file name.
Definition: mutt_logging.c:52
WHERE struct ConfigSet * Config
Wrapper around the user&#39;s config settings.
Definition: globals.h:41
int log_file_set_filename(const char *file, bool verbose)
Set the filename for the log.
Definition: logging.c:149
const char * name
Definition: pgpmicalg.c:45
void mutt_str_replace(char **p, const char *s)
Replace one string with another.
Definition: string.c:453
char * C_DebugFile
Config: File to save debug logs.
Definition: mutt_logging.c:51
#define FREE(x)
Definition: memory.h:40
static const char * rotate_logs(const char *file, int count)
Rotate a set of numbered files.
Definition: mutt_logging.c:86
int mutt_str_strcmp(const char *a, const char *b)
Compare two strings, safely.
Definition: string.c:615
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_log_observer()

int mutt_log_observer ( struct NotifyCallback nc)

Listen for config changes affecting the log file - Implements observer_t()

Definition at line 325 of file mutt_logging.c.

326 {
327  if (!nc)
328  return -1;
329 
330  struct EventConfig *ec = (struct EventConfig *) nc->event;
331 
332  if (mutt_str_strcmp(ec->name, "debug_file") == 0)
334  else if (mutt_str_strcmp(ec->name, "debug_level") == 0)
336 
337  return 0;
338 }
int mutt_log_set_file(const char *file, bool verbose)
Change the logging file.
Definition: mutt_logging.c:240
A config-change event.
Definition: set.h:199
intptr_t event
Send: event data.
Definition: observer.h:46
short C_DebugLevel
Config: Logging level for debug logs.
Definition: mutt_logging.c:50
char * C_DebugFile
Config: File to save debug logs.
Definition: mutt_logging.c:51
int mutt_log_set_level(int level, bool verbose)
Change the logging level.
Definition: mutt_logging.c:265
const char * name
Name of config item that changed.
Definition: set.h:203
int mutt_str_strcmp(const char *a, const char *b)
Compare two strings, safely.
Definition: string.c:615
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ level_validator()

int level_validator ( const struct ConfigSet cs,
const struct ConfigDef cdef,
intptr_t  value,
struct Buffer err 
)

Validate the "debug_level" config variable.

Parameters
csConfig items
cdefConfig definition
valueNative value
errMessage for the user
Return values
CSR_SUCCESSSuccess
CSR_ERR_INVALIDFailure

Definition at line 310 of file mutt_logging.c.

312 {
313  if ((value < 0) || (value >= LL_MAX))
314  {
315  mutt_buffer_printf(err, _("Invalid value for option %s: %ld"), cdef->name, value);
316  return CSR_ERR_INVALID;
317  }
318 
319  return CSR_SUCCESS;
320 }
#define _(a)
Definition: message.h:28
Definition: logging.h:63
int mutt_buffer_printf(struct Buffer *buf, const char *fmt,...)
Format a string overwriting a Buffer.
Definition: buffer.c:160
const char * name
User-visible name.
Definition: set.h:155
#define CSR_SUCCESS
Action completed successfully.
Definition: set.h:46
#define CSR_ERR_INVALID
Value hasn&#39;t been set.
Definition: set.h:49
+ Here is the call graph for this function:

◆ mutt_clear_error()

void mutt_clear_error ( void  )

Clear the message line (bottom line of screen)

Definition at line 115 of file mutt_logging.c.

116 {
117  /* Make sure the error message has had time to be read */
118  if (OptMsgErr)
119  error_pause();
120 
121  ErrorBufMessage = false;
122  if (!OptNoCurses)
124 }
WHERE bool OptNoCurses
(pseudo) when sending in batch mode
Definition: options.h:46
void mutt_window_clearline(struct MuttWindow *win, int row)
Clear a row of a Window.
Definition: mutt_window.c:95
WHERE bool ErrorBufMessage
true if the last message was an error
Definition: globals.h:46
WHERE bool OptMsgErr
(pseudo) used by mutt_error/mutt_message
Definition: options.h:39
struct MuttWindow * MuttMessageWindow
Message Window.
Definition: mutt_window.c:42
static void error_pause(void)
Wait for an error message to be read.
Definition: mutt_logging.c:62
+ Here is the call graph for this function:

Variable Documentation

◆ C_DebugLevel

short C_DebugLevel

Config: Logging level for debug logs.

Definition at line 50 of file mutt_logging.c.

◆ C_DebugFile

char* C_DebugFile

Config: File to save debug logs.

Definition at line 51 of file mutt_logging.c.