diff --git a/src/libsystemd/sd-bus/bus-error.c b/src/libsystemd/sd-bus/bus-error.c index ad1a66da72f..cfb8d147a77 100644 --- a/src/libsystemd/sd-bus/bus-error.c +++ b/src/libsystemd/sd-bus/bus-error.c @@ -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}, diff --git a/src/libsystemd/sd-bus/test-bus-error.c b/src/libsystemd/sd-bus/test-bus-error.c index aff34a90cd8..ae894e39fd1 100644 --- a/src/libsystemd/sd-bus/test-bus-error.c +++ b/src/libsystemd/sd-bus/test-bus-error.c @@ -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}, }; diff --git a/src/shared/bus-errors.c b/src/shared/bus-errors.c index 31d00bac39b..b6f65d205bf 100644 --- a/src/shared/bus-errors.c +++ b/src/shared/bus-errors.c @@ -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}, diff --git a/src/shared/bus-errors.h b/src/shared/bus-errors.h index 504ab1f796a..1bf19c3f393 100644 --- a/src/shared/bus-errors.h +++ b/src/shared/bus-errors.h @@ -21,6 +21,8 @@ along with systemd; If not, see . ***/ +#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); diff --git a/src/systemd/sd-bus.h b/src/systemd/sd-bus.h index c95b5e7ab03..21a6412f0e9 100644 --- a/src/systemd/sd-bus.h +++ b/src/systemd/sd-bus.h @@ -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); diff --git a/src/test/test-engine.c b/src/test/test-engine.c index 6acd394c677..456999ca40b 100644 --- a/src/test/test-engine.c +++ b/src/test/test-engine.c @@ -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); diff --git a/src/timedate/timedated.c b/src/timedate/timedated.c index 49a957c8d0c..e720227338b 100644 --- a/src/timedate/timedated.c +++ b/src/timedate/timedated.c @@ -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}, };