1 /* SPDX-License-Identifier: LGPL-2.1-or-later */ 2 #pragma once 3 4 #include <stdbool.h> 5 6 #include "sd-bus.h" 7 8 #include "macro.h" 9 10 bool bus_error_is_dirty(sd_bus_error *e); 11 12 const char *bus_error_message(const sd_bus_error *e, int error); 13 14 int bus_error_setfv(sd_bus_error *e, const char *name, const char *format, va_list ap) _printf_(3,0); 15 int bus_error_set_errnofv(sd_bus_error *e, int error, const char *format, va_list ap) _printf_(3,0); 16 17 #define BUS_ERROR_OOM SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_MEMORY, "Out of memory") 18 #define BUS_ERROR_FAILED SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_FAILED, "Operation failed") 19 20 /* 21 * There are two ways to register error maps with the error translation 22 * logic: by using BUS_ERROR_MAP_ELF_REGISTER, which however only 23 * works when linked into the same ELF module, or via 24 * sd_bus_error_add_map() which is the official, external API, that 25 * works from any module. 26 * 27 * Note that BUS_ERROR_MAP_ELF_REGISTER has to be used as decorator in 28 * the bus error table, and BUS_ERROR_MAP_ELF_USE has to be used at 29 * least once per compilation unit (i.e. per library), to ensure that 30 * the error map is really added to the final binary. 31 * 32 * In addition, set the retain attribute so that the section cannot be 33 * discarded by ld --gc-sections -z start-stop-gc. Older compilers would 34 * warn for the unknown attribute, so just disable -Wattributes. 35 */ 36 37 #define BUS_ERROR_MAP_ELF_REGISTER \ 38 _Pragma("GCC diagnostic ignored \"-Wattributes\"") \ 39 _section_("SYSTEMD_BUS_ERROR_MAP") \ 40 _used_ \ 41 _retain_ \ 42 _alignptr_ \ 43 _variable_no_sanitize_address_ 44 45 #define BUS_ERROR_MAP_ELF_USE(errors) \ 46 extern const sd_bus_error_map errors[]; \ 47 _used_ \ 48 static const sd_bus_error_map * const CONCATENATE(errors ## _copy_, __COUNTER__) = errors; 49 50 /* We use something exotic as end marker, to ensure people build the 51 * maps using the macsd-ros. */ 52 #define BUS_ERROR_MAP_END_MARKER -'x' 53 54 BUS_ERROR_MAP_ELF_USE(bus_standard_errors); 55