summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2014-10-31 10:07:54 -0400
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2014-10-31 11:32:00 -0400
commitfedfcdee6f55c3f183752b7fac4879bf41eed60b (patch)
treec37f5157e631d6e9426d8eb9905c8894061c0205
parent5e071f200c4cc86443af07a876ee0e1c2901fda1 (diff)
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.
-rw-r--r--src/libsystemd/sd-bus/bus-error.c2
-rw-r--r--src/libsystemd/sd-bus/test-bus-error.c2
-rw-r--r--src/shared/bus-errors.c2
-rw-r--r--src/shared/bus-errors.h4
-rw-r--r--src/systemd/sd-bus.h16
-rw-r--r--src/test/test-engine.c6
-rw-r--r--src/timedate/timedated.c2
7 files changed, 24 insertions, 10 deletions
diff --git a/src/libsystemd/sd-bus/bus-error.c b/src/libsystemd/sd-bus/bus-error.c
index ad1a66da72..cfb8d147a7 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 aff34a90cd..ae894e39fd 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 31d00bac39..b6f65d205b 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 504ab1f796..1bf19c3f39 100644
--- a/src/shared/bus-errors.h
+++ b/src/shared/bus-errors.h
@@ -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);
diff --git a/src/systemd/sd-bus.h b/src/systemd/sd-bus.h
index c95b5e7ab0..21a6412f0e 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 6acd394c67..456999ca40 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 49a957c8d0..e720227338 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},
};