From 91cf6f4c6069d6aff01aab171825e83a1a669e2f Mon Sep 17 00:00:00 2001 From: Pavel Březina Date: Sun, 18 May 2014 20:52:42 +0200 Subject: sss_sifp: implement API https://fedorahosted.org/sssd/ticket/2254 Reviewed-by: Sumit Bose --- src/lib/sifp/sss_sifp_utils.c | 117 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 src/lib/sifp/sss_sifp_utils.c (limited to 'src/lib/sifp/sss_sifp_utils.c') diff --git a/src/lib/sifp/sss_sifp_utils.c b/src/lib/sifp/sss_sifp_utils.c new file mode 100644 index 000000000..29cde7ef5 --- /dev/null +++ b/src/lib/sifp/sss_sifp_utils.c @@ -0,0 +1,117 @@ +/* + Authors: + Pavel Březina + + Copyright (C) 2014 Red Hat + + 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 . +*/ + +#include +#include + +#include "lib/sifp/sss_sifp.h" +#include "lib/sifp/sss_sifp_private.h" + +void *sss_sifp_alloc_zero(sss_sifp_ctx *ctx, size_t size, size_t num) +{ + void *addr = ctx->alloc_fn(size * num, ctx->alloc_pvt); + + if (addr == NULL) { + return NULL; + } + + memset(addr, '\0', size * num); + + return addr; +} + +void sss_sifp_set_io_error(sss_sifp_ctx *ctx, DBusError *error) +{ + dbus_error_free(ctx->io_error); + dbus_error_init(ctx->io_error); + dbus_set_error(ctx->io_error, error->name, error->message); +} + +const char * +sss_sifp_get_iface_for_object(const char *object_path) +{ + int i; + const char *path; + static struct { + const char *path; + const char *iface; + } known_types[] = { + {SSS_SIFP_PATH_IFP "/Components/", SSS_SIFP_IFACE_COMPONENTS}, + {SSS_SIFP_PATH_IFP "/Domains/", SSS_SIFP_IFACE_DOMAINS}, + {SSS_SIFP_PATH_IFP "/Services/", SSS_SIFP_IFACE_SERVICES}, + {SSS_SIFP_PATH_IFP "/Users/", SSS_SIFP_IFACE_USERS}, + {SSS_SIFP_PATH_IFP "/Groups/", SSS_SIFP_IFACE_GROUPS}, + {NULL, NULL} + }; + + for (i = 0; known_types[i].path != NULL; i++) { + path = known_types[i].path; + if (strncmp(path, object_path, strlen(path)) == 0) { + return known_types[i].iface; + } + } + + return NULL; +} + +char * sss_sifp_strdup(sss_sifp_ctx *ctx, const char *str) +{ + char *result = NULL; + size_t str_len; + + if (str == NULL) { + return NULL; + } + + str_len = strlen(str); + result = _alloc_zero(ctx, char, str_len + 1); + if (result == NULL) { + return NULL; + } + + strncpy(result, str, str_len); + + return result; +} + +char * sss_sifp_strcat(sss_sifp_ctx *ctx, const char *str1, const char *str2) +{ + char *result = NULL; + + if (str1 == NULL) { + return sss_sifp_strdup(ctx, str2); + } + + if (str2 == NULL) { + return sss_sifp_strdup(ctx, str1); + } + + size_t len = strlen(str1) + strlen(str2) + 1; + + result = _alloc_zero(ctx, char, len); + if (result == NULL) { + return NULL; + } + + strcat(result, str1); + strcat(result, str2); + + return result; +} -- cgit