sss_nss_idmap.c revision 2a9af1f71887f02935e2fb6ad5023afba5b6d43e
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose/*
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose SSSD
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose NSS Responder Interface for ID-SID mappings
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose Authors:
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose Sumit Bose <sbose@redhat.com>
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose Copyright (C) 2013 Red Hat
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose This program is free software; you can redistribute it and/or modify
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose it under the terms of the GNU General Public License as published by
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose the Free Software Foundation; either version 3 of the License, or
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose (at your option) any later version.
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose This program is distributed in the hope that it will be useful,
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose but WITHOUT ANY WARRANTY; without even the implied warranty of
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose GNU General Public License for more details.
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose You should have received a copy of the GNU General Public License
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose along with this program. If not, see <http://www.gnu.org/licenses/>.
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose*/
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose#include <stdlib.h>
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose#include <errno.h>
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose#include <nss.h>
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose#include "sss_client/sss_cli.h"
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose#include "sss_client/idmap/sss_nss_idmap.h"
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose#include "util/strtonum.h"
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose#define DATA_START (3 * sizeof(uint32_t))
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Boseunion input {
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose const char *str;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose uint32_t id;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose};
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bosestruct output {
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose enum sss_id_type type;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose union {
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose char *str;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose uint32_t id;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose } d;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose};
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Boseint nss_status_to_errno(enum nss_status nret) {
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose switch (nret) {
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose case NSS_STATUS_TRYAGAIN:
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose return EAGAIN;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose case NSS_STATUS_SUCCESS:
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose return EOK;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose case NSS_STATUS_UNAVAIL:
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose default:
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose return ENOENT;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose }
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose return EINVAL;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose}
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bosestatic int sss_nss_getyyybyxxx(union input inp, enum sss_cli_command cmd ,
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose struct output *out)
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose{
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose int ret;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose size_t inp_len;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose struct sss_cli_req_data rd;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose uint8_t *repbuf = NULL;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose size_t replen;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose int errnop;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose enum nss_status nret;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose uint32_t num_results;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose char *str = NULL;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose size_t data_len;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose uint32_t c;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose switch (cmd) {
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose case SSS_NSS_GETSIDBYNAME:
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose case SSS_NSS_GETNAMEBYSID:
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose case SSS_NSS_GETIDBYSID:
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose ret = sss_strnlen(inp.str, SSS_NAME_MAX, &inp_len);
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose if (ret != EOK) {
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose return EINVAL;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose }
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose rd.len = inp_len + 1;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose rd.data = inp.str;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose break;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose case SSS_NSS_GETSIDBYID:
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose rd.len = sizeof(uint32_t);
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose rd.data = &inp.id;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose break;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose default:
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose return EINVAL;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose }
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose sss_nss_lock();
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose nret = sss_nss_make_request(cmd, &rd, &repbuf, &replen, &errnop);
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose if (nret != NSS_STATUS_SUCCESS) {
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose ret = nss_status_to_errno(nret);
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose goto done;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose }
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose if (replen < 8) {
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose ret = EBADMSG;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose goto done;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose }
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose num_results = ((uint32_t *)repbuf)[0];
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose if (num_results == 0) {
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose ret = ENOENT;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose goto done;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose } else if (num_results > 1) {
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose ret = EBADMSG;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose goto done;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose }
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose out->type = ((uint32_t *)repbuf)[2];
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose data_len = replen - DATA_START;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose switch(cmd) {
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose case SSS_NSS_GETSIDBYID:
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose case SSS_NSS_GETSIDBYNAME:
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose case SSS_NSS_GETNAMEBYSID:
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose if (data_len <= 1 || repbuf[replen - 1] != '\0') {
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose ret = EBADMSG;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose goto done;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose }
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose str = malloc(sizeof(char) * data_len);
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose if (str == NULL) {
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose ret = ENOMEM;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose goto done;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose }
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose strncpy(str, (char *) repbuf + DATA_START, data_len);
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose out->d.str = str;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose break;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose case SSS_NSS_GETIDBYSID:
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose if (data_len != sizeof(uint32_t)) {
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose ret = EBADMSG;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose goto done;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose }
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose SAFEALIGN_COPY_UINT32(&c, repbuf + DATA_START, NULL);
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose out->d.id = c;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose break;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose default:
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose ret = EINVAL;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose goto done;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose }
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose ret = EOK;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bosedone:
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose sss_nss_unlock();
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose free(repbuf);
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose if (ret != EOK) {
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose free(str);
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose }
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose return ret;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose}
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Boseint sss_nss_getsidbyname(const char *fq_name, char **sid,
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose enum sss_id_type *type)
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose{
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose int ret;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose union input inp;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose struct output out;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose if (sid == NULL || fq_name == NULL || *fq_name == '\0') {
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose return EINVAL;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose }
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose inp.str = fq_name;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose ret = sss_nss_getyyybyxxx(inp, SSS_NSS_GETSIDBYNAME, &out);
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose if (ret == EOK) {
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose *sid = out.d.str;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose *type = out.type;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose }
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose return ret;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose}
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Boseint sss_nss_getsidbyid(uint32_t id, char **sid, enum sss_id_type *type)
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose{
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose int ret;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose union input inp;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose struct output out;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose if (sid == NULL) {
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose return EINVAL;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose }
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose inp.id = id;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose ret = sss_nss_getyyybyxxx(inp, SSS_NSS_GETSIDBYID, &out);
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose if (ret == EOK) {
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose *sid = out.d.str;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose *type = out.type;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose }
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose return ret;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose}
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Boseint sss_nss_getnamebysid(const char *sid, char **fq_name,
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose enum sss_id_type *type)
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose{
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose int ret;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose union input inp;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose struct output out;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose if (fq_name == NULL || sid == NULL || *sid == '\0') {
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose return EINVAL;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose }
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose inp.str = sid;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose ret = sss_nss_getyyybyxxx(inp, SSS_NSS_GETNAMEBYSID, &out);
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose if (ret == EOK) {
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose *fq_name = out.d.str;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose *type = out.type;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose }
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose return ret;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose}
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Boseint sss_nss_getidbysid(const char *sid, uint32_t *id, enum sss_id_type *id_type)
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose{
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose int ret;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose union input inp;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose struct output out;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose if (id == NULL || id_type == NULL || sid == NULL || *sid == '\0') {
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose return EINVAL;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose }
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose inp.str = sid;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose ret = sss_nss_getyyybyxxx(inp, SSS_NSS_GETIDBYSID, &out);
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose if (ret == EOK) {
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose *id = out.d.id;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose *id_type = out.type;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose }
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose return ret;
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose}