diff options
Diffstat (limited to 'server/infopipe/infopipe_groups.c')
-rw-r--r-- | server/infopipe/infopipe_groups.c | 832 |
1 files changed, 0 insertions, 832 deletions
diff --git a/server/infopipe/infopipe_groups.c b/server/infopipe/infopipe_groups.c deleted file mode 100644 index a2fe5a405..000000000 --- a/server/infopipe/infopipe_groups.c +++ /dev/null @@ -1,832 +0,0 @@ -/* - SSSD - - InfoPipe - - Copyright (C) Stephen Gallagher <sgallagh@redhat.com> 2009 - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - -#include <dbus/dbus.h> -#include <ldb.h> -#include <time.h> -#include "util/util.h" -#include "util/btreemap.h" -#include "confdb/confdb.h" -#include "infopipe/infopipe.h" -#include "infopipe/infopipe_private.h" -#include "infopipe/sysbus.h" -#include "db/sysdb.h" - -struct infp_creategroup_ctx { - struct infp_req_ctx *infp_req; - char **groupnames; - uint32_t name_count; - uint32_t index; - struct sysdb_handle *handle; -}; - -static void infp_do_group_create(struct sysdb_handle *handle, void *pvt); -static void infp_do_group_create_callback(void *pvt, int status, - struct ldb_result *res) -{ - char *error_msg = NULL; - DBusMessage *reply = NULL; - struct infp_creategroup_ctx *grcreate_req = - talloc_get_type(pvt, struct infp_creategroup_ctx); - - if (status != EOK) { - sysdb_transaction_done(grcreate_req->handle, status); - - if (status == EEXIST) { - error_msg = - talloc_asprintf(grcreate_req, - "Group [%s] already exists on domain [%s]", - grcreate_req->groupnames[grcreate_req->index], - grcreate_req->infp_req->domain->name); - reply = dbus_message_new_error(grcreate_req->infp_req->req_message, - DBUS_ERROR_FILE_EXISTS, - error_msg); - if (reply) - sbus_conn_send_reply(grcreate_req->infp_req->sconn, reply); - } - else { - infp_return_failure(grcreate_req->infp_req, NULL); - } - talloc_free(grcreate_req); - return; - } - - /* Status is okay, add the next group */ - grcreate_req->index++; - if (grcreate_req->index < grcreate_req->name_count) { - infp_do_group_create(grcreate_req->handle, grcreate_req); - return; - } - - /* We have no more usernames to add, so commit the transaction */ - sysdb_transaction_done(grcreate_req->handle, status); - - infp_return_success(grcreate_req->infp_req); - talloc_free(grcreate_req); - return; -} - -static void infp_do_group_create(struct sysdb_handle *handle, void *pvt) -{ - int ret; - struct infp_creategroup_ctx *grcreate_req = - talloc_get_type(pvt, struct infp_creategroup_ctx); - - grcreate_req->handle = handle; - - ret = sysdb_add_group(grcreate_req->handle, - grcreate_req->infp_req->domain, - grcreate_req->groupnames[grcreate_req->index], 0, - infp_do_group_create_callback, grcreate_req); - if (ret != EOK) { - DEBUG(0, ("Could not invoke sysdb_add_group\n")); - sysdb_transaction_done(grcreate_req->handle, ret); - infp_return_failure(grcreate_req->infp_req, NULL); - talloc_free(grcreate_req); - return; - } -} - -int infp_groups_create(DBusMessage *message, struct sbus_conn_ctx *sconn) -{ - DBusMessage *reply; - DBusError error; - struct infp_creategroup_ctx *grcreate_req; - char *einval_msg; - int ret, i; - - /* Arguments */ - char **arg_grnames = NULL; - int arg_grnames_count; - const char *arg_domain; - - grcreate_req = talloc_zero(NULL, struct infp_creategroup_ctx); - if(grcreate_req == NULL) { - ret = ENOMEM; - goto error; - } - - /* Create an infp_req_ctx */ - grcreate_req->infp_req = infp_req_init(grcreate_req, message, sconn); - if(grcreate_req->infp_req == NULL) { - ret = EIO; - goto error; - } - - dbus_error_init(&error); - if (!dbus_message_get_args(message, &error, - DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, - &arg_grnames, &arg_grnames_count, - DBUS_TYPE_STRING, &arg_domain, - DBUS_TYPE_INVALID)) { - DEBUG(0, ("Parsing arguments to %s failed: %s:%s\n", - INFP_GROUPS_CREATE, error.name, error.message)); - einval_msg = talloc_strdup(grcreate_req, error.message); - dbus_error_free(&error); - goto einval; - } - - /* FIXME: Allow creating groups on domains other than LOCAL */ - if (strcasecmp(arg_domain, "LOCAL") != 0) { - goto denied; - } - - grcreate_req->infp_req->domain = - infp_get_domain_obj(grcreate_req->infp_req->infp, arg_domain); - if (grcreate_req->infp_req->domain == NULL) { - einval_msg = talloc_strdup(grcreate_req, "Invalid domain."); - goto einval; - } - - /* Check permissions */ - if (!infp_get_permissions(grcreate_req->infp_req->caller, - grcreate_req->infp_req->domain, - INFP_OBJ_TYPE_GROUP, - NULL, - INFP_ACTION_TYPE_CREATE, - INFP_ATTR_TYPE_INVALID)) goto denied; - - grcreate_req->groupnames = talloc_array(grcreate_req, - char *, - arg_grnames_count); - if (grcreate_req->groupnames == NULL) { - ret = ENOMEM; - goto error; - } - - grcreate_req->name_count = arg_grnames_count; - for (i = 0; i < arg_grnames_count; i++) { - grcreate_req->groupnames[i] = talloc_strdup(grcreate_req->groupnames, - arg_grnames[i]); - if (grcreate_req->groupnames[i] == NULL) { - ret = ENOMEM; - goto error; - } - } - dbus_free_string_array(arg_grnames); - arg_grnames = NULL; - - grcreate_req->index = 0; - ret = sysdb_transaction(grcreate_req, - grcreate_req->infp_req->infp->sysdb, - infp_do_group_create, - grcreate_req); - - if (ret != EOK) goto error; - - return EOK; - -denied: - reply = dbus_message_new_error(message, DBUS_ERROR_ACCESS_DENIED, NULL); - if(reply == NULL) { - ret = ENOMEM; - goto error; - } - /* send reply */ - sbus_conn_send_reply(sconn, reply); - dbus_message_unref(reply); - - talloc_free(grcreate_req); - return EOK; - -einval: - reply = dbus_message_new_error(message, - DBUS_ERROR_INVALID_ARGS, - einval_msg); - if (reply == NULL) { - ret = ENOMEM; - goto error; - } - sbus_conn_send_reply(sconn, reply); - dbus_message_unref(reply); - if (arg_grnames) dbus_free_string_array(arg_grnames); - talloc_free(grcreate_req); - return EOK; - -error: - if (arg_grnames) dbus_free_string_array(arg_grnames); - if(grcreate_req) infp_return_failure(grcreate_req->infp_req, NULL); - talloc_free(grcreate_req); - return ret; -} - -struct infp_deletegroup_ctx { - struct infp_req_ctx *infp_req; - struct ldb_dn *gr_dn; - struct sysdb_handle *handle; -}; - -static void infp_do_group_delete_callback(void *pvt, int status, - struct ldb_result *res) -{ - struct infp_deletegroup_ctx *grdel_req = - talloc_get_type(pvt, struct infp_deletegroup_ctx); - - /* Commit or cancel the transaction, based on the status */ - sysdb_transaction_done(grdel_req->handle, status); - - if (status != EOK) { - DEBUG(0, ("Failed to delete group from sysdb. Error code %d\n", - status)); - infp_return_failure(grdel_req->infp_req, NULL); - talloc_free(grdel_req); - return; - } - - infp_return_success(grdel_req->infp_req); - talloc_free(grdel_req); -} - -static void infp_do_group_delete(struct sysdb_handle *handle, void *pvt) -{ - int ret; - struct infp_deletegroup_ctx *grdel_req = - talloc_get_type(pvt, struct infp_deletegroup_ctx); - - grdel_req->handle = handle; - - ret = sysdb_delete_entry(grdel_req->handle, - grdel_req->gr_dn, - infp_do_group_delete_callback, - grdel_req); - if (ret != EOK) { - DEBUG(0, ("Could not delete group entry\n")); - infp_return_failure(grdel_req->infp_req, NULL); - talloc_free(grdel_req); - return; - } -} - -int infp_groups_delete(DBusMessage *message, struct sbus_conn_ctx *sconn) -{ - DBusMessage *reply; - DBusError error; - char *einval_msg; - int ret; - struct infp_deletegroup_ctx *grdel_req; - - /* Arguments */ - const char *arg_grname; - const char *arg_domain; - - grdel_req = talloc_zero(NULL, struct infp_deletegroup_ctx); - if(grdel_req == NULL) { - ret = ENOMEM; - goto error; - } - - /* Create an infp_req_ctx */ - grdel_req->infp_req = infp_req_init(grdel_req, message, sconn); - if(grdel_req->infp_req == NULL) { - ret = EIO; - goto error; - } - - dbus_error_init(&error); - if(!dbus_message_get_args(message, &error, - DBUS_TYPE_STRING, &arg_grname, - DBUS_TYPE_STRING, &arg_domain, - DBUS_TYPE_INVALID)) { - DEBUG(0, ("Parsing arguments to %s failed: %s:%s\n", - INFP_GROUPS_DELETE, error.name, error.message)); - einval_msg = talloc_strdup(grdel_req, error.message); - dbus_error_free(&error); - goto einval; - } - - /* FIXME: Allow deleting groups from domains other than LOCAL */ - if(strcasecmp(arg_domain, "LOCAL") != 0) { - goto denied; - } - - grdel_req->infp_req->domain = - infp_get_domain_obj(grdel_req->infp_req->infp, arg_domain); - if (grdel_req->infp_req->domain == NULL) { - einval_msg = talloc_strdup(grdel_req, "Invalid domain."); - goto einval; - } - - /* Check permissions */ - if (!infp_get_permissions(grdel_req->infp_req->caller, - grdel_req->infp_req->domain, - INFP_OBJ_TYPE_GROUP, - NULL, - INFP_ACTION_TYPE_CREATE, - INFP_ATTR_TYPE_INVALID)) goto denied; - - grdel_req->gr_dn = sysdb_group_dn(grdel_req->infp_req->infp->sysdb, - grdel_req, - grdel_req->infp_req->domain->name, - arg_grname); - if(grdel_req->gr_dn == NULL) { - DEBUG(0, ("Could not construct a group_dn for deletion.\n")); - ret = EIO; - goto error; - } - - ret = sysdb_transaction(grdel_req, - grdel_req->infp_req->infp->sysdb, - infp_do_group_delete, - grdel_req); - if (ret != EOK) { - DEBUG(0, ("Unable to start transaction to delete group\n")); - goto error; - } - - return EOK; - -denied: - reply = dbus_message_new_error(message, DBUS_ERROR_ACCESS_DENIED, NULL); - if(reply == NULL) { - ret = ENOMEM; - goto error; - } - /* send reply */ - sbus_conn_send_reply(sconn, reply); - dbus_message_unref(reply); - - talloc_free(grdel_req); - return EOK; - -einval: - reply = dbus_message_new_error(message, - DBUS_ERROR_INVALID_ARGS, - einval_msg); - if (reply == NULL) { - ret = ENOMEM; - goto error; - } - sbus_conn_send_reply(sconn, reply); - dbus_message_unref(reply); - talloc_free(grdel_req); - return EOK; - -error: - if (grdel_req) infp_return_failure(grdel_req->infp_req, NULL); - talloc_free(grdel_req); - return ret; -} - -enum infp_gr_member_types { - INFP_GR_MEM_USER = 0, - INFP_GR_MEM_GROUP -}; - -struct infp_groupmember_ctx { - struct infp_req_ctx *infp_req; - struct ldb_dn *group_dn; - char **membernames; - uint32_t member_count; - uint32_t index; - uint8_t member_type; - uint8_t modify_type; - struct sysdb_handle *handle; -}; - -static void infp_do_member(struct sysdb_handle *handle, void *pvt); - -static void infp_do_member_callback(void *pvt, int status, - struct ldb_result *res) -{ - char *fail_msg; - DBusMessage *reply = NULL; - struct infp_groupmember_ctx *grmod_req = - talloc_get_type(pvt, struct infp_groupmember_ctx); - - /* Check the results of the current add */ - if(status != EOK) goto fail; - - /* Check if there are more members to process */ - grmod_req->index++; - if(grmod_req->index < grmod_req->member_count) { - infp_do_member(grmod_req->handle, grmod_req); - return; - } - - /* This was the last member. Commit the transaction */ - sysdb_transaction_done(grmod_req->handle, EOK); - - /* Send an ack reply */ - reply = dbus_message_new_method_return(grmod_req->infp_req->req_message); - if(reply) { - sbus_conn_send_reply(grmod_req->infp_req->sconn, reply); - dbus_message_unref(reply); - } - - talloc_free(grmod_req); - return; - -fail: -sysdb_transaction_done(grmod_req->handle, status); - fail_msg = talloc_asprintf(grmod_req, "Could not modify group"); - infp_return_failure(grmod_req->infp_req, fail_msg); - talloc_free(grmod_req); - return; -} - -static void infp_do_member(struct sysdb_handle *handle, void *pvt) -{ - int ret; - struct ldb_dn *member_dn; - struct infp_groupmember_ctx *grmod_req = - talloc_get_type(pvt, struct infp_groupmember_ctx); - - grmod_req->handle = handle; - - if (grmod_req->member_type == INFP_GR_MEM_USER) { - member_dn = - sysdb_user_dn(grmod_req->infp_req->infp->sysdb, - grmod_req, - grmod_req->infp_req->domain->name, - grmod_req->membernames[grmod_req->index]); - if (member_dn == NULL) goto error; - } - else if (grmod_req->member_type == INFP_GR_MEM_GROUP) { - member_dn = - sysdb_group_dn(grmod_req->infp_req->infp->sysdb, - grmod_req, - grmod_req->infp_req->domain->name, - grmod_req->membernames[grmod_req->index]); - if (member_dn == NULL) goto error; - } - else goto error; - - if (grmod_req->modify_type == INFP_ACTION_TYPE_ADDMEMBER) { - ret = sysdb_add_group_member(grmod_req->handle, - member_dn, - grmod_req->group_dn, - infp_do_member_callback, - grmod_req); - } - else if (grmod_req->modify_type == INFP_ACTION_TYPE_REMOVEMEMBER) { - ret = sysdb_remove_group_member(grmod_req->handle, - member_dn, - grmod_req->group_dn, - infp_do_member_callback, - grmod_req); - } - if (ret != EOK) goto error; - - return; - -error: - infp_return_failure(grmod_req->infp_req, NULL); - talloc_free(grmod_req); - return; -} - -static int infp_groups_modify_members(DBusMessage *message, - struct sbus_conn_ctx *sconn, - uint8_t modify_type) -{ - DBusMessage *reply; - DBusError error; - struct infp_groupmember_ctx *grmod_req; - char *einval_msg; - int ret, i; - - /* Arguments */ - const char *arg_group; - const char *arg_domain; - char **arg_members = NULL; - int arg_member_count; - uint8_t arg_membertype; - - grmod_req = talloc_zero(NULL, struct infp_groupmember_ctx); - if (grmod_req == NULL) { - ret = ENOMEM; - goto error; - } - - /* Create an infp_req_ctx */ - grmod_req->infp_req = infp_req_init(grmod_req, message, sconn); - if(grmod_req->infp_req == NULL) { - ret = EIO; - goto error; - } - - dbus_error_init(&error); - if (!dbus_message_get_args(message, &error, - DBUS_TYPE_STRING, &arg_group, - DBUS_TYPE_STRING, &arg_domain, - DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, - &arg_members, &arg_member_count, - DBUS_TYPE_BYTE, &arg_membertype, - DBUS_TYPE_INVALID)) { - DEBUG(0, ("Parsing arguments to %s failed: %s:%s\n", - INFP_GROUPS_ADD_MEMBERS, error.name, error.message)); - einval_msg = talloc_strdup(grmod_req, error.message); - dbus_error_free(&error); - goto einval; - } - - /* FIXME: Allow modifying groups on domains other than LOCAL */ - if (strcasecmp(arg_domain, "LOCAL") != 0) { - goto denied; - } - - grmod_req->infp_req->domain = - infp_get_domain_obj(grmod_req->infp_req->infp, arg_domain); - /* Check for a valid domain */ - if (grmod_req->infp_req->domain == NULL) { - einval_msg = talloc_strdup(grmod_req, "Invalid domain."); - goto einval; - } - - /* Check permissions */ - if (!infp_get_permissions(grmod_req->infp_req->caller, - grmod_req->infp_req->domain, - INFP_OBJ_TYPE_GROUP, - arg_group, - modify_type, - INFP_ATTR_TYPE_INVALID)) goto denied; - - grmod_req->member_count = arg_member_count; - grmod_req->membernames = talloc_array(grmod_req, char *, - arg_member_count); - if (grmod_req == NULL) { - ret = ENOMEM; - goto error; - } - for (i = 0; i < arg_member_count; i++) { - grmod_req->membernames[i] = talloc_strdup(grmod_req->membernames, - arg_members[i]); - if(grmod_req->membernames[i] == NULL) { - ret = ENOMEM; - goto error; - } - } - dbus_free_string_array(arg_members); - arg_members = NULL; - - grmod_req->group_dn = - sysdb_group_dn(grmod_req->infp_req->infp->sysdb, - grmod_req, - grmod_req->infp_req->domain->name, - arg_group); - if (grmod_req->group_dn == NULL) { - ret = EIO; - goto error; - } - - grmod_req->index = 0; - grmod_req->modify_type = modify_type; - grmod_req->member_type = arg_membertype; - if ((grmod_req->member_type != INFP_GR_MEM_USER) && - (grmod_req->member_type != INFP_GR_MEM_GROUP)) { - einval_msg = talloc_strdup(grmod_req, - "Invalid member type"); - goto einval; - } - - ret = sysdb_transaction(grmod_req, - grmod_req->infp_req->infp->sysdb, - infp_do_member, - grmod_req); - if (ret != EOK) goto error; - - return EOK; - -denied: - reply = dbus_message_new_error(message, DBUS_ERROR_ACCESS_DENIED, NULL); - if(reply == NULL) { - ret = ENOMEM; - goto error; - } - /* send reply */ - sbus_conn_send_reply(sconn, reply); - dbus_message_unref(reply); - - if (arg_members) dbus_free_string_array(arg_members); - talloc_free(grmod_req); - return EOK; - -einval: - reply = dbus_message_new_error(message, - DBUS_ERROR_INVALID_ARGS, - einval_msg); - if (reply == NULL) { - ret = ENOMEM; - goto error; - } - sbus_conn_send_reply(sconn, reply); - dbus_message_unref(reply); - if (arg_members) dbus_free_string_array(arg_members); - talloc_free(grmod_req); - return EOK; - -error: - if (arg_members) dbus_free_string_array(arg_members); - talloc_free(grmod_req); - return ret; -} - -int infp_groups_add_members(DBusMessage *message, - struct sbus_conn_ctx *sconn) -{ - return infp_groups_modify_members(message, sconn, - INFP_ACTION_TYPE_ADDMEMBER); -} - -int infp_groups_remove_members(DBusMessage *message, - struct sbus_conn_ctx *sconn) -{ - return infp_groups_modify_members(message, sconn, - INFP_ACTION_TYPE_REMOVEMEMBER); -} - -struct infp_setgid_ctx { - struct infp_req_ctx *infp_req; - char *group_name; - gid_t gid; - struct sysdb_handle *handle; -}; - -static void infp_do_gid_callback(void *ptr, - int status, - struct ldb_result *res) -{ - char *error_msg = NULL; - struct infp_setgid_ctx *grmod_req = - talloc_get_type(ptr, struct infp_setgid_ctx); - - /* Commit or cancel the transaction, based on the - * return status - */ - sysdb_transaction_done(grmod_req->handle, status); - - if(status != EOK) { - if (status == ENOENT) { - error_msg = talloc_strdup(grmod_req, "No such group"); - } - infp_return_failure(grmod_req->infp_req, error_msg); - talloc_free(grmod_req); - return; - } - - infp_return_success(grmod_req->infp_req); - talloc_free(grmod_req); -} - -static void infp_do_gid(struct sysdb_handle *handle, void *pvt) -{ - int ret; - DBusMessage *reply; - char *error_msg; - gid_t max; - struct infp_setgid_ctx *grmod_req = - talloc_get_type(pvt, struct infp_setgid_ctx); - grmod_req->handle = handle; - - ret = sysdb_set_group_gid(grmod_req->handle, - grmod_req->infp_req->domain, - grmod_req->group_name, - grmod_req->gid, - infp_do_gid_callback, - grmod_req); - if (ret != EOK) { - if(ret == EDOM) { - /* GID was out of range */ - max = grmod_req->infp_req->domain->id_max? - grmod_req->infp_req->domain->id_max: - (gid_t)-1; - error_msg = talloc_asprintf(grmod_req, - "GID %u outside the range [%u..%u]", - grmod_req->gid, - grmod_req->infp_req->domain->id_min, - max); - reply = dbus_message_new_error(grmod_req->infp_req->req_message, - DBUS_ERROR_LIMITS_EXCEEDED, - error_msg); - if (reply) sbus_conn_send_reply(grmod_req->infp_req->sconn, reply); - } - infp_return_failure(grmod_req->infp_req, NULL); - talloc_free(grmod_req); - return; - } -} - -int infp_groups_set_gid(DBusMessage *message, struct sbus_conn_ctx *sconn) -{ - DBusMessage *reply; - DBusError error; - char *einval_msg; - struct infp_setgid_ctx *grmod_req; - int ret; - - /* Arguments */ - const char *arg_group; - const char *arg_domain; - const gid_t arg_gid; - - grmod_req = talloc_zero(NULL, struct infp_setgid_ctx); - if (grmod_req == NULL) { - ret = ENOMEM; - goto error; - } - - /* Create an infp_req_ctx */ - grmod_req->infp_req = infp_req_init(grmod_req, message, sconn); - if(grmod_req->infp_req == NULL) { - ret = EIO; - goto error; - } - - dbus_error_init(&error); - if (!dbus_message_get_args(message, &error, - DBUS_TYPE_STRING, &arg_group, - DBUS_TYPE_STRING, &arg_domain, - DBUS_TYPE_UINT32, &arg_gid, - DBUS_TYPE_INVALID)) { - DEBUG(0, ("Parsing arguments to %s failed: %s:%s\n", - INFP_GROUPS_SET_GID, error.name, error.message)); - einval_msg = talloc_strdup(grmod_req, error.message); - dbus_error_free(&error); - goto einval; - } - - /* FIXME: Allow modifying groups on domains other than LOCAL */ - if (strcasecmp(arg_domain, "LOCAL") != 0) { - goto denied; - } - - grmod_req->infp_req->domain = - infp_get_domain_obj(grmod_req->infp_req->infp, arg_domain); - /* Check for a valid domain */ - if (grmod_req->infp_req->domain == NULL) { - einval_msg = talloc_strdup(grmod_req, "Invalid domain."); - goto einval; - } - - /* Check permissions */ - if (!infp_get_permissions(grmod_req->infp_req->caller, - grmod_req->infp_req->domain, - INFP_OBJ_TYPE_GROUP, - arg_group, - INFP_ACTION_TYPE_MODIFY, - INFP_ATTR_TYPE_GROUPID)) goto denied; - - grmod_req->gid = arg_gid; - grmod_req->group_name = talloc_strdup(grmod_req, arg_group); - if (grmod_req->group_name == NULL) { - ret = ENOMEM; - goto error; - } - - ret = sysdb_transaction(grmod_req, - grmod_req->infp_req->infp->sysdb, - infp_do_gid, - grmod_req); - if (ret != EOK) goto error; - - return EOK; - -denied: - reply = dbus_message_new_error(message, DBUS_ERROR_ACCESS_DENIED, NULL); - if(reply == NULL) { - ret = ENOMEM; - goto error; - } - /* send reply */ - sbus_conn_send_reply(sconn, reply); - dbus_message_unref(reply); - - talloc_free(grmod_req); - return EOK; - -einval: - reply = dbus_message_new_error(message, - DBUS_ERROR_INVALID_ARGS, - einval_msg); - if (reply == NULL) { - ret = ENOMEM; - goto error; - } - sbus_conn_send_reply(sconn, reply); - dbus_message_unref(reply); - talloc_free(grmod_req); - return EOK; - -error: - if(grmod_req) infp_return_failure(grmod_req->infp_req, NULL); - talloc_free(grmod_req); - return ret; -} |