2017-11-18 17:09:20 +01:00
|
|
|
/* SPDX-License-Identifier: LGPL-2.1+ */
|
2013-03-19 20:03:16 +01:00
|
|
|
#pragma once
|
|
|
|
|
2013-11-19 21:12:59 +01:00
|
|
|
#include <stdbool.h>
|
|
|
|
|
2013-03-19 20:03:16 +01:00
|
|
|
#include "sd-bus.h"
|
2015-11-18 22:46:33 +01:00
|
|
|
|
2013-12-15 23:43:47 +01:00
|
|
|
#include "macro.h"
|
2013-03-19 20:03:16 +01:00
|
|
|
|
2013-03-20 13:10:12 +01:00
|
|
|
bool bus_error_is_dirty(sd_bus_error *e);
|
2013-03-21 22:50:25 +01:00
|
|
|
|
|
|
|
const char *bus_error_message(const sd_bus_error *e, int error);
|
2013-10-16 06:10:04 +02:00
|
|
|
|
2013-12-15 23:43:47 +01:00
|
|
|
int bus_error_setfv(sd_bus_error *e, const char *name, const char *format, va_list ap) _printf_(3,0);
|
|
|
|
int bus_error_set_errnofv(sd_bus_error *e, int error, const char *format, va_list ap) _printf_(3,0);
|
2014-12-06 02:39:15 +01:00
|
|
|
|
|
|
|
#define BUS_ERROR_OOM SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_MEMORY, "Out of memory")
|
|
|
|
#define BUS_ERROR_FAILED SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_FAILED, "Operation failed")
|
|
|
|
|
|
|
|
/*
|
|
|
|
* There are two ways to register error maps with the error translation
|
|
|
|
* logic: by using BUS_ERROR_MAP_ELF_REGISTER, which however only
|
|
|
|
* works when linked into the same ELF module, or via
|
|
|
|
* sd_bus_error_add_map() which is the official, external API, that
|
|
|
|
* works from any module.
|
|
|
|
*
|
|
|
|
* Note that BUS_ERROR_MAP_ELF_REGISTER has to be used as decorator in
|
|
|
|
* the bus error table, and BUS_ERROR_MAP_ELF_USE has to be used at
|
|
|
|
* least once per compilation unit (i.e. per library), to ensure that
|
|
|
|
* the error map is really added to the final binary.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define BUS_ERROR_MAP_ELF_REGISTER \
|
sd-bus,static-destruct: clean up how we do our ELF section magic
This cleans up a bit how we set up things for the ELF section magic:
1. Let's always use our gcc macros, instead of __attribute__ directly
2. Align our structures to sizeof(void*), i.e. the pointer size, rather
than a fixed 8 or __BIGGEST_ALIGNMENT__. The former is unnecessarily
high for 32bit systems, the latter too high for 64bit systems. gcc
seems to use ptr alignment for static variables itself, hence this
should be good enough for us too. Moreover, the Linux kernel also
uses pointer alginment for all its ELF section registration magic,
hence this should be good enough for us too.
3. Let's always prefix the sections we create ourself with SYSTEMD_,
just to make clear where they come from.
4. Always align the pointer we start from when iterating through these
lists. This should be unnecessary, but makes things nicely
systematic, as we'll align all pointers we use to access these
sections properly.
2018-12-03 13:22:15 +01:00
|
|
|
_section_("SYSTEMD_BUS_ERROR_MAP") \
|
|
|
|
_used_ \
|
2018-12-03 17:33:42 +01:00
|
|
|
_alignptr_ \
|
|
|
|
_variable_no_sanitize_address_
|
2014-12-06 02:39:15 +01:00
|
|
|
|
|
|
|
#define BUS_ERROR_MAP_ELF_USE(errors) \
|
|
|
|
extern const sd_bus_error_map errors[]; \
|
sd-bus,static-destruct: clean up how we do our ELF section magic
This cleans up a bit how we set up things for the ELF section magic:
1. Let's always use our gcc macros, instead of __attribute__ directly
2. Align our structures to sizeof(void*), i.e. the pointer size, rather
than a fixed 8 or __BIGGEST_ALIGNMENT__. The former is unnecessarily
high for 32bit systems, the latter too high for 64bit systems. gcc
seems to use ptr alignment for static variables itself, hence this
should be good enough for us too. Moreover, the Linux kernel also
uses pointer alginment for all its ELF section registration magic,
hence this should be good enough for us too.
3. Let's always prefix the sections we create ourself with SYSTEMD_,
just to make clear where they come from.
4. Always align the pointer we start from when iterating through these
lists. This should be unnecessary, but makes things nicely
systematic, as we'll align all pointers we use to access these
sections properly.
2018-12-03 13:22:15 +01:00
|
|
|
_used_ \
|
2018-11-20 04:34:08 +01:00
|
|
|
static const sd_bus_error_map * const CONCATENATE(errors ## _copy_, __COUNTER__) = errors;
|
2014-12-06 02:39:15 +01:00
|
|
|
|
|
|
|
/* We use something exotic as end marker, to ensure people build the
|
|
|
|
* maps using the macsd-ros. */
|
|
|
|
#define BUS_ERROR_MAP_END_MARKER -'x'
|
|
|
|
|
2014-12-10 19:00:46 +01:00
|
|
|
BUS_ERROR_MAP_ELF_USE(bus_standard_errors);
|