- cli: remove UB in --bwlimit scaling (range-check the double product before casting, drop atoi for the +/-1 form) and add huge/boundary unit tests - test: widen the CI throttle wall-clock band to [1.5, 4.5]s with a 2s cross-tolerance so a loaded runner cannot flake it - log: drop the unused LOG_INFO_BACKUP bit; --info=backup is accepted-but- silent like the other rsync-only categories - client_send: remove the duplicate delete_display_path forward declaration - utils: add non-allocating utils_strip_transfer_root and use it from scanner_note_nonreg and delete_display_path (was duplicated logic) - scanner: lstat() instead of stat() when re-reading an empty dir's metadata - file: drop the no-op else-if and the redundant ELOOP arm in file_ensure_directory_secure (symlinks are refused anyway) - format/stats: document literal_data as whole-file accurate (delta upper bound) instead of claiming literal bytes sent - docs: refresh stale protocol 2.26.0 labels to 2.27.0
61 lines
2.3 KiB
C
61 lines
2.3 KiB
C
#ifndef LOG_H
|
|
#define LOG_H
|
|
|
|
#include <stdio.h>
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
|
|
typedef enum { LOG_LEVEL_DEBUG, LOG_LEVEL_INFO, LOG_LEVEL_WARNING, LOG_LEVEL_ERROR } LogLevel;
|
|
typedef enum { LOG_STDERR_ERRORS, LOG_STDERR_ALL } LogStderrMode;
|
|
|
|
typedef enum {
|
|
LOG_DEBUG_IO = 1u << 0,
|
|
LOG_DEBUG_PROTO = 1u << 1,
|
|
LOG_DEBUG_PACK = 1u << 2,
|
|
LOG_DEBUG_UTIL = 1u << 3,
|
|
LOG_DEBUG_ALL = (1u << 4) - 1,
|
|
} LogDebugFlag;
|
|
|
|
typedef enum {
|
|
LOG_INFO_COPY = 1u << 0,
|
|
LOG_INFO_MISC = 1u << 1,
|
|
LOG_INFO_SKIP = 1u << 2,
|
|
LOG_INFO_STATS = 1u << 3,
|
|
/* rsync categories that map to a FastSync event (emitted in rsync's line
|
|
* format): del (deletions), remove (sender-side source removal), name
|
|
* (transferred entry names), flist (file-list header), nonreg (skipped
|
|
* non-regular files), progress (per-file progress). rsync's `backup`
|
|
* category is accepted for CLI parity but stays silent: the receiver does the
|
|
* backing-up and FastSync has no backup event to report from the sender. */
|
|
LOG_INFO_DEL = 1u << 4,
|
|
LOG_INFO_REMOVE = 1u << 5,
|
|
LOG_INFO_NAME = 1u << 6,
|
|
LOG_INFO_FLIST = 1u << 7,
|
|
LOG_INFO_NONREG = 1u << 8,
|
|
LOG_INFO_PROGRESS = 1u << 9,
|
|
LOG_INFO_ALL = LOG_INFO_COPY | LOG_INFO_MISC | LOG_INFO_SKIP | LOG_INFO_STATS | LOG_INFO_DEL |
|
|
LOG_INFO_REMOVE | LOG_INFO_NAME | LOG_INFO_FLIST | LOG_INFO_NONREG |
|
|
LOG_INFO_PROGRESS,
|
|
} LogInfoFlag;
|
|
|
|
void log_message(LogLevel log_level, const char* message, ...);
|
|
void log_perror(const char* context);
|
|
void set_log_level(LogLevel level);
|
|
void set_log_debug_flags(uint32_t flags);
|
|
uint32_t get_log_debug_flags(void);
|
|
/* True when a log_debug_message() call with the same flag would actually emit:
|
|
* the debug log level is enabled AND the flag is selected. Hot paths use this
|
|
* to skip expensive message formatting/escaping when the line is filtered. */
|
|
bool log_debug_enabled(LogDebugFlag flag);
|
|
void log_debug_message(LogDebugFlag flag, const char* message, ...);
|
|
void set_log_info_flags(uint32_t flags);
|
|
uint32_t get_log_info_flags(void);
|
|
void log_info_message(LogInfoFlag flag, const char* message, ...);
|
|
void log_set_file(FILE* fp);
|
|
void log_set_8_bit_output(bool enabled);
|
|
bool log_get_8_bit_output(void);
|
|
void log_set_stderr_mode(LogStderrMode mode);
|
|
LogStderrMode log_get_stderr_mode(void);
|
|
|
|
#endif
|