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:
Zbigniew Jędrzejewski-Szmek 2014-10-31 10:07:54 -04:00
parent 5e071f200c
commit fedfcdee6f
7 changed files with 24 additions and 10 deletions

View 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},

View 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},
};

View 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},

View 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);

View 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);

View 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);

View 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},
};