summaryrefslogtreecommitdiff
path: root/usr/src/lib/smbsrv/libsmb/common/smb_privilege.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/smbsrv/libsmb/common/smb_privilege.c')
-rw-r--r--usr/src/lib/smbsrv/libsmb/common/smb_privilege.c44
1 files changed, 30 insertions, 14 deletions
diff --git a/usr/src/lib/smbsrv/libsmb/common/smb_privilege.c b/usr/src/lib/smbsrv/libsmb/common/smb_privilege.c
index ce7cef198a..be8853f4bc 100644
--- a/usr/src/lib/smbsrv/libsmb/common/smb_privilege.c
+++ b/usr/src/lib/smbsrv/libsmb/common/smb_privilege.c
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -41,9 +41,6 @@
#include <smbsrv/libsmb.h>
#include <smbsrv/smb_privilege.h>
-#define SMB_PRIV_MIN 2
-#define SMB_PRIV_MAX 24
-
static char *smb_priv_getname(uint32_t id);
/*
@@ -98,7 +95,7 @@ smb_priv_presentable_num()
int i, num;
num = 0;
- for (i = SMB_PRIV_MIN; i <= SMB_PRIV_MAX; i++)
+ for (i = SE_MIN_LUID; i <= SE_MAX_LUID; i++)
if (priv_table[i].flags == PF_PRESENTABLE)
num++;
@@ -119,7 +116,7 @@ smb_priv_presentable_ids(uint32_t *ids, int num)
if (ids == NULL || num <= 0)
return (0);
- for (i = SMB_PRIV_MIN, j = 0; i <= SMB_PRIV_MAX; i++)
+ for (i = SE_MIN_LUID, j = 0; i <= SE_MAX_LUID; i++)
if (priv_table[i].flags == PF_PRESENTABLE)
ids[j++] = priv_table[i].id;
@@ -135,7 +132,7 @@ smb_priv_presentable_ids(uint32_t *ids, int num)
smb_privinfo_t *
smb_priv_getbyvalue(uint32_t id)
{
- if (id < SMB_PRIV_MIN || id > SMB_PRIV_MAX)
+ if (id < SE_MIN_LUID || id > SE_MAX_LUID)
return (0);
return (&priv_table[id]);
@@ -157,7 +154,7 @@ smb_priv_getbyname(char *name)
if (name == 0)
return (0);
- for (i = SMB_PRIV_MIN; i <= SMB_PRIV_MAX; ++i) {
+ for (i = SE_MIN_LUID; i <= SE_MAX_LUID; ++i) {
entry = &priv_table[i];
if (utf8_strcasecmp(name, entry->name) == 0)
@@ -176,7 +173,7 @@ smb_priv_getbyname(char *name)
int
smb_privset_size()
{
- int pcnt = SMB_PRIV_MAX - SMB_PRIV_MIN + 1;
+ int pcnt = SE_MAX_LUID - SE_MIN_LUID + 1;
return (2 * sizeof (uint32_t) +
pcnt * sizeof (smb_luid_attrs_t));
@@ -198,7 +195,7 @@ smb_privset_validate(smb_privset_t *privset)
return (0);
}
- count = SMB_PRIV_MAX - SMB_PRIV_MIN + 1;
+ count = SE_MAX_LUID - SE_MIN_LUID + 1;
if (privset->priv_cnt != count) {
return (0);
@@ -210,7 +207,7 @@ smb_privset_validate(smb_privset_t *privset)
}
if (privset->priv[i].luid.lo_part !=
- i + SMB_PRIV_MIN) {
+ i + SE_MIN_LUID) {
return (0);
}
}
@@ -232,13 +229,13 @@ smb_privset_init(smb_privset_t *privset)
if (privset == 0)
return;
- count = SMB_PRIV_MAX - SMB_PRIV_MIN + 1;
+ count = SE_MAX_LUID - SE_MIN_LUID + 1;
privset->priv_cnt = count;
privset->control = 0;
for (i = 0; i < count; i++) {
privset->priv[i].luid.hi_part = 0;
- privset->priv[i].luid.lo_part = i + SMB_PRIV_MIN;
+ privset->priv[i].luid.lo_part = i + SE_MIN_LUID;
privset->priv[i].attrs = 0;
}
}
@@ -280,6 +277,25 @@ smb_privset_copy(smb_privset_t *dst, smb_privset_t *src)
}
/*
+ * smb_privset_merge
+ *
+ * Enable the privileges that are enabled in src in dst
+ */
+void
+smb_privset_merge(smb_privset_t *dst, smb_privset_t *src)
+{
+ int i;
+
+ if (src == NULL || dst == NULL)
+ return;
+
+ for (i = 0; i < src->priv_cnt; i++) {
+ if (src->priv[i].attrs == SE_PRIVILEGE_ENABLED)
+ smb_privset_enable(dst, src->priv[i].luid.lo_part);
+ }
+}
+
+/*
* smb_privset_free
*
* This will free the memory allocated by the 'privset'.
@@ -354,7 +370,7 @@ smb_privset_query(smb_privset_t *privset, uint32_t id)
static char *
smb_priv_getname(uint32_t id)
{
- if (id < SMB_PRIV_MIN || id > SMB_PRIV_MAX)
+ if (id < SE_MIN_LUID || id > SE_MAX_LUID)
return ("Unknown Privilege");
return (priv_table[id].name);