NeoMutt  2024-10-02-37-gfa9146
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
mutt_logging.c File Reference

NeoMutt Logging. More...

#include "config.h"
#include <errno.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "mutt/lib.h"
#include "config/lib.h"
#include "core/lib.h"
#include "gui/lib.h"
#include "mutt_logging.h"
#include "color/lib.h"
#include "globals.h"
#include "muttlib.h"
+ Include dependency graph for mutt_logging.c:

Go to the source code of this file.

Macros

#define S_TO_MS   1000L
 

Functions

static void error_pause (void)
 Wait for an error message to be read.
 
void mutt_clear_error (void)
 Clear the message line (bottom line of screen)
 
int log_disp_curses (time_t stamp, const char *file, int line, const char *function, enum LogLevel level, const char *format,...)
 Display a log line in the message line - Implements log_dispatcher_t -.
 
void mutt_log_prep (void)
 Prepare to log.
 
void mutt_log_stop (void)
 Close the log file.
 
int mutt_log_set_file (const char *file)
 Change the logging file.
 
int mutt_log_set_level (enum LogLevel level, bool verbose)
 Change the logging level.
 
int mutt_log_start (void)
 Enable file logging.
 
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() -.
 
int main_log_observer (struct NotifyCallback *nc)
 Notification that a Config Variable has changed - Implements observer_t -.
 

Variables

static uint64_t LastError = 0
 Time of the last error message (in milliseconds since the Unix epoch)
 
static char * CurrentFile = NULL
 The previous log file name.
 
static const int NumOfLogs = 5
 How many log files to rotate.
 

Detailed Description

NeoMutt Logging.

Authors
  • Richard Russon
  • Pietro Cerutti

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.c.

Macro Definition Documentation

◆ S_TO_MS

#define S_TO_MS   1000L

Definition at line 52 of file mutt_logging.c.

Function Documentation

◆ error_pause()

static void error_pause ( void  )
static

Wait for an error message to be read.

If '$sleep_time' seconds hasn't elapsed since LastError, then wait

Definition at line 59 of file mutt_logging.c.

60{
61 const short c_sleep_time = cs_subset_number(NeoMutt->sub, "sleep_time");
62 const uint64_t elapsed = mutt_date_now_ms() - LastError;
63 const uint64_t sleep = c_sleep_time * S_TO_MS;
64 if ((LastError == 0) || (elapsed >= sleep))
65 return;
66
68 mutt_date_sleep_ms(sleep - elapsed);
69}
short cs_subset_number(const struct ConfigSubset *sub, const char *name)
Get a number config item by name.
Definition: helpers.c:143
void mutt_refresh(void)
Force a refresh of the screen.
Definition: curs_lib.c:78
uint64_t mutt_date_now_ms(void)
Return the number of milliseconds since the Unix epoch.
Definition: date.c:465
void mutt_date_sleep_ms(size_t ms)
Sleep for milliseconds.
Definition: date.c:983
static uint64_t LastError
Time of the last error message (in milliseconds since the Unix epoch)
Definition: mutt_logging.c:47
#define S_TO_MS
Definition: mutt_logging.c:52
Container for Accounts, Notifications.
Definition: neomutt.h:42
struct ConfigSubset * sub
Inherited config items.
Definition: neomutt.h:46
+ 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)
79
80 ErrorBufMessage = false;
81 if (!OptNoCurses)
83}
bool OptNoCurses
(pseudo) when sending in batch mode
Definition: globals.c:69
bool OptMsgErr
(pseudo) used by mutt_error/mutt_message
Definition: globals.c:64
bool ErrorBufMessage
true if the last message was an error
Definition: globals.c:34
void msgwin_clear_text(struct MuttWindow *win)
Clear the text in the Message Window.
Definition: msgwin.c:519
static void error_pause(void)
Wait for an error message to be read.
Definition: mutt_logging.c:59
+ Here is the call graph for this function:

◆ mutt_log_prep()

void mutt_log_prep ( void  )

Prepare to log.

Definition at line 171 of file mutt_logging.c.

172{
173 char ver[64] = { 0 };
174 snprintf(ver, sizeof(ver), "-%s%s", PACKAGE_VERSION, GitVer);
176}
const char * GitVer
void log_file_set_version(const char *version)
Set the program's version number.
Definition: logging.c:221
+ 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 181 of file mutt_logging.c.

182{
183 log_file_close(false);
185}
#define FREE(x)
Definition: memory.h:45
void log_file_close(bool verbose)
Close the log file.
Definition: logging.c:99
static 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_file()

int mutt_log_set_file ( const char *  file)

Change the logging file.

Parameters
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 195 of file mutt_logging.c.

196{
197 const char *const c_debug_file = cs_subset_path(NeoMutt->sub, "debug_file");
198 if (!mutt_str_equal(CurrentFile, c_debug_file))
199 {
200 struct Buffer *expanded = buf_pool_get();
201 buf_addstr(expanded, c_debug_file);
202 buf_expand_path(expanded);
203
204 const char *name = mutt_file_rotate(buf_string(expanded), NumOfLogs);
205 buf_pool_release(&expanded);
206 if (!name)
207 return -1;
208
209 log_file_set_filename(name, false);
210 FREE(&name);
211 mutt_str_replace(&CurrentFile, c_debug_file);
212 }
213
214 cs_subset_str_string_set(NeoMutt->sub, "debug_file", file, NULL);
215
216 return 0;
217}
size_t buf_addstr(struct Buffer *buf, const char *s)
Add a string to a Buffer.
Definition: buffer.c:226
static const char * buf_string(const struct Buffer *buf)
Convert a buffer to a const char * "string".
Definition: buffer.h:96
const char * cs_subset_path(const struct ConfigSubset *sub, const char *name)
Get a path config item by name.
Definition: helpers.c:168
const char * mutt_file_rotate(const char *path, int count)
Rotate a set of numbered files.
Definition: file.c:546
int log_file_set_filename(const char *file, bool verbose)
Set the filename for the log.
Definition: logging.c:150
bool mutt_str_equal(const char *a, const char *b)
Compare two strings.
Definition: string.c:660
char * mutt_str_replace(char **p, const char *s)
Replace one string with another.
Definition: string.c:280
static const int NumOfLogs
How many log files to rotate.
Definition: mutt_logging.c:50
void buf_expand_path(struct Buffer *buf)
Create the canonical path.
Definition: muttlib.c:315
struct Buffer * buf_pool_get(void)
Get a Buffer from the pool.
Definition: pool.c:81
void buf_pool_release(struct Buffer **ptr)
Return a Buffer to the pool.
Definition: pool.c:94
String manipulation buffer.
Definition: buffer.h:36
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:386
+ 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.

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

Definition at line 226 of file mutt_logging.c.

227{
228 if (!CurrentFile)
229 {
230 const char *const c_debug_file = cs_subset_path(NeoMutt->sub, "debug_file");
231 mutt_log_set_file(c_debug_file);
232 }
233
234 if (log_file_set_level(level, verbose) != 0)
235 return -1;
236
237 cs_subset_str_native_set(NeoMutt->sub, "debug_level", level, NULL);
238 return 0;
239}
int log_file_set_level(enum LogLevel level, bool verbose)
Set the logging level.
Definition: logging.c:176
int mutt_log_set_file(const char *file)
Change the logging file.
Definition: mutt_logging.c:195
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:297
+ 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 248 of file mutt_logging.c.

249{
250 const short c_debug_level = cs_subset_number(NeoMutt->sub, "debug_level");
251 if (c_debug_level < 1)
252 return 0;
253
254 if (log_file_running())
255 return 0;
256
257 const char *const c_debug_file = cs_subset_path(NeoMutt->sub, "debug_file");
258 mutt_log_set_file(c_debug_file);
259
260 /* This will trigger the file creation */
261 if (log_file_set_level(c_debug_level, true) < 0)
262 return -1;
263
264 return 0;
265}
bool log_file_running(void)
Is the log file running?
Definition: logging.c:230
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Variable Documentation

◆ LastError

uint64_t LastError = 0
static

Time of the last error message (in milliseconds since the Unix epoch)

Definition at line 47 of file mutt_logging.c.

◆ CurrentFile

char* CurrentFile = NULL
static

The previous log file name.

Definition at line 49 of file mutt_logging.c.

◆ NumOfLogs

const int NumOfLogs = 5
static

How many log files to rotate.

Definition at line 50 of file mutt_logging.c.