NeoMutt  2022-04-29-145-g9b6a0e
Teaching an old dog new tricks
mutt_logging.h File Reference

NeoMutt Logging. More...

#include <stdbool.h>
#include <stdint.h>
#include <time.h>
#include "mutt/lib.h"
+ Include dependency graph for mutt_logging.h:

Go to the source code of this file.


int log_disp_curses (time_t stamp, const char *file, int line, const char *function, enum LogLevel 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 (enum LogLevel level, bool verbose)
 Change the logging level. More...
int mutt_log_set_file (const char *file)
 Change the logging file. More...
int main_log_observer (struct NotifyCallback *nc)
 Notification that a Config Variable has changed - 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 - Implements ConfigDef::validator() -. More...
void mutt_clear_error (void)
 Clear the message line (bottom line of screen) More...

Detailed Description

NeoMutt Logging.

  • 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

Definition in file mutt_logging.h.

Function Documentation

◆ mutt_log_prep()

void mutt_log_prep ( void  )

Prepare to log.

Definition at line 174 of file mutt_logging.c.

175 {
176  char ver[64];
177  snprintf(ver, sizeof(ver), "-%s%s", PACKAGE_VERSION, GitVer);
179 }
void log_file_set_version(const char *version)
Set the program's version number.
Definition: logging.c:220
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 251 of file mutt_logging.c.

252 {
253  const short c_debug_level = cs_subset_number(NeoMutt->sub, "debug_level");
254  if (c_debug_level < 1)
255  return 0;
257  if (log_file_running())
258  return 0;
260  const char *const c_debug_file = cs_subset_path(NeoMutt->sub, "debug_file");
261  mutt_log_set_file(c_debug_file);
263  /* This will trigger the file creation */
264  if (log_file_set_level(c_debug_level, true) < 0)
265  return -1;
267  return 0;
268 }
short cs_subset_number(const struct ConfigSubset *sub, const char *name)
Get a number config item by name.
Definition: helpers.c:169
const char * cs_subset_path(const struct ConfigSubset *sub, const char *name)
Get a path config item by name.
Definition: helpers.c:194
int log_file_set_level(enum LogLevel level, bool verbose)
Set the logging level.
Definition: logging.c:175
bool log_file_running(void)
Is the log file running?
Definition: logging.c:229
int mutt_log_set_file(const char *file)
Change the logging file.
Definition: mutt_logging.c:198
Container for Accounts, Notifications.
Definition: neomutt.h:37
struct ConfigSubset * sub
Inherited config items.
Definition: neomutt.h:39
+ 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 184 of file mutt_logging.c.

185 {
186  log_file_close(false);
187  FREE(&CurrentFile);
188 }
void log_file_close(bool verbose)
Close the log file.
Definition: logging.c:98
#define FREE(x)
Definition: memory.h:43
char * CurrentFile
The previous log file name.
Definition: mutt_logging.c:49
+ 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 ( enum LogLevel  level,
bool  verbose 

Change the logging level.

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

Definition at line 229 of file mutt_logging.c.

230 {
231  if (!CurrentFile)
232  {
233  const char *const c_debug_file = cs_subset_path(NeoMutt->sub, "debug_file");
234  mutt_log_set_file(c_debug_file);
235  }
237  if (log_file_set_level(level, verbose) != 0)
238  return -1;
240  cs_subset_str_native_set(NeoMutt->sub, "debug_level", level, NULL);
241  return 0;
242 }
int cs_subset_str_native_set(const struct ConfigSubset *sub, const char *name, intptr_t value, struct Buffer *err)
Natively set the value of a string config item.
Definition: subset.c:305
+ 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)

Change the logging file.

fileName to use
Return values
0Success, file opened
-1Error, see errno

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

Definition at line 198 of file mutt_logging.c.

199 {
200  const char *const c_debug_file = cs_subset_path(NeoMutt->sub, "debug_file");
201  if (!mutt_str_equal(CurrentFile, c_debug_file))
202  {
203  struct Buffer *expanded = mutt_buffer_pool_get();
204  mutt_buffer_addstr(expanded, c_debug_file);
205  mutt_buffer_expand_path(expanded);
207  const char *name = mutt_file_rotate(mutt_buffer_string(expanded), NumOfLogs);
208  mutt_buffer_pool_release(&expanded);
209  if (!name)
210  return -1;
212  log_file_set_filename(name, false);
213  FREE(&name);
214  mutt_str_replace(&CurrentFile, c_debug_file);
215  }
217  cs_subset_str_string_set(NeoMutt->sub, "debug_file", file, NULL);
219  return 0;
220 }
size_t mutt_buffer_addstr(struct Buffer *buf, const char *s)
Add a string to a Buffer.
Definition: buffer.c:223
static const char * mutt_buffer_string(const struct Buffer *buf)
Convert a buffer to a const char * "string".
Definition: buffer.h:77
const char * mutt_file_rotate(const char *path, int count)
Rotate a set of numbered files.
Definition: file.c:519
int log_file_set_filename(const char *file, bool verbose)
Set the filename for the log.
Definition: logging.c:149
bool mutt_str_equal(const char *a, const char *b)
Compare two strings.
Definition: string.c:784
char * mutt_str_replace(char **p, const char *s)
Replace one string with another.
Definition: string.c:326
const int NumOfLogs
How many log files to rotate.
Definition: mutt_logging.c:50
void mutt_buffer_expand_path(struct Buffer *buf)
Create the canonical path.
Definition: muttlib.c:322
void mutt_buffer_pool_release(struct Buffer **pbuf)
Free a Buffer from the pool.
Definition: pool.c:112
struct Buffer * mutt_buffer_pool_get(void)
Get a Buffer from the pool.
Definition: pool.c:101
String manipulation buffer.
Definition: buffer.h:34
int cs_subset_str_string_set(const struct ConfigSubset *sub, const char *name, const char *value, struct Buffer *err)
Set a config item by string.
Definition: subset.c:408
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_clear_error()

void mutt_clear_error ( void  )

Clear the message line (bottom line of screen)

Definition at line 74 of file mutt_logging.c.

75 {
76  /* Make sure the error message has had time to be read */
77  if (OptMsgErr)
78  error_pause();
80  ErrorBufMessage = false;
81  if (!OptNoCurses)
83 }
void msgwin_clear_text(void)
Clear the text in the Message Window.
Definition: msgwin.c:247
bool ErrorBufMessage
true if the last message was an error
Definition: mutt_globals.h:46
static void error_pause(void)
Wait for an error message to be read.
Definition: mutt_logging.c:59
bool OptNoCurses
(pseudo) when sending in batch mode
Definition: options.h:53
bool OptMsgErr
(pseudo) used by mutt_error/mutt_message
Definition: options.h:46
+ Here is the call graph for this function: