static int sss_sid_to_id(struct sssd_ctx *ctx, const char *sid, struct cifs_uxid *cuxid) { int err; enum sss_id_type id_type; err = sss_nss_getidbysid(sid, (uint32_t *)&cuxid->id.uid, &id_type); if (err != 0) { ctx_set_error(ctx, strerror(err)); return -1; } switch (id_type) { case SSS_ID_TYPE_UID: cuxid->type = CIFS_UXID_TYPE_UID; break; case SSS_ID_TYPE_GID: cuxid->type = CIFS_UXID_TYPE_GID; break; case SSS_ID_TYPE_BOTH: cuxid->type = CIFS_UXID_TYPE_BOTH; break; case SSS_ID_TYPE_NOT_SPECIFIED: default: return -1; } return 0; }
wbcErr wbcSidToGid(const struct wbcDomainSid *sid, gid_t *pgid) { int ret; char *sid_str; uint32_t id; enum sss_id_type type; wbcErr wbc_status; wbc_status = wbcSidToString(sid, &sid_str); if (!WBC_ERROR_IS_OK(wbc_status)) { return wbc_status; } ret = sss_nss_getidbysid(sid_str, &id, &type); wbcFreeMemory(sid_str); if (ret != 0) { return WBC_ERR_UNKNOWN_FAILURE; } if (type != SSS_ID_TYPE_GID && type != SSS_ID_TYPE_BOTH) { return WBC_ERR_UNKNOWN_GROUP; } *pgid = (gid_t) id; return WBC_ERR_SUCCESS; }
/* Convert a list of SIDs */ wbcErr wbcSidsToUnixIds(const struct wbcDomainSid *sids, uint32_t num_sids, struct wbcUnixId *ids) { int ret; char *sid_str; uint32_t id; enum sss_id_type type; size_t c; wbcErr wbc_status; for (c = 0; c < num_sids; c++) { wbc_status = wbcSidToString(&sids[c], &sid_str); if (!WBC_ERROR_IS_OK(wbc_status)) { return wbc_status; } ret = sss_nss_getidbysid(sid_str, &id, &type); wbcFreeMemory(sid_str); if (ret != 0) { return WBC_ERR_UNKNOWN_FAILURE; } switch (type) { case SSS_ID_TYPE_UID: ids[c].type = WBC_ID_TYPE_UID; ids[c].id.uid = (uid_t) id; break; case SSS_ID_TYPE_GID: ids[c].type = WBC_ID_TYPE_GID; ids[c].id.gid = (gid_t) id; break; case SSS_ID_TYPE_BOTH: ids[c].type = WBC_ID_TYPE_BOTH; ids[c].id.uid = (uid_t) id; break; default: ids[c].type = WBC_ID_TYPE_NOT_SPECIFIED; } } return WBC_ERR_SUCCESS; }