chiark / gitweb /
Make bus errno mappings non-static
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Fri, 31 Oct 2014 14:07:54 +0000 (10:07 -0400)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Fri, 31 Oct 2014 15:32:00 +0000 (11:32 -0400)
__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.

src/libsystemd/sd-bus/bus-error.c
src/libsystemd/sd-bus/test-bus-error.c
src/shared/bus-errors.c
src/shared/bus-errors.h
src/systemd/sd-bus.h
src/test/test-engine.c
src/timedate/timedated.c

index ad1a66da72fd73d54771ab569597d1423a491a2a..cfb8d147a77f3b289b0d9181a49e1b8ad6c466ab 100644 (file)
@@ -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},
index aff34a90cd8521a74f16afe89df66fb841d901d7..ae894e39fd19d134339dbbf6b3045fba0c85b697 100644 (file)
@@ -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},
 };
index 31d00bac39b5a941ae9516f83d56bee25c968c6b..b6f65d205bf2674c58d3dad2325a2a5020e205a1 100644 (file)
@@ -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},
index 504ab1f796ad4c00e3f87ecc7d8090071bfb0058..1bf19c3f3933a1ab16188d8a7c4d16951122da7f 100644 (file)
@@ -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);
index c95b5e7ab0388cafdb7cc810274654ba71e2b145..21a6412f0e9bfb0e3d2f95f1b1a4ef8aa710000c 100644 (file)
@@ -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);
index 6acd394c677e7721e1a786442e4aa282a002f1fc..456999ca40ba7bf41726b3bdd359b12b553f6d3c 100644 (file)
@@ -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);
index 49a957c8d0cc7dab01de535adff2e79a6ffe235f..e720227338b9488c024eebde05ca8f55c8d7957b 100644 (file)
@@ -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},
 };