From a06e23c0bcf0c8669a29b801876aca8aac422931 Mon Sep 17 00:00:00 2001 From: Pavel Březina Date: Tue, 28 Jun 2016 15:29:39 +0200 Subject: sbus: add sbus_request_reply_error() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This simplifies error handling in sbus requests since we avoid creating DBusError and checking for NULL manually. It removes few lines of code. This patch does not replace all calls to sbus_request_fail_and_finish since sometimes it is desirable to create the error manualy. But it replaces it in most recent places. Reviewed-by: Lukáš Slebodník Reviewed-by: Jakub Hrozek --- src/sbus/sssd_dbus.h | 9 ++++-- src/sbus/sssd_dbus_request.c | 71 ++++++++++++++++++++++++++++++++++---------- 2 files changed, 62 insertions(+), 18 deletions(-) (limited to 'src/sbus') diff --git a/src/sbus/sssd_dbus.h b/src/sbus/sssd_dbus.h index fe1c4a7e1..c0aedf36b 100644 --- a/src/sbus/sssd_dbus.h +++ b/src/sbus/sssd_dbus.h @@ -357,6 +357,11 @@ int sbus_request_return_and_finish(struct sbus_request *dbus_req, int sbus_request_fail_and_finish(struct sbus_request *dbus_req, const DBusError *error); +void sbus_request_reply_error(struct sbus_request *sbus_req, + const char *error_name, + const char *fmt, + ...) SSS_ATTRIBUTE_PRINTF(3, 4); + /* * Construct a new DBusError instance which can be consumed by functions such * as @sbus_request_fail_and_finish(). @@ -368,9 +373,9 @@ int sbus_request_fail_and_finish(struct sbus_request *dbus_req, * is duplicated using the returned DBusError instance as a talloc parent. */ DBusError *sbus_error_new(TALLOC_CTX *mem_ctx, - const char *dbus_err_name, + const char *dbus_error_name, const char *fmt, - ...) SSS_ATTRIBUTE_PRINTF(3,4); + ...) SSS_ATTRIBUTE_PRINTF(3, 4); /* * Parse a DBus method call request. diff --git a/src/sbus/sssd_dbus_request.c b/src/sbus/sssd_dbus_request.c index f8647b5ec..c5b08539f 100644 --- a/src/sbus/sssd_dbus_request.c +++ b/src/sbus/sssd_dbus_request.c @@ -199,31 +199,70 @@ int sbus_request_fail_and_finish(struct sbus_request *dbus_req, return ret; } +static DBusError *sbus_error_new_va(TALLOC_CTX *mem_ctx, + const char *error_name, + const char *fmt, + va_list ap) +{ + DBusError *error; + const char *error_msg; + + error = talloc_zero(mem_ctx, DBusError); + if (error == NULL) { + return NULL; + } + + if (fmt != NULL) { + error_msg = talloc_vasprintf(error, fmt, ap); + if (error_msg == NULL) { + talloc_free(error); + return NULL; + } + } else { + error_msg = NULL; + } + + dbus_error_init(error); + dbus_set_error_const(error, error_name, error_msg); + + return error; +} + DBusError *sbus_error_new(TALLOC_CTX *mem_ctx, - const char *dbus_err_name, + const char *dbus_error_name, const char *fmt, ...) { - DBusError *dberr; - const char *err_msg_dup = NULL; + DBusError *error; va_list ap; - dberr = talloc(mem_ctx, DBusError); - if (dberr == NULL) return NULL; + va_start(ap, fmt); + error = sbus_error_new_va(mem_ctx, dbus_error_name, fmt, ap); + va_end(ap); - if (fmt) { - va_start(ap, fmt); - err_msg_dup = talloc_vasprintf(dberr, fmt, ap); - va_end(ap); - if (err_msg_dup == NULL) { - talloc_free(dberr); - return NULL; - } + return error; +} + +void sbus_request_reply_error(struct sbus_request *sbus_req, + const char *error_name, + const char *fmt, + ...) +{ + DBusError *error; + va_list ap; + + va_start(ap, fmt); + error = sbus_error_new_va(sbus_req, error_name, fmt, ap); + va_end(ap); + + if (error == NULL) { + DEBUG(SSSDBG_CRIT_FAILURE, + "Unable to create D-Bus error, killing request!\n"); + talloc_free(sbus_req); + return; } - dbus_error_init(dberr); - dbus_set_error_const(dberr, dbus_err_name, err_msg_dup); - return dberr; + sbus_request_fail_and_finish(sbus_req, error); } struct array_arg { -- cgit