blob: c6e2b019fae60b676f7d93d471f6a696397b3b2c [file] [log] [blame]
// Copyright 2024 The Pigweed Authors
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
#pragma once
#include <cstring> // strerror()
#include "pw_log/log.h"
// TODO(b/328262654): Move this to a more appropriate module.
// A format string for logging an errno plus its string representation.
// Use with the provided ERRNO_FORMAT_ARGS function in logging functions.
// This can be used directly with PW_LOG_*, PW_CHECK_*, and PW_CRASH.
//
// For example:
//
// PW_CHECK_INT_EQ(size, expected, "Error reading foo: " ERRNO_FORMAT_STRING,
// ERRNO_FORMAT_ARGS(errno));
//
// Prefer to use one of the helper macros below for common use cases.
//
#define ERRNO_FORMAT_STRING "errno=%d (%s)"
#define ERRNO_FORMAT_ARGS(e) e, std::strerror(e)
// Macros used to log errno plus its string representation. This ensures
// consistent formatting and always remembering to include the string.
//
// Note that we accept the extra memory cost of logging the string directly
// instead of attempting to tokenize it. These logs should only be used in
// Linux platform-specific code and generally only for logging errors.
// This could be updated to use nested tokenization:
// https://pigweed.dev/seed/0105-pw_tokenizer-pw_log-nested-tokens.html
//
// Example:
//
// LOG_ERROR_WITH_ERRNO("Error calling foo:", errno);
//
#define LOG_DEBUG_WITH_ERRNO(message, e, ...) \
PW_LOG_DEBUG( \
message " " ERRNO_FORMAT_STRING, ##__VA_ARGS__, ERRNO_FORMAT_ARGS(e));
#define LOG_INFO_WITH_ERRNO(message, e, ...) \
PW_LOG_INFO( \
message " " ERRNO_FORMAT_STRING, ##__VA_ARGS__, ERRNO_FORMAT_ARGS(e));
#define LOG_WARN_WITH_ERRNO(message, e, ...) \
PW_LOG_WARN( \
message " " ERRNO_FORMAT_STRING, ##__VA_ARGS__, ERRNO_FORMAT_ARGS(e));
#define LOG_ERROR_WITH_ERRNO(message, e, ...) \
PW_LOG_ERROR( \
message " " ERRNO_FORMAT_STRING, ##__VA_ARGS__, ERRNO_FORMAT_ARGS(e));
#define LOG_CRITICAL_WITH_ERRNO(message, e, ...) \
PW_LOG_CRITICAL( \
message " " ERRNO_FORMAT_STRING, ##__VA_ARGS__, ERRNO_FORMAT_ARGS(e));