diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cf16d6e..ca82b11 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -99,7 +99,10 @@ jobs: - name: Cppcheck run: | - make cppcheck + # work around resource leak false positives on older Linux distributions + if cppcheck --version | awk '{if ($2 <= 1.86) { exit(1) } }'; then + make cppcheck + fi - name: Shellcheck run: | diff --git a/src/s3fs_logger.cpp b/src/s3fs_logger.cpp index ab77b0a..c6ca5f6 100644 --- a/src/s3fs_logger.cpp +++ b/src/s3fs_logger.cpp @@ -257,6 +257,57 @@ S3fsLog::s3fs_log_level S3fsLog::LowBumpupLogLevel() return old; } +void s3fs_low_logprn(S3fsLog::s3fs_log_level level, const char* file, const char *func, int line, const char *fmt, ...) +{ + if(S3fsLog::IsS3fsLogLevel(level)){ + va_list va; + va_start(va, fmt); + size_t len = vsnprintf(NULL, 0, fmt, va) + 1; + va_end(va); + + char *message = new char[len]; + va_start(va, fmt); + vsnprintf(message, len, fmt, va); + va_end(va); + + if(foreground || S3fsLog::IsSetLogFile()){ + S3fsLog::SeekEnd(); + fprintf(S3fsLog::GetOutputLogFile(), "%s%s%s:%s(%d): %s\n", S3fsLog::GetCurrentTime().c_str(), S3fsLog::GetLevelString(level), file, func, line, message); + S3fsLog::Flush(); + }else{ + // TODO: why does this differ from s3fs_low_logprn2? + syslog(S3fsLog::GetSyslogLevel(level), "%s%s:%s(%d): %s", instance_name.c_str(), file, func, line, message); + } + + delete[] message; + } +} + +void s3fs_low_logprn2(S3fsLog::s3fs_log_level level, int nest, const char* file, const char *func, int line, const char *fmt, ...) +{ + if(S3fsLog::IsS3fsLogLevel(level)){ + va_list va; + va_start(va, fmt); + size_t len = vsnprintf(NULL, 0, fmt, va) + 1; + va_end(va); + + char *message = new char[len]; + va_start(va, fmt); + vsnprintf(message, len, fmt, va); + va_end(va); + + if(foreground || S3fsLog::IsSetLogFile()){ + S3fsLog::SeekEnd(); + fprintf(S3fsLog::GetOutputLogFile(), "%s%s%s%s:%s(%d): %s\n", S3fsLog::GetCurrentTime().c_str(), S3fsLog::GetLevelString(level), S3fsLog::GetS3fsLogNest(nest), file, func, line, message); + S3fsLog::Flush(); + }else{ + syslog(S3fsLog::GetSyslogLevel(level), "%s%s%s", instance_name.c_str(), S3fsLog::GetS3fsLogNest(nest), message); + } + + delete[] message; + } +} + /* * Local variables: * tab-width: 4 diff --git a/src/s3fs_logger.h b/src/s3fs_logger.h index 43cdc0e..b60b937 100644 --- a/src/s3fs_logger.h +++ b/src/s3fs_logger.h @@ -21,6 +21,7 @@ #ifndef S3FS_LOGGER_H_ #define S3FS_LOGGER_H_ +#include #include #include #include @@ -141,30 +142,16 @@ class S3fsLog //------------------------------------------------------------------- // Debug macros //------------------------------------------------------------------- +void s3fs_low_logprn(S3fsLog::s3fs_log_level level, const char* file, const char *func, int line, const char *fmt, ...) __attribute__ ((format (printf, 5, 6))); #define S3FS_LOW_LOGPRN(level, fmt, ...) \ do{ \ - if(S3fsLog::IsS3fsLogLevel(level)){ \ - if(foreground || S3fsLog::IsSetLogFile()){ \ - S3fsLog::SeekEnd(); \ - fprintf(S3fsLog::GetOutputLogFile(), "%s%s%s:%s(%d): " fmt "%s\n", S3fsLog::GetCurrentTime().c_str(), S3fsLog::GetLevelString(level), __FILE__, __func__, __LINE__, __VA_ARGS__); \ - S3fsLog::Flush(); \ - }else{ \ - syslog(S3fsLog::GetSyslogLevel(level), "%s%s:%s(%d): " fmt "%s", instance_name.c_str(), __FILE__, __func__, __LINE__, __VA_ARGS__); \ - } \ - } \ + s3fs_low_logprn(level, __FILE__, __func__, __LINE__, fmt, ##__VA_ARGS__); \ }while(0) +void s3fs_low_logprn2(S3fsLog::s3fs_log_level level, int nest, const char* file, const char *func, int line, const char *fmt, ...) __attribute__ ((format (printf, 6, 7))); #define S3FS_LOW_LOGPRN2(level, nest, fmt, ...) \ do{ \ - if(S3fsLog::IsS3fsLogLevel(level)){ \ - if(foreground || S3fsLog::IsSetLogFile()){ \ - S3fsLog::SeekEnd(); \ - fprintf(S3fsLog::GetOutputLogFile(), "%s%s%s%s:%s(%d): " fmt "%s\n", S3fsLog::GetCurrentTime().c_str(), S3fsLog::GetLevelString(level), S3fsLog::GetS3fsLogNest(nest), __FILE__, __func__, __LINE__, __VA_ARGS__); \ - S3fsLog::Flush(); \ - }else{ \ - syslog(S3fsLog::GetSyslogLevel(level), "%s%s" fmt "%s", instance_name.c_str(), S3fsLog::GetS3fsLogNest(nest), __VA_ARGS__); \ - } \ - } \ + s3fs_low_logprn2(level, nest, __FILE__, __func__, __LINE__, fmt, ##__VA_ARGS__); \ }while(0) #define S3FS_LOW_CURLDBG(fmt, ...) \ @@ -229,14 +216,14 @@ class S3fsLog // small trick for VA_ARGS // #define S3FS_PRN_EXIT(fmt, ...) S3FS_LOW_LOGPRN_EXIT(fmt, ##__VA_ARGS__, "") -#define S3FS_PRN_CRIT(fmt, ...) S3FS_LOW_LOGPRN(S3fsLog::LEVEL_CRIT, fmt, ##__VA_ARGS__, "") -#define S3FS_PRN_ERR(fmt, ...) S3FS_LOW_LOGPRN(S3fsLog::LEVEL_ERR, fmt, ##__VA_ARGS__, "") -#define S3FS_PRN_WARN(fmt, ...) S3FS_LOW_LOGPRN(S3fsLog::LEVEL_WARN, fmt, ##__VA_ARGS__, "") -#define S3FS_PRN_DBG(fmt, ...) S3FS_LOW_LOGPRN(S3fsLog::LEVEL_DBG, fmt, ##__VA_ARGS__, "") -#define S3FS_PRN_INFO(fmt, ...) S3FS_LOW_LOGPRN2(S3fsLog::LEVEL_INFO, 0, fmt, ##__VA_ARGS__, "") -#define S3FS_PRN_INFO1(fmt, ...) S3FS_LOW_LOGPRN2(S3fsLog::LEVEL_INFO, 1, fmt, ##__VA_ARGS__, "") -#define S3FS_PRN_INFO2(fmt, ...) S3FS_LOW_LOGPRN2(S3fsLog::LEVEL_INFO, 2, fmt, ##__VA_ARGS__, "") -#define S3FS_PRN_INFO3(fmt, ...) S3FS_LOW_LOGPRN2(S3fsLog::LEVEL_INFO, 3, fmt, ##__VA_ARGS__, "") +#define S3FS_PRN_CRIT(fmt, ...) S3FS_LOW_LOGPRN(S3fsLog::LEVEL_CRIT, fmt, ##__VA_ARGS__) +#define S3FS_PRN_ERR(fmt, ...) S3FS_LOW_LOGPRN(S3fsLog::LEVEL_ERR, fmt, ##__VA_ARGS__) +#define S3FS_PRN_WARN(fmt, ...) S3FS_LOW_LOGPRN(S3fsLog::LEVEL_WARN, fmt, ##__VA_ARGS__) +#define S3FS_PRN_DBG(fmt, ...) S3FS_LOW_LOGPRN(S3fsLog::LEVEL_DBG, fmt, ##__VA_ARGS__) +#define S3FS_PRN_INFO(fmt, ...) S3FS_LOW_LOGPRN2(S3fsLog::LEVEL_INFO, 0, fmt, ##__VA_ARGS__) +#define S3FS_PRN_INFO1(fmt, ...) S3FS_LOW_LOGPRN2(S3fsLog::LEVEL_INFO, 1, fmt, ##__VA_ARGS__) +#define S3FS_PRN_INFO2(fmt, ...) S3FS_LOW_LOGPRN2(S3fsLog::LEVEL_INFO, 2, fmt, ##__VA_ARGS__) +#define S3FS_PRN_INFO3(fmt, ...) S3FS_LOW_LOGPRN2(S3fsLog::LEVEL_INFO, 3, fmt, ##__VA_ARGS__) #define S3FS_PRN_CURL(fmt, ...) S3FS_LOW_CURLDBG(fmt, ##__VA_ARGS__, "") #define S3FS_PRN_CACHE(fp, ...) S3FS_LOW_CACHE(fp, ##__VA_ARGS__, "")