summaryrefslogtreecommitdiff
path: root/usr/src/lib/libidmap/common/sidutil.c
diff options
context:
space:
mode:
authorJordan Brown <Jordan.Brown@Sun.COM>2009-07-17 17:54:42 -0700
committerJordan Brown <Jordan.Brown@Sun.COM>2009-07-17 17:54:42 -0700
commit1fcced4c370617db71610fecffd5451a5894ca5e (patch)
tree1a736a20c4d5b0568a7ffe794d8cc9430f44b7c1 /usr/src/lib/libidmap/common/sidutil.c
parent72cedb80b18c5f494100ec9444896ba621609d79 (diff)
downloadillumos-joyent-1fcced4c370617db71610fecffd5451a5894ca5e.tar.gz
6582152 MMC remote service management support
6816841 name <-> SID interfaces 6843330 Create interposer library for SVCCTL and LOGR functionality. 6856791 Files dropped from large directory listing with long filenames 6859346 Query File Information errors when querying a named pipe 6860126 name<->SID interfaces use unacceptable style
Diffstat (limited to 'usr/src/lib/libidmap/common/sidutil.c')
-rw-r--r--usr/src/lib/libidmap/common/sidutil.c189
1 files changed, 189 insertions, 0 deletions
diff --git a/usr/src/lib/libidmap/common/sidutil.c b/usr/src/lib/libidmap/common/sidutil.c
new file mode 100644
index 0000000000..ec81812227
--- /dev/null
+++ b/usr/src/lib/libidmap/common/sidutil.c
@@ -0,0 +1,189 @@
+/*
+ * 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.
+ */
+
+/*
+ * This is an extract from usr/src/common/smbsrv/smb_sid.c,
+ * with functions renamed as part of a tentative plan for convergence.
+ */
+#ifndef _KERNEL
+#include <stdio.h>
+#include <strings.h>
+#include <stdlib.h>
+#include <syslog.h>
+#else /* _KERNEL */
+#include <sys/types.h>
+#include <sys/sunddi.h>
+#endif /* _KERNEL */
+
+#include <sidutil.h>
+
+/*
+ * sid_len
+ *
+ * Returns the number of bytes required to hold the sid.
+ */
+int
+sid_len(sid_t *sid)
+{
+ if (sid == NULL)
+ return (0);
+
+ return (sizeof (sid_t) - sizeof (uint32_t)
+ + (sid->sid_subauthcnt * sizeof (uint32_t)));
+}
+
+/*
+ * sid_tostr
+ *
+ * Fill in the passed buffer with the string form of the given
+ * binary sid.
+ */
+void
+sid_tostr(sid_t *sid, char *strsid)
+{
+ char *p = strsid;
+ int i;
+
+ if (sid == NULL || strsid == NULL)
+ return;
+
+ (void) sprintf(p, "S-%d-", sid->sid_revision);
+ while (*p)
+ p++;
+
+ for (i = 0; i < NT_SID_AUTH_MAX; ++i) {
+ if (sid->sid_authority[i] != 0 || i == NT_SID_AUTH_MAX - 1) {
+ (void) sprintf(p, "%d", sid->sid_authority[i]);
+ while (*p)
+ p++;
+ }
+ }
+
+ for (i = 0; i < sid->sid_subauthcnt && i < NT_SID_SUBAUTH_MAX; ++i) {
+ (void) sprintf(p, "-%u", sid->sid_subauth[i]);
+ while (*p)
+ p++;
+ }
+}
+
+/*
+ * sid_fromstr
+ *
+ * Converts a SID in string form to a SID structure. There are lots of
+ * simplifying assumptions in here. The memory for the SID is allocated
+ * as if it was the largest possible SID; the caller is responsible for
+ * freeing the memory when it is no longer required. We assume that the
+ * string starts with "S-1-" and that the authority is held in the last
+ * byte, which should be okay for most situations. It also assumes the
+ * sub-authorities are in decimal format.
+ *
+ * On success, a pointer to a SID is returned. Otherwise a null pointer
+ * is returned.
+ */
+sid_t *
+sid_fromstr(char *sidstr)
+{
+ sid_t *sid;
+ char *p;
+ int size;
+ uint8_t i;
+
+ if (sidstr == NULL)
+ return (NULL);
+
+ if (strncmp(sidstr, "S-1-", 4) != 0)
+ return (NULL);
+
+ size = sizeof (sid_t) + (NT_SID_SUBAUTH_MAX * sizeof (uint32_t));
+
+ if ((sid = malloc(size)) == NULL)
+ return (NULL);
+
+ bzero(sid, size);
+ sid->sid_revision = NT_SID_REVISION;
+ sid->sid_authority[5] = atoi(&sidstr[4]);
+
+ for (i = 0, p = &sidstr[5]; i < NT_SID_SUBAUTH_MAX && *p; ++i) {
+ while (*p && *p == '-')
+ ++p;
+
+ if (*p < '0' || *p > '9') {
+ free(sid);
+ return (NULL);
+ }
+
+ sid->sid_subauth[i] = strtoul(p, NULL, 10);
+
+ while (*p && *p != '-')
+ ++p;
+ }
+
+ sid->sid_subauthcnt = i;
+ return (sid);
+}
+
+void
+sid_free(sid_t *sid)
+{
+#ifdef _KERNEL
+ if (sid == NULL)
+ return;
+
+ kmem_free(sid, sid_len(sid));
+#else
+ free(sid);
+#endif
+}
+
+void
+sid_to_le(sid_t *sid)
+{
+ int i;
+
+ for (i = 0; i < sid->sid_subauthcnt && i < NT_SID_SUBAUTH_MAX; ++i) {
+ uint32_t v = sid->sid_subauth[i];
+ uint8_t *p = (uint8_t *)&sid->sid_subauth[i];
+
+ p[0] = v & 0xff;
+ p[1] = (v >> 8) & 0xff;
+ p[2] = (v >> 16) & 0xff;
+ p[3] = (v >> 24) & 0xff;
+ }
+}
+
+void
+sid_from_le(sid_t *sid)
+{
+ int i;
+
+ for (i = 0; i < sid->sid_subauthcnt && i < NT_SID_SUBAUTH_MAX; ++i) {
+ uint32_t v;
+ uint8_t *p = (uint8_t *)&sid->sid_subauth[i];
+
+ v = p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24);
+
+ sid->sid_subauth[i] = v;
+ }
+}