Author: delphij
Date: Fri Jan 23 00:40:43 2015
New Revision: 277552
URL: https://svnweb.freebsd.org/changeset/base/277552

Log:
  MFC r275579: MFV r275537:
  
  Illumos issue:
     5316 allow smbadm join to use RPC
  
  (Due to our lack of smbsrv this is mostly no-op on
  FreeBSD)

Modified:
  stable/10/cddl/contrib/opensolaris/cmd/zfs/zfs_main.c
  stable/10/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/cddl/contrib/opensolaris/cmd/zfs/zfs_main.c
==============================================================================
--- stable/10/cddl/contrib/opensolaris/cmd/zfs/zfs_main.c       Fri Jan 23 
00:36:17 2015        (r277551)
+++ stable/10/cddl/contrib/opensolaris/cmd/zfs/zfs_main.c       Fri Jan 23 
00:40:43 2015        (r277552)
@@ -68,6 +68,7 @@
 #ifdef sun
 #include <aclutils.h>
 #include <directory.h>
+#include <idmap.h>
 #endif
 
 #include "zfs_iter.h"
@@ -2390,10 +2391,9 @@ userspace_cb(void *arg, const char *doma
                /* SMB */
                char sid[ZFS_MAXNAMELEN + 32];
                uid_t id;
-               uint64_t classes;
 #ifdef sun
                int err;
-               directory_error_t e;
+               int flag = IDMAP_REQ_FLG_USE_CACHE;
 #endif
 
                smbentity = B_TRUE;
@@ -2416,10 +2416,13 @@ userspace_cb(void *arg, const char *doma
                if (err == 0) {
                        rid = id;
                        if (!cb->cb_sid2posix) {
-                               e = directory_name_from_sid(NULL, sid, &name,
-                                   &classes);
-                               if (e != NULL)
-                                       directory_error_free(e);
+                               if (type == USTYPE_SMB_USR) {
+                                       (void) idmap_getwinnamebyuid(rid, flag,
+                                           &name, NULL);
+                               } else {
+                                       (void) idmap_getwinnamebygid(rid, flag,
+                                           &name, NULL);
+                               }
                                if (name == NULL)
                                        name = sid;
                        }

Modified: stable/10/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c
==============================================================================
--- stable/10/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c       
Fri Jan 23 00:36:17 2015        (r277551)
+++ stable/10/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c       
Fri Jan 23 00:40:43 2015        (r277552)
@@ -2609,7 +2609,7 @@ userquota_propname_decode(const char *pr
        boolean_t isuser;
 
        domain[0] = '\0';
-
+       *ridp = 0;
        /* Figure out the property type ({user|group}{quota|space}) */
        for (type = 0; type < ZFS_NUM_USERQUOTA_PROPS; type++) {
                if (strncmp(propname, zfs_userquota_prop_prefixes[type],
@@ -2631,23 +2631,46 @@ userquota_propname_decode(const char *pr
                 * It's a SID name (eg "user@domain") that needs to be
                 * turned into S-1-domainID-RID.
                 */
-               directory_error_t e;
+               int flag = 0;
+               idmap_stat stat, map_stat;
+               uid_t pid;
+               idmap_rid_t rid;
+               idmap_get_handle_t *gh = NULL;
+
+               stat = idmap_get_create(&gh);
+               if (stat != IDMAP_SUCCESS) {
+                       idmap_get_destroy(gh);
+                       return (ENOMEM);
+               }
                if (zoned && getzoneid() == GLOBAL_ZONEID)
                        return (ENOENT);
                if (isuser) {
-                       e = directory_sid_from_user_name(NULL,
-                           cp, &numericsid);
+                       stat = idmap_getuidbywinname(cp, NULL, flag, &pid);
+                       if (stat < 0)
+                               return (ENOENT);
+                       stat = idmap_get_sidbyuid(gh, pid, flag, &numericsid,
+                           &rid, &map_stat);
                } else {
-                       e = directory_sid_from_group_name(NULL,
-                           cp, &numericsid);
+                       stat = idmap_getgidbywinname(cp, NULL, flag, &pid);
+                       if (stat < 0)
+                               return (ENOENT);
+                       stat = idmap_get_sidbygid(gh, pid, flag, &numericsid,
+                           &rid, &map_stat);
+               }
+               if (stat < 0) {
+                       idmap_get_destroy(gh);
+                       return (ENOENT);
                }
-               if (e != NULL) {
-                       directory_error_free(e);
+               stat = idmap_get_mappings(gh);
+               idmap_get_destroy(gh);
+
+               if (stat < 0) {
                        return (ENOENT);
                }
                if (numericsid == NULL)
                        return (ENOENT);
                cp = numericsid;
+               *ridp = rid;
                /* will be further decoded below */
 #else  /* !sun */
                return (ENOENT);
@@ -2657,12 +2680,15 @@ userquota_propname_decode(const char *pr
        if (strncmp(cp, "S-1-", 4) == 0) {
                /* It's a numeric SID (eg "S-1-234-567-89") */
                (void) strlcpy(domain, cp, domainlen);
-               cp = strrchr(domain, '-');
-               *cp = '\0';
-               cp++;
-
                errno = 0;
-               *ridp = strtoull(cp, &end, 10);
+               if (*ridp == 0) {
+                       cp = strrchr(domain, '-');
+                       *cp = '\0';
+                       cp++;
+                       *ridp = strtoull(cp, &end, 10);
+               } else {
+                       end = "";
+               }
                if (numericsid) {
                        free(numericsid);
                        numericsid = NULL;
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to