mirror of
https://github.com/systemd/systemd-stable.git
synced 2024-12-24 21:34:08 +03:00
Make bus errno mappings non-static
__attribute__((used)) is not enough to force static variables to be carried over to a compiled program from a library. Mappings defined in libsystemd-shared.a were not visible in the compiled binaries. To ensure that the mappings are present in the final binary, the tables are made non-static and are given a real unique name by which they can be referenced. To use a mapping defined not in the local compilation unit (e.g. in a library) a reference to the mapping table is added. This is done by including a declaration in the header file. Expected values in test-engine are fixed to reflect the new mappings.
This commit is contained in:
parent
5e071f200c
commit
fedfcdee6f
@ -35,7 +35,7 @@
|
||||
#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")
|
||||
|
||||
SD_BUS_ERROR_MAPPING = {
|
||||
SD_BUS_ERROR_MAPPING(sd_bus_standard) = {
|
||||
{"org.freedesktop.DBus.Error.Failed", EACCES},
|
||||
{"org.freedesktop.DBus.Error.NoMemory", ENOMEM},
|
||||
{"org.freedesktop.DBus.Error.ServiceUnknown", EHOSTUNREACH},
|
||||
|
@ -130,7 +130,7 @@ static void test_errno_mapping_standard(void) {
|
||||
assert_se(sd_bus_error_set(NULL, "System.Error.WHATSIT", NULL) == -EIO);
|
||||
}
|
||||
|
||||
SD_BUS_ERROR_MAPPING = {
|
||||
SD_BUS_ERROR_MAPPING(test) = {
|
||||
{"org.freedesktop.custom-dbus-error", 5},
|
||||
{"org.freedesktop.custom-dbus-error-2", 52},
|
||||
};
|
||||
|
@ -24,7 +24,7 @@
|
||||
#include "sd-bus.h"
|
||||
#include "bus-errors.h"
|
||||
|
||||
SD_BUS_ERROR_MAPPING = {
|
||||
SD_BUS_ERROR_MAPPING(systemd_shared) = {
|
||||
{BUS_ERROR_NO_SUCH_UNIT, ENOENT},
|
||||
{BUS_ERROR_NO_UNIT_FOR_PID, ESRCH},
|
||||
{BUS_ERROR_UNIT_EXISTS, EEXIST},
|
||||
|
@ -21,6 +21,8 @@
|
||||
along with systemd; If not, see <http://www.gnu.org/licenses/>.
|
||||
***/
|
||||
|
||||
#include "sd-bus.h"
|
||||
|
||||
#define BUS_ERROR_NO_SUCH_UNIT "org.freedesktop.systemd1.NoSuchUnit"
|
||||
#define BUS_ERROR_NO_UNIT_FOR_PID "org.freedesktop.systemd1.NoUnitForPID"
|
||||
#define BUS_ERROR_UNIT_EXISTS "org.freedesktop.systemd1.UnitExists"
|
||||
@ -67,3 +69,5 @@
|
||||
#define BUS_ERROR_CNAME_LOOP "org.freedesktop.resolve1.CNameLoop"
|
||||
#define BUS_ERROR_ABORTED "org.freedesktop.resolve1.Aborted"
|
||||
#define _BUS_ERROR_DNS "org.freedesktop.resolve1.DnsError."
|
||||
|
||||
SD_BUS_ERROR_MAPPING_USE(systemd_shared);
|
||||
|
@ -334,14 +334,24 @@ typedef struct sd_bus_name_error_mapping sd_bus_name_error_mapping;
|
||||
|
||||
#define SD_BUS_ERROR_MAKE_CONST(name, message) ((const sd_bus_error) {(name), (message), 0})
|
||||
#define SD_BUS_ERROR_NULL SD_BUS_ERROR_MAKE_CONST(NULL, NULL)
|
||||
|
||||
#ifndef SD_BUS_ERROR_MAPPING
|
||||
# define _SD_BUS_ERROR_XCONCAT(x, y) x ## y
|
||||
# define _SD_BUS_ERROR_CONCAT(x, y) _SD_BUS_ERROR_XCONCAT(x, y)
|
||||
# define SD_BUS_ERROR_MAPPING \
|
||||
__attribute((__section__("sd_bus_errnomap"))) __attribute((__used__)) \
|
||||
static const sd_bus_name_error_mapping _SD_BUS_ERROR_CONCAT(_sd_bus_errno_mapping_, __COUNTER__)[]
|
||||
# define SD_BUS_ERROR_MAPPING(name) \
|
||||
__attribute((__section__("sd_bus_errnomap"))) \
|
||||
__attribute((__used__)) \
|
||||
const sd_bus_name_error_mapping _SD_BUS_ERROR_CONCAT(_sd_bus_errno_mapping_, name)[]
|
||||
# define SD_BUS_ERROR_MAPPING_USE(name) \
|
||||
extern \
|
||||
const sd_bus_name_error_mapping _SD_BUS_ERROR_CONCAT(_sd_bus_errno_mapping_, name)[]; \
|
||||
__attribute((__used__)) \
|
||||
static const sd_bus_name_error_mapping* \
|
||||
_SD_BUS_ERROR_CONCAT(sd_bus_name_error_mapping_ref, __COUNTER__) \
|
||||
= _SD_BUS_ERROR_CONCAT(_sd_bus_errno_mapping_, name);
|
||||
#endif
|
||||
|
||||
|
||||
void sd_bus_error_free(sd_bus_error *e);
|
||||
int sd_bus_error_set(sd_bus_error *e, const char *name, const char *message);
|
||||
int sd_bus_error_setf(sd_bus_error *e, const char *name, const char *format, ...) _sd_printf_(3, 4);
|
||||
|
@ -66,7 +66,7 @@ int main(int argc, char *argv[]) {
|
||||
manager_dump_units(m, stdout, "\t");
|
||||
|
||||
printf("Test2: (Cyclic Order, Unfixable)\n");
|
||||
assert_se(manager_add_job(m, JOB_START, d, JOB_REPLACE, false, NULL, &j) == -ENOEXEC);
|
||||
assert_se(manager_add_job(m, JOB_START, d, JOB_REPLACE, false, NULL, &j) == -EDEADLOCK);
|
||||
manager_dump_jobs(m, stdout, "\t");
|
||||
|
||||
printf("Test3: (Cyclic Order, Fixable, Garbage Collector)\n");
|
||||
@ -82,14 +82,14 @@ int main(int argc, char *argv[]) {
|
||||
manager_dump_units(m, stdout, "\t");
|
||||
|
||||
printf("Test5: (Colliding transaction, fail)\n");
|
||||
assert_se(manager_add_job(m, JOB_START, g, JOB_FAIL, false, NULL, &j) == -EEXIST);
|
||||
assert_se(manager_add_job(m, JOB_START, g, JOB_FAIL, false, NULL, &j) == -EDEADLOCK);
|
||||
|
||||
printf("Test6: (Colliding transaction, replace)\n");
|
||||
assert_se(manager_add_job(m, JOB_START, g, JOB_REPLACE, false, NULL, &j) == 0);
|
||||
manager_dump_jobs(m, stdout, "\t");
|
||||
|
||||
printf("Test7: (Unmergeable job type, fail)\n");
|
||||
assert_se(manager_add_job(m, JOB_STOP, g, JOB_FAIL, false, NULL, &j) == -EEXIST);
|
||||
assert_se(manager_add_job(m, JOB_STOP, g, JOB_FAIL, false, NULL, &j) == -EDEADLOCK);
|
||||
|
||||
printf("Test8: (Mergeable job type, fail)\n");
|
||||
assert_se(manager_add_job(m, JOB_RESTART, g, JOB_FAIL, false, NULL, &j) == 0);
|
||||
|
@ -44,7 +44,7 @@
|
||||
#define NULL_ADJTIME_UTC "0.0 0 0\n0\nUTC\n"
|
||||
#define NULL_ADJTIME_LOCAL "0.0 0 0\n0\nLOCAL\n"
|
||||
|
||||
SD_BUS_ERROR_MAPPING = {
|
||||
SD_BUS_ERROR_MAPPING(timedated) = {
|
||||
{"org.freedesktop.timedate1.NoNTPSupport", ENOTSUP},
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user