summaryrefslogtreecommitdiff
path: root/usr/src/lib/libsmbfs/smb/acl_conv.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libsmbfs/smb/acl_conv.c')
-rw-r--r--usr/src/lib/libsmbfs/smb/acl_conv.c942
1 files changed, 0 insertions, 942 deletions
diff --git a/usr/src/lib/libsmbfs/smb/acl_conv.c b/usr/src/lib/libsmbfs/smb/acl_conv.c
deleted file mode 100644
index d19b323dfe..0000000000
--- a/usr/src/lib/libsmbfs/smb/acl_conv.c
+++ /dev/null
@@ -1,942 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-
-/*
- * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-/*
- * ACL support for smbfs
- *
- * May want to move some of this to usr/src/common
- * and compile with the smbfs kmod too, once we
- * implement VOP_GETSECATTR, VOP_SETSECATTR.
- */
-
-#include <sys/types.h>
-#include <sys/errno.h>
-#include <sys/cred.h>
-#include <sys/cmn_err.h>
-#include <sys/kmem.h>
-#include <sys/sunddi.h>
-#include <sys/acl.h>
-#include <sys/vnode.h>
-#include <sys/vfs.h>
-#include <sys/byteorder.h>
-
-#include <errno.h>
-#include <stdio.h>
-#include <string.h>
-#include <strings.h>
-#include <unistd.h>
-
-#include <umem.h>
-#include <idmap.h>
-
-#include <sys/fs/smbfs_ioctl.h>
-
-#include <netsmb/mchain.h>
-#include <netsmb/smb.h>
-
-#include <netsmb/smb_lib.h>
-#include <netsmb/smbfs_acl.h>
-
-#include "acl_nt.h"
-#include "private.h"
-
-#ifdef _KERNEL
-#define MALLOC(size) kmem_alloc(size, KM_SLEEP)
-#define FREESZ(p, sz) kmem_free(p, sz)
-#else /* _KERNEL */
-#define MALLOC(size) malloc(size)
-#ifndef lint
-#define FREESZ(p, sz) free(p)
-#else /* lint */
-/* ARGSUSED */
-static void
-FREESZ(void *p, size_t sz)
-{
- free(p);
-}
-#endif /* lint */
-#endif /* _KERNEL */
-
-
-#define ERRCHK(expr) if ((error = expr) != 0) goto errout
-
-/*
- * Security IDentifier (SID)
- */
-static void
-ifree_sid(i_ntsid_t *sid)
-{
- size_t sz;
-
- if (sid == NULL)
- return;
-
- sz = I_SID_SIZE(sid->sid_subauthcount);
- FREESZ(sid, sz);
-}
-
-static int
-mb_get_sid(mbdata_t *mbp, i_ntsid_t **sidp)
-{
- i_ntsid_t *sid = NULL;
- uint8_t revision, subauthcount;
- uint32_t *subauthp;
- size_t sidsz;
- int error, i;
-
- if ((error = mb_get_uint8(mbp, &revision)) != 0)
- return (error);
- if ((error = mb_get_uint8(mbp, &subauthcount)) != 0)
- return (error);
-
- sidsz = I_SID_SIZE(subauthcount);
-
- if ((sid = MALLOC(sidsz)) == NULL)
- return (ENOMEM);
-
- bzero(sid, sidsz);
- sid->sid_revision = revision;
- sid->sid_subauthcount = subauthcount;
- ERRCHK(mb_get_mem(mbp, (char *)sid->sid_authority, 6));
-
- subauthp = &sid->sid_subauthvec[0];
- for (i = 0; i < subauthcount; i++) {
- ERRCHK(mb_get_uint32le(mbp, subauthp));
- subauthp++;
- }
-
- /* Success! */
- *sidp = sid;
- return (0);
-
-errout:
- ifree_sid(sid);
- return (error);
-}
-
-static int
-mb_put_sid(mbdata_t *mbp, i_ntsid_t *sid)
-{
- uint32_t *subauthp;
- int error, i;
-
- if (sid == NULL)
- return (EINVAL);
-
- ERRCHK(mb_put_uint8(mbp, sid->sid_revision));
- ERRCHK(mb_put_uint8(mbp, sid->sid_subauthcount));
- ERRCHK(mb_put_mem(mbp, (char *)sid->sid_authority, 6));
-
- subauthp = &sid->sid_subauthvec[0];
- for (i = 0; i < sid->sid_subauthcount; i++) {
- ERRCHK(mb_put_uint32le(mbp, *subauthp));
- subauthp++;
- }
-
- /* Success! */
- return (0);
-
-errout:
- return (error);
-}
-
-
-/*
- * Access Control Entry (ACE)
- */
-static void
-ifree_ace(i_ntace_t *ace)
-{
-
- if (ace == NULL)
- return;
-
- ifree_sid(ace->ace_sid);
- FREESZ(ace, sizeof (*ace));
-}
-
-static int
-mb_get_ace(mbdata_t *mbp, i_ntace_t **acep)
-{
- mbdata_t tmp_mb;
- i_ntace_t *ace = NULL;
- uint16_t ace_len;
- int error;
-
- if ((ace = MALLOC(sizeof (*ace))) == NULL)
- return (ENOMEM);
- bzero(ace, sizeof (*ace));
-
- /*
- * The ACE is realy variable length,
- * with format determined by the type.
- * XXX: This only decodes types 0-7
- *
- * There may also be padding after it, so
- * decode the using a copy of the mbdata,
- * and then consume the specified length.
- */
- tmp_mb = *mbp;
-
- /* Fixed-size header */
- ERRCHK(mb_get_uint8(&tmp_mb, &ace->ace_type));
- ERRCHK(mb_get_uint8(&tmp_mb, &ace->ace_flags));
- ERRCHK(mb_get_uint16le(&tmp_mb, &ace_len));
-
- /* Variable-size body */
- ERRCHK(mb_get_uint32le(&tmp_mb, &ace->ace_rights));
- ERRCHK(mb_get_sid(&tmp_mb, &ace->ace_sid));
-
- /* Now actually consume ace_len */
- ERRCHK(mb_get_mem(mbp, NULL, ace_len));
-
- /* Success! */
- *acep = ace;
- return (0);
-
-errout:
- ifree_ace(ace);
- return (error);
-}
-
-static int
-mb_put_ace(mbdata_t *mbp, i_ntace_t *ace)
-{
- int cnt0, error;
- uint16_t ace_len, *ace_len_p;
-
- if (ace == NULL)
- return (EINVAL);
-
- cnt0 = mbp->mb_count;
-
- ERRCHK(mb_put_uint8(mbp, ace->ace_type));
- ERRCHK(mb_put_uint8(mbp, ace->ace_flags));
- ERRCHK(mb_fit(mbp, 2, (char **)&ace_len_p));
- ERRCHK(mb_put_uint32le(mbp, ace->ace_rights));
-
- ERRCHK(mb_put_sid(mbp, ace->ace_sid));
-
- ace_len = mbp->mb_count - cnt0;
- *ace_len_p = htoles(ace_len);
-
- /* Success! */
- return (0);
-
-errout:
- return (error);
-}
-
-
-/*
- * Access Control List (ACL)
- */
-
-/* Not an OTW structure, so size can be at our convenience. */
-#define I_ACL_SIZE(cnt) (sizeof (i_ntacl_t) + (cnt) * sizeof (void *))
-
-static void
-ifree_acl(i_ntacl_t *acl)
-{
- i_ntace_t **acep;
- size_t sz;
- int i;
-
- if (acl == NULL)
- return;
-
- acep = &acl->acl_acevec[0];
- for (i = 0; i < acl->acl_acecount; i++) {
- ifree_ace(*acep);
- acep++;
- }
- sz = I_ACL_SIZE(acl->acl_acecount);
- FREESZ(acl, sz);
-}
-
-static int
-mb_get_acl(mbdata_t *mbp, i_ntacl_t **aclp)
-{
- i_ntacl_t *acl = NULL;
- i_ntace_t **acep;
- uint8_t revision;
- uint16_t acl_len, acecount;
- size_t aclsz;
- int i, error;
-
- if ((error = mb_get_uint8(mbp, &revision)) != 0)
- return (error);
- if ((error = mb_get_uint8(mbp, NULL)) != 0)
- return (error);
- if ((error = mb_get_uint16le(mbp, &acl_len)) != 0)
- return (error);
- if ((error = mb_get_uint16le(mbp, &acecount)) != 0)
- return (error);
- if ((error = mb_get_uint16(mbp, NULL)) != 0)
- return (error);
-
- aclsz = I_ACL_SIZE(acecount);
- if ((acl = MALLOC(aclsz)) == NULL)
- return (ENOMEM);
- bzero(acl, aclsz);
- acl->acl_revision = revision;
- acl->acl_acecount = acecount;
-
- acep = &acl->acl_acevec[0];
- for (i = 0; i < acl->acl_acecount; i++) {
- ERRCHK(mb_get_ace(mbp, acep));
- acep++;
- }
- /*
- * There may be more data here, but
- * the caller takes care of that.
- */
-
- /* Success! */
- *aclp = acl;
- return (0);
-
-errout:
- ifree_acl(acl);
- return (error);
-}
-
-static int
-mb_put_acl(mbdata_t *mbp, i_ntacl_t *acl)
-{
- i_ntace_t **acep;
- uint16_t acl_len, *acl_len_p;
- int i, cnt0, error;
-
- cnt0 = mbp->mb_count;
-
- ERRCHK(mb_put_uint8(mbp, acl->acl_revision));
- ERRCHK(mb_put_uint8(mbp, 0)); /* pad1 */
- ERRCHK(mb_fit(mbp, 2, (char **)&acl_len_p));
- ERRCHK(mb_put_uint16le(mbp, acl->acl_acecount));
- ERRCHK(mb_put_uint16le(mbp, 0)); /* pad2 */
-
- acep = &acl->acl_acevec[0];
- for (i = 0; i < acl->acl_acecount; i++) {
- ERRCHK(mb_put_ace(mbp, *acep));
- acep++;
- }
-
- /* Fill in acl_len_p */
- acl_len = mbp->mb_count - cnt0;
- *acl_len_p = htoles(acl_len);
-
- /* Success! */
- return (0);
-
-errout:
- return (error);
-}
-
-
-/*
- * Security Descriptor
- */
-void
-smbfs_acl_free_sd(i_ntsd_t *sd)
-{
-
- if (sd == NULL)
- return;
-
- ifree_sid(sd->sd_owner);
- ifree_sid(sd->sd_group);
- ifree_acl(sd->sd_sacl);
- ifree_acl(sd->sd_dacl);
-
- FREESZ(sd, sizeof (*sd));
-}
-
-/*
- * Import a raw SD (mb chain) into "internal" form.
- * (like "absolute" form per. NT docs)
- * Returns allocated data in sdp
- *
- * Note: does NOT consume all the mbp data, so the
- * caller has to take care of that if necessary.
- */
-int
-mb_get_ntsd(mbdata_t *mbp, i_ntsd_t **sdp)
-{
- i_ntsd_t *sd = NULL;
- mbdata_t top_mb, tmp_mb;
- uint32_t owneroff, groupoff, sacloff, dacloff;
- int error;
-
- if ((sd = MALLOC(sizeof (*sd))) == NULL)
- return (ENOMEM);
- bzero(sd, sizeof (*sd));
-
- /*
- * Offsets below are relative to this point,
- * so save the mbp state for use below.
- */
- top_mb = *mbp;
-
- ERRCHK(mb_get_uint8(mbp, &sd->sd_revision));
- ERRCHK(mb_get_uint8(mbp, NULL));
- ERRCHK(mb_get_uint16le(mbp, &sd->sd_flags));
- ERRCHK(mb_get_uint32le(mbp, &owneroff));
- ERRCHK(mb_get_uint32le(mbp, &groupoff));
- ERRCHK(mb_get_uint32le(mbp, &sacloff));
- ERRCHK(mb_get_uint32le(mbp, &dacloff));
-
- /*
- * For each section make a temporary copy of the
- * top_mb state, advance to the given offset, and
- * pass that to the lower mb_get_xxx functions.
- * These could be marshalled in any order, but
- * are normally found in the order shown here.
- */
- if (sacloff) {
- tmp_mb = top_mb;
- mb_get_mem(&tmp_mb, NULL, sacloff);
- ERRCHK(mb_get_acl(&tmp_mb, &sd->sd_sacl));
- }
- if (dacloff) {
- tmp_mb = top_mb;
- mb_get_mem(&tmp_mb, NULL, dacloff);
- ERRCHK(mb_get_acl(&tmp_mb, &sd->sd_dacl));
- }
- if (owneroff) {
- tmp_mb = top_mb;
- mb_get_mem(&tmp_mb, NULL, owneroff);
- ERRCHK(mb_get_sid(&tmp_mb, &sd->sd_owner));
- }
- if (groupoff) {
- tmp_mb = top_mb;
- mb_get_mem(&tmp_mb, NULL, groupoff);
- ERRCHK(mb_get_sid(&tmp_mb, &sd->sd_group));
- }
-
- /* Success! */
- *sdp = sd;
- return (0);
-
-errout:
- smbfs_acl_free_sd(sd);
- return (error);
-}
-
-/*
- * Export an "internal" SD into an raw SD (mb chain).
- * (a.k.a "self-relative" form per. NT docs)
- * Returns allocated mbchain in mbp.
- */
-int
-mb_put_ntsd(mbdata_t *mbp, i_ntsd_t *sd)
-{
- uint32_t *owneroffp, *groupoffp, *sacloffp, *dacloffp;
- uint32_t owneroff, groupoff, sacloff, dacloff;
- int cnt0, error;
-
- cnt0 = mbp->mb_count;
- owneroff = groupoff = sacloff = dacloff = 0;
-
- ERRCHK(mb_put_uint8(mbp, sd->sd_revision));
- ERRCHK(mb_put_uint8(mbp, 0)); /* pad1 */
- ERRCHK(mb_put_uint16le(mbp, sd->sd_flags));
- ERRCHK(mb_fit(mbp, 4, (char **)&owneroffp));
- ERRCHK(mb_fit(mbp, 4, (char **)&groupoffp));
- ERRCHK(mb_fit(mbp, 4, (char **)&sacloffp));
- ERRCHK(mb_fit(mbp, 4, (char **)&dacloffp));
-
- /*
- * These could be marshalled in any order, but
- * are normally found in the order shown here.
- */
- if (sd->sd_sacl) {
- sacloff = mbp->mb_count - cnt0;
- ERRCHK(mb_put_acl(mbp, sd->sd_sacl));
- }
- if (sd->sd_dacl) {
- dacloff = mbp->mb_count - cnt0;
- ERRCHK(mb_put_acl(mbp, sd->sd_dacl));
- }
- if (sd->sd_owner) {
- owneroff = mbp->mb_count - cnt0;
- ERRCHK(mb_put_sid(mbp, sd->sd_owner));
- }
- if (sd->sd_group) {
- groupoff = mbp->mb_count - cnt0;
- ERRCHK(mb_put_sid(mbp, sd->sd_group));
- }
-
- /* Fill in the offsets */
- *owneroffp = htolel(owneroff);
- *groupoffp = htolel(groupoff);
- *sacloffp = htolel(sacloff);
- *dacloffp = htolel(dacloff);
-
- /* Success! */
- return (0);
-
-errout:
- return (error);
-}
-
-
-/*
- * Helper functions for conversion between ZFS-style ACLs
- * and Windows Security Descriptors.
- */
-
-
-/*
- * Convert an NT SID to a string. Optionally return the
- * last sub-authority (or "relative ID" -- RID) in *ridp
- * and truncate the output string after the domain part.
- * If ridp==NULL, the output string is the whole SID,
- * including both the domain and RID.
- *
- * Return length written, or -1 on error.
- */
-int
-smbfs_sid2str(i_ntsid_t *sid,
- char *obuf, size_t osz, uint32_t *ridp)
-{
- char *s = obuf;
- uint64_t auth = 0;
- uint_t i, n;
- uint32_t subs, *ip;
-
- n = snprintf(s, osz, "S-%u", sid->sid_revision);
- if (n > osz)
- return (-1);
- s += n; osz -= n;
-
- for (i = 0; i < 6; i++)
- auth = (auth << 8) | sid->sid_authority[i];
- n = snprintf(s, osz, "-%llu", auth);
- if (n > osz)
- return (-1);
- s += n; osz -= n;
-
- subs = sid->sid_subauthcount;
- if (subs < 1 || subs > 15)
- return (-1);
- if (ridp)
- subs--;
-
- ip = &sid->sid_subauthvec[0];
- for (; subs; subs--, ip++) {
- n = snprintf(s, osz, "-%u", *ip);
- if (n > osz)
- return (-1);
- s += n; osz -= n;
- }
- if (ridp)
- *ridp = *ip;
-
- return (s - obuf);
-}
-
-/*
- * Our interface to the idmap service.
- */
-
-#ifdef _KERNEL
-#define I_GetPidBySid kidmap_batch_getpidbysid
-#define I_GetMappings kidmap_get_mappings
-#else /* _KERNEL */
-#define I_GetPidBySid idmap_get_pidbysid
-#define I_GetMappings idmap_get_mappings
-#endif /* _KERNEL */
-
-struct mapinfo {
- uid_t mi_uid; /* or gid */
- int mi_isuser;
- idmap_stat mi_status;
-};
-
-/*
- * A special value for mi_isuser (above) to indicate
- * that the SID is the well-known "Everyone" (S-1-1-0).
- * The idmap library only uses -1, 0, 1, so this value
- * is arbitrary but must not overlap w/ idmap values.
- * XXX: Could use a way for idmap to tell us when
- * it recognizes this well-known SID.
- */
-#define IS_WKSID_EVERYONE 11
-
-/*
- * Build an idmap request. Cleanup is
- * handled by the caller (error or not)
- */
-static int
-mkrq_idmap_sid2ux(
- idmap_get_handle_t *idmap_gh,
- i_ntsid_t *sid,
- struct mapinfo *mip)
-{
- char sid_prefix[256];
- uint32_t rid;
- idmap_stat idms;
-
- if (smbfs_sid2str(sid, sid_prefix, sizeof (sid_prefix), &rid) < 0)
- return (EINVAL);
-
- /*
- * Give the "Everyone" group special treatment.
- */
- if (strcmp(sid_prefix, "S-1-1") == 0 && rid == 0) {
- /* This is "Everyone" */
- mip->mi_uid = (uid_t)-1;
- mip->mi_isuser = IS_WKSID_EVERYONE;
- mip->mi_status = 0;
- return (0);
- }
-
- idms = I_GetPidBySid(idmap_gh, sid_prefix, rid, 0,
- &mip->mi_uid, &mip->mi_isuser, &mip->mi_status);
- if (idms != IDMAP_SUCCESS)
- return (EINVAL);
-
- return (0);
-}
-
-static void
-ntace2zace(ace_t *zacep, i_ntace_t *ntace, struct mapinfo *mip)
-{
- uint32_t zamask;
- uint16_t zflags, ntflags;
- uint8_t zatype = ntace->ace_type;
-
- /*
- * Translate NT ACE flags to ZFS ACE flags.
- * The low four bits are the same, but not
- * others: INHERITED_ACE_FLAG, etc.
- */
- ntflags = ntace->ace_flags;
- zflags = 0;
-
- if (ntflags & OBJECT_INHERIT_ACE_FLAG)
- zflags |= ACE_FILE_INHERIT_ACE;
- if (ntflags & CONTAINER_INHERIT_ACE_FLAG)
- zflags |= ACE_DIRECTORY_INHERIT_ACE;
- if (ntflags & NO_PROPAGATE_INHERIT_ACE_FLAG)
- zflags |= ACE_NO_PROPAGATE_INHERIT_ACE;
- if (ntflags & INHERIT_ONLY_ACE_FLAG)
- zflags |= ACE_INHERIT_ONLY_ACE;
- if (ntflags & INHERITED_ACE_FLAG)
- zflags |= ACE_INHERITED_ACE;
-
- if (ntflags & SUCCESSFUL_ACCESS_ACE_FLAG)
- zflags |= ACE_SUCCESSFUL_ACCESS_ACE_FLAG;
- if (ntflags & FAILED_ACCESS_ACE_FLAG)
- zflags |= ACE_FAILED_ACCESS_ACE_FLAG;
-
- /*
- * Add the "ID type" flags to the ZFS ace flags.
- * Would be nice if the idmap header defined some
- * manifest constants for these "isuser" values.
- */
- switch (mip->mi_isuser) {
- case IS_WKSID_EVERYONE:
- zflags |= ACE_EVERYONE;
- break;
- case 0: /* it's a GID */
- zflags |= ACE_IDENTIFIER_GROUP;
- break;
- default:
- case 1: /* it's a UID */
- break;
- }
-
- /*
- * The access mask bits are the same, but
- * mask off any bits we don't expect.
- * Should not see any GENERIC_xxx flags,
- * as those are only valid in requested
- * access masks, not ACLs. But if we do,
- * get those, silently clear them here.
- */
- zamask = ntace->ace_rights & ACE_ALL_PERMS;
-
- /*
- * Verify that it's a known ACE type.
- * Only handle the types that appear in
- * V2, V3, V4 ACLs for now. Avoid failing
- * the whole conversion if we get unknown
- * ace types, but convert them to something
- * that will have no effect on access.
- */
- if (zatype > SYSTEM_ALARM_OBJECT_ACE_TYPE) {
- zatype = ACCESS_ALLOWED_ACE_TYPE;
- zamask = 0; /* harmless */
- }
-
- /*
- * Fill in the ZFS-style ACE
- */
- zacep->a_who = mip->mi_uid; /* from ace_sid */
- zacep->a_access_mask = zamask;
- zacep->a_flags = zflags;
- zacep->a_type = zatype;
-}
-
-/*
- * Convert an internal SD to a ZFS-style ACL.
- * Note optional args: vsa/acl, uidp, gidp.
- */
-int
-smbfs_acl_sd2zfs(
- i_ntsd_t *sd,
-#ifdef _KERNEL
- vsecattr_t *acl_info,
-#else /* _KERNEL */
- acl_t *acl_info,
-#endif /* _KERNEL */
- uid_t *uidp, gid_t *gidp)
-{
- struct mapinfo *mip, *mapinfo = NULL;
- int error, i, mapcnt, zacecnt, zacl_size;
- ace_t *zacep;
- i_ntacl_t *ntacl;
- i_ntace_t **ntacep;
-#ifndef _KERNEL
- idmap_handle_t *idmap_h = NULL;
-#endif /* _KERNEL */
- idmap_get_handle_t *idmap_gh = NULL;
- idmap_stat idms;
-
- /*
- * sanity checks
- */
-#ifndef _KERNEL
- if (acl_info) {
- if (acl_info->acl_type != ACE_T ||
- acl_info->acl_aclp != NULL ||
- acl_info->acl_entry_size != sizeof (ace_t))
- return (EINVAL);
- }
-#endif /* _KERNEL */
-
- /*
- * First, get all the SID mappings.
- * How many?
- */
- mapcnt = 0;
- if (sd->sd_owner)
- mapcnt++;
- if (sd->sd_group)
- mapcnt++;
- if (sd->sd_sacl)
- mapcnt += sd->sd_sacl->acl_acecount;
- if (sd->sd_dacl)
- mapcnt += sd->sd_dacl->acl_acecount;
- if (mapcnt == 0)
- return (EINVAL);
-
- mapinfo = MALLOC(mapcnt * sizeof (*mapinfo));
- if (mapinfo == NULL) {
- error = ENOMEM;
- goto errout;
- }
- bzero(mapinfo, mapcnt * sizeof (*mapinfo));
-
-
- /*
- * Build our request to the idmap deamon.
- */
-#ifdef _KERNEL
- idmap_gh = kidmap_get_create(curproc->p_zone);
-#else /* _KERNEL */
- idms = idmap_init(&idmap_h);
- if (idms != IDMAP_SUCCESS) {
- error = ENOTACTIVE;
- goto errout;
- }
- idms = idmap_get_create(idmap_h, &idmap_gh);
- if (idms != IDMAP_SUCCESS) {
- error = ENOTACTIVE;
- goto errout;
- }
-#endif /* _KERNEL */
-
- mip = mapinfo;
- if (sd->sd_owner) {
- error = mkrq_idmap_sid2ux(
- idmap_gh, sd->sd_owner, mip);
- if (error)
- goto errout;
- mip++;
- }
- if (sd->sd_group) {
- error = mkrq_idmap_sid2ux(
- idmap_gh, sd->sd_group, mip);
- if (error)
- goto errout;
- mip++;
- }
- if (sd->sd_sacl) {
- ntacl = sd->sd_sacl;
- ntacep = &ntacl->acl_acevec[0];
- for (i = 0; i < ntacl->acl_acecount; i++) {
- error = mkrq_idmap_sid2ux(
- idmap_gh, (*ntacep)->ace_sid, mip);
- if (error)
- goto errout;
- ntacep++;
- mip++;
- }
- }
- if (sd->sd_dacl) {
- ntacl = sd->sd_dacl;
- ntacep = &ntacl->acl_acevec[0];
- for (i = 0; i < ntacl->acl_acecount; i++) {
- error = mkrq_idmap_sid2ux(
- idmap_gh, (*ntacep)->ace_sid, mip);
- if (error)
- goto errout;
- ntacep++;
- mip++;
- }
- }
-
- idms = I_GetMappings(idmap_gh);
- if (idms != IDMAP_SUCCESS) {
-#ifdef DEBUG
- printf("idmap_get_mappings: rc=%d\n", idms);
-#endif
- /* creative error choice */
- error = EIDRM;
- goto errout;
- }
-
- /*
- * With any luck, we now have Unix user/group IDs
- * for every Windows SID in the security descriptor.
- * The remaining work is just format conversion.
- */
- mip = mapinfo;
- if (sd->sd_owner) {
- if (uidp) {
- if (mip->mi_isuser == 1)
- *uidp = mip->mi_uid;
- else
- *uidp = (uid_t)-1;
- }
- mip++;
- } else {
- if (uidp)
- *uidp = (uid_t)-1;
- }
- if (sd->sd_group) {
- if (gidp) {
- if (mip->mi_isuser == 0)
- *gidp = (gid_t)mip->mi_uid;
- else
- *gidp = (gid_t)-1;
- }
- mip++;
- } else {
- if (gidp)
- *gidp = (gid_t)-1;
- }
-
- if (acl_info == NULL) {
- /* Caller only wanted uid/gid */
- goto ok_out;
- }
-
- /*
- * Build the ZFS-style ACL
- */
- zacecnt = 0;
- if (sd->sd_sacl)
- zacecnt += sd->sd_sacl->acl_acecount;
- if (sd->sd_dacl)
- zacecnt += sd->sd_dacl->acl_acecount;
- zacl_size = zacecnt * sizeof (ace_t);
- zacep = MALLOC(zacl_size);
-#ifdef _KERNEL
- acl_info->vsa_aclentp = zacep;
- acl_info->vsa_aclentsz = zacl_size;
-#else /* _KERNEL */
- if (zacep == NULL) {
- error = ENOMEM;
- goto errout;
- }
- acl_info->acl_cnt = zacecnt;
- acl_info->acl_aclp = zacep;
-#endif /* _KERNEL */
-
- if (sd->sd_sacl) {
- ntacl = sd->sd_sacl;
- ntacep = &ntacl->acl_acevec[0];
- for (i = 0; i < ntacl->acl_acecount; i++) {
- ntace2zace(zacep, *ntacep, mip);
- zacep++;
- ntacep++;
- mip++;
- }
- }
- if (sd->sd_dacl) {
- ntacl = sd->sd_dacl;
- ntacep = &ntacl->acl_acevec[0];
- for (i = 0; i < ntacl->acl_acecount; i++) {
- ntace2zace(zacep, *ntacep, mip);
- zacep++;
- ntacep++;
- mip++;
- }
- }
-
-ok_out:
- error = 0;
-
-errout:
- if (mapinfo)
- FREESZ(mapinfo, mapcnt * sizeof (*mapinfo));
-
- return (error);
-}
-
-
-/*
- * Convert an internal SD to a ZFS-style ACL.
- * Include owner/group too if uid/gid != -1.
- * Note optional arg: vsa/acl
- */
-/*ARGSUSED*/
-int smbfs_acl_zfs2sd(
-#ifdef _KERNEL
- vsecattr_t *vsa,
-#else /* _KERNEL */
- acl_t *acl,
-#endif /* _KERNEL */
- uid_t uid, gid_t gid,
- i_ntsd_t **sdp)
-{
- /* XXX - todo */
- return (ENOSYS);
-}