Merge pull request #16854 from yuwata/sd-bus-error-set-errnofv

sd-bus: rework sd_bus_error_set_errnofv()
This commit is contained in:
Zbigniew Jędrzejewski-Szmek
2020-09-05 15:47:37 +02:00
committed by GitHub
2 changed files with 89 additions and 19 deletions
+14 -19
View File
@@ -484,7 +484,6 @@ _public_ int sd_bus_error_set_errno(sd_bus_error *e, int error) {
_public_ int sd_bus_error_set_errnofv(sd_bus_error *e, int error, const char *format, va_list ap) {
PROTECT_ERRNO;
int r;
if (error < 0)
error = -error;
@@ -515,34 +514,30 @@ _public_ int sd_bus_error_set_errnofv(sd_bus_error *e, int error, const char *fo
}
if (format) {
char *m;
_cleanup_free_ char *m = NULL;
/* Then, let's try to fill in the supplied message */
errno = error; /* Make sure that %m resolves to the specified error */
r = vasprintf(&m, format, ap);
if (r >= 0) {
if (vasprintf(&m, format, ap) < 0)
goto fail;
if (e->_need_free <= 0) {
char *t;
if (e->_need_free <= 0) {
char *t;
t = strdup(e->name);
if (t) {
e->_need_free = 1;
e->name = t;
e->message = m;
return -error;
}
t = strdup(e->name);
if (!t)
goto fail;
free(m);
} else {
free((char*) e->message);
e->message = m;
return -error;
}
e->_need_free = 1;
e->name = t;
}
e->message = TAKE_PTR(m);
return -error;
}
fail:
/* If that didn't work, use strerror() for the message */
bus_error_strerror(e, error);
return -error;
+75
View File
@@ -213,12 +213,87 @@ static void test_errno_mapping_custom(void) {
assert_se(sd_bus_error_add_map(test_errors_bad2) == -EINVAL);
}
static void test_sd_bus_error_set_errnof(void) {
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
_cleanup_free_ char *str = NULL;
assert_se(sd_bus_error_set_errnof(NULL, 0, NULL) == 0);
assert_se(sd_bus_error_set_errnof(NULL, ENOANO, NULL) == -ENOANO);
assert_se(sd_bus_error_set_errnof(&error, 0, NULL) == 0);
assert_se(!bus_error_is_dirty(&error));
assert_se(sd_bus_error_set_errnof(&error, EACCES, NULL) == -EACCES);
assert_se(sd_bus_error_has_name(&error, SD_BUS_ERROR_ACCESS_DENIED));
errno = EACCES;
assert_se(asprintf(&str, "%m") >= 0);
assert_se(streq(error.message, str));
assert_se(error._need_free == 0);
str = mfree(str);
sd_bus_error_free(&error);
assert_se(sd_bus_error_set_errnof(&error, ENOANO, NULL) == -ENOANO);
assert_se(sd_bus_error_has_name(&error, "System.Error.ENOANO"));
errno = ENOANO;
assert_se(asprintf(&str, "%m") >= 0);
assert_se(streq(error.message, str));
assert_se(error._need_free == 1);
str = mfree(str);
sd_bus_error_free(&error);
assert_se(sd_bus_error_set_errnof(&error, 100000, NULL) == -100000);
assert_se(sd_bus_error_has_name(&error, SD_BUS_ERROR_FAILED));
errno = 100000;
assert_se(asprintf(&str, "%m") >= 0);
assert_se(streq(error.message, str));
assert_se(error._need_free == 1);
str = mfree(str);
sd_bus_error_free(&error);
assert_se(sd_bus_error_set_errnof(NULL, 0, "hoge %s: %m", "foo") == 0);
assert_se(sd_bus_error_set_errnof(NULL, ENOANO, "hoge %s: %m", "foo") == -ENOANO);
assert_se(sd_bus_error_set_errnof(&error, 0, "hoge %s: %m", "foo") == 0);
assert_se(!bus_error_is_dirty(&error));
assert_se(sd_bus_error_set_errnof(&error, EACCES, "hoge %s: %m", "foo") == -EACCES);
assert_se(sd_bus_error_has_name(&error, SD_BUS_ERROR_ACCESS_DENIED));
errno = EACCES;
assert_se(asprintf(&str, "hoge %s: %m", "foo") >= 0);
assert_se(streq(error.message, str));
assert_se(error._need_free == 1);
str = mfree(str);
sd_bus_error_free(&error);
assert_se(sd_bus_error_set_errnof(&error, ENOANO, "hoge %s: %m", "foo") == -ENOANO);
assert_se(sd_bus_error_has_name(&error, "System.Error.ENOANO"));
errno = ENOANO;
assert_se(asprintf(&str, "hoge %s: %m", "foo") >= 0);
assert_se(streq(error.message, str));
assert_se(error._need_free == 1);
str = mfree(str);
sd_bus_error_free(&error);
assert_se(sd_bus_error_set_errnof(&error, 100000, "hoge %s: %m", "foo") == -100000);
assert_se(sd_bus_error_has_name(&error, SD_BUS_ERROR_FAILED));
errno = 100000;
assert_se(asprintf(&str, "hoge %s: %m", "foo") >= 0);
assert_se(streq(error.message, str));
assert_se(error._need_free == 1);
}
int main(int argc, char *argv[]) {
dump_mapping_table();
test_error();
test_errno_mapping_standard();
test_errno_mapping_custom();
test_sd_bus_error_set_errnof();
return 0;
}