Merge pull request #16854 from yuwata/sd-bus-error-set-errnofv
sd-bus: rework sd_bus_error_set_errnofv()
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user