smb_lgrp.c revision a7fe1d5bb55904d4c79638b8778bc9dd8ed7fd7b
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * CDDL HEADER START
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * The contents of this file are subject to the terms of the
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Common Development and Distribution License (the "License").
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * You may not use this file except in compliance with the License.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * See the License for the specific language governing permissions
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * and limitations under the License.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * When distributing Covered Code, include this CDDL HEADER in each
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * If applicable, add the following below this CDDL HEADER, with the
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * fields enclosed by brackets "[]" replaced with your own identifying
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * information: Portions Copyright [yyyy] [name of copyright owner]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * CDDL HEADER END
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Copyright (c) 2013 RackTop Systems.
#include <synch.h>
#include <grp.h>
#include <assert.h>
#include <libintl.h>
#include <smb_sqlite.h>
#include <libcmdutils.h>
#define SMB_LGRP_LOCAL_IDX 0
#define SMB_LGRP_DB_VERMINOR 0
#define SMB_LGRP_DB_SQL \
#define SMB_LGRP_GTBL_NAME 0
#define SMB_LGRP_PGRP_NOTUNIQUE 0
typedef struct smb_lgmid {
} smb_lgmid_t;
typedef struct smb_lgmlist {
char *m_ids;
typedef struct smb_lgplist {
int errnum;
char *errmsg;
} errtab[] = {
static void smb_lgrp_exit(void);
static int smb_lgrp_db_init(void);
static int smb_lgrp_pgrp_add(char *);
int rc;
return (SMB_LGRP_INVALID_NAME);
return (SMB_LGRP_INVALID_ARG);
if (!smb_lgrp_enter())
return (SMB_LGRP_OFFLINE);
return (SMB_LGRP_POSIXCREATE_FAILED);
return (SMB_LGRP_NOT_FOUND);
!= IDMAP_SUCCESS) {
return (SMB_LGRP_NO_SID);
return (SMB_LGRP_SID_NOTLOCAL);
return (SMB_LGRP_WKSID);
return (SMB_LGRP_NO_MEMORY);
return (SMB_LGRP_EXISTS);
return (rc);
int rc;
return (SMB_LGRP_INVALID_NAME);
return (SMB_LGRP_INVALID_NAME);
return (SMB_LGRP_SUCCESS);
return (SMB_LGRP_WKSID);
return (SMB_LGRP_WKSID);
if (!smb_lgrp_enter())
return (SMB_LGRP_OFFLINE);
return (SMB_LGRP_POSIXCREATE_FAILED);
return (SMB_LGRP_NOT_FOUND);
return (rc);
int rc;
return (SMB_LGRP_INVALID_NAME);
return (SMB_LGRP_WKSID);
return (SMB_LGRP_NOT_FOUND);
if (!smb_lgrp_enter())
return (SMB_LGRP_OFFLINE);
return (rc);
int rc;
return (SMB_LGRP_INVALID_NAME);
return (SMB_LGRP_INVALID_ARG);
if (!smb_lgrp_enter())
return (SMB_LGRP_OFFLINE);
return (rc);
int rc;
return (SMB_LGRP_INVALID_NAME);
return (SMB_LGRP_INVALID_ARG);
if (!smb_lgrp_enter())
return (SMB_LGRP_OFFLINE);
return (rc);
int rc;
return (SMB_LGRP_INVALID_NAME);
return (SMB_LGRP_NO_SUCH_PRIV);
if (!smb_lgrp_enter())
return (SMB_LGRP_OFFLINE);
if (enable) {
return (rc);
int rc;
return (SMB_LGRP_INVALID_NAME);
return (SMB_LGRP_NO_SUCH_PRIV);
if (!smb_lgrp_enter())
return (SMB_LGRP_OFFLINE);
return (rc);
int rc;
return (SMB_LGRP_INVALID_NAME);
return (SMB_LGRP_INVALID_ARG);
return (SMB_LGRP_INVALID_MEMBER);
if (!smb_lgrp_enter())
return (SMB_LGRP_OFFLINE);
return (rc);
int rc;
return (SMB_LGRP_INVALID_NAME);
return (SMB_LGRP_INVALID_ARG);
if (!smb_lgrp_enter())
return (SMB_LGRP_OFFLINE);
return (rc);
int rc;
return (SMB_LGRP_INVALID_NAME);
if (!smb_lgrp_enter())
return (SMB_LGRP_OFFLINE);
return (rc);
int rc;
if (!smb_lgrp_enter())
return (SMB_LGRP_OFFLINE);
return (rc);
int dom_idx;
int rc;
switch (dom_type) {
case SMB_DOMAIN_LOCAL:
case SMB_DOMAIN_BUILTIN:
*count = 0;
return (SMB_LGRP_INVALID_ARG);
if (!smb_lgrp_enter())
return (SMB_LGRP_OFFLINE);
return (rc);
char *sql;
if (!smb_lgrp_enter())
return (SMB_LGRP_OFFLINE);
return (SMB_LGRP_NO_MEMORY);
return (SMB_LGRP_DBOPEN_FAILED);
return (rc);
int rc;
if (!smb_lgrp_enter())
const char **values;
int ncol;
int rc;
return (SMB_LGRP_INVALID_ARG);
if (!smb_lgrp_enter())
return (SMB_LGRP_OFFLINE);
return (SMB_LGRP_NO_MORE);
return (SMB_LGRP_DBEXEC_FAILED);
return (SMB_LGRP_DB_ERROR);
for (i = 0; i < ncol; i++) {
return (SMB_LGRP_DB_ERROR);
return (rc);
return (B_FALSE);
return (B_TRUE);
return (B_FALSE);
for (i = 0; i < nerr; ++i) {
static struct err_map {
} err_map[] = {
return (NT_STATUS_INTERNAL_ERROR);
static boolean_t
switch (sid_type) {
case SidTypeNull:
case SidTypeUser:
case SidTypeGroup:
case SidTypeAlias:
case SidTypeWellKnownGroup:
case SidTypeDeletedAccount:
case SidTypeInvalid:
case SidTypeUnknown:
return (B_TRUE);
return (B_FALSE);
smb_lgrp_start(void)
static char *builtin[] = {
char *localsid;
int i, rc;
return (SMB_LGRP_NO_LOCAL_SID);
return (SMB_LGRP_NO_LOCAL_SID);
return (rc);
for (i = 0; i < ngrp; i++) {
char *tname;
return (SMB_LGRP_NO_MEMORY);
tname);
return (SMB_LGRP_SUCCESS);
smb_lgrp_stop(void)
static boolean_t
smb_lgrp_enter(void)
return (status);
smb_lgrp_exit(void)
static sqlite *
return (db);
if (db) {
smb_lgrp_db_init(void)
return (SMB_LGRP_DBOPEN_FAILED);
return (SMB_LGRP_DBEXEC_FAILED);
case SQLITE_ERROR:
&errmsg);
case SQLITE_OK:
&errmsg);
NULL);
return (rc);
&errmsg);
return (rc);
char *sql;
char **result;
return (SMB_LGRP_DBOPEN_FAILED);
switch (key) {
case SMB_LGRP_GTBL_NAME:
case SMB_LGRP_GTBL_SIDRID:
return (rc);
return (SMB_LGRP_INVALID_ARG);
return (SMB_LGRP_NO_MEMORY);
return (SMB_LGRP_LOOKUP_FAILED);
if (nrow == 0) {
return (SMB_LGRP_NOT_FOUND);
return (SMB_LGRP_DB_ERROR);
return (rc);
static boolean_t
char *sql;
char **result;
int rc;
return (NULL);
gname);
return (B_FALSE);
return (nrow != 0);
char *sql;
char **result;
int rc;
*count = 0;
return (SMB_LGRP_DBOPEN_FAILED);
dom_idx);
return (SMB_LGRP_LOOKUP_FAILED);
return (SMB_LGRP_DB_ERROR);
return (SMB_LGRP_SUCCESS);
char *sql;
int dom_idx;
int rc;
return (SMB_LGRP_DBOPEN_FAILED);
return (SMB_LGRP_NO_MEMORY);
return (rc);
char *sql;
int rc;
return (SMB_LGRP_DBOPEN_FAILED);
return (SMB_LGRP_NO_MEMORY);
return (rc);
char *sql;
int rc;
return (SMB_LGRP_DBOPEN_FAILED);
return (SMB_LGRP_NOT_FOUND);
switch (col_id) {
case SMB_LGRP_GTBL_NAME:
return (SMB_LGRP_EXISTS);
case SMB_LGRP_GTBL_CMNT:
return (SMB_LGRP_INVALID_ARG);
return (SMB_LGRP_NO_MEMORY);
return (rc);
int flags)
char *sql;
char **result;
int rc;
return (SMB_LGRP_DBOPEN_FAILED);
return (SMB_LGRP_NO_MEMORY);
return (SMB_LGRP_LOOKUP_FAILED);
if (nrow == 0) {
return (SMB_LGRP_NOT_FOUND);
return (SMB_LGRP_DB_ERROR);
return (rc);
switch (flags) {
case SMB_LGRP_DB_ADDMEMBER:
case SMB_LGRP_DB_DELMEMBER:
return (rc);
return (SMB_LGRP_NO_MEMORY);
return (rc);
char *sql;
char **result;
int rc;
return (SMB_LGRP_DBOPEN_FAILED);
return (SMB_LGRP_NO_MEMORY);
return (SMB_LGRP_LOOKUP_FAILED);
if (nrow == 0) {
return (SMB_LGRP_NOT_FOUND);
return (SMB_LGRP_DB_ERROR);
if (enable)
return (rc);
gname);
return (SMB_LGRP_NO_MEMORY);
return (rc);
char *sql;
int rc;
return (SMB_LGRP_NO_MEMORY);
return (SMB_LGRP_DOMINS_FAILED);
if (dom_idx)
return (SMB_LGRP_SUCCESS);
char **result;
char *sql;
int rc;
return (SMB_LGRP_INTERNAL_ERROR);
return (SMB_LGRP_SUCCESS);
return (SMB_LGRP_NO_MEMORY);
sidstr);
return (SMB_LGRP_NO_MEMORY);
return (SMB_LGRP_DOMLKP_FAILED);
switch (nrow) {
return (SMB_LGRP_SUCCESS);
return (SMB_LGRP_DB_ERROR);
char **result;
char *sql;
int rc;
dom_idx);
return (SMB_LGRP_NO_MEMORY);
return (SMB_LGRP_DOMLKP_FAILED);
switch (nrow) {
return (rc);
char *sql;
int rc;
return (SMB_LGRP_NO_MEMORY);
return (rc);
char *in_list;
char *out_list;
int in_size;
int out_size;
int mid_hexsz;
return (SMB_LGRP_MEMBER_IN_GROUP);
return (SMB_LGRP_NO_MEMORY);
return (SMB_LGRP_SUCCESS);
char *in_list;
char *out_list;
int in_size;
int out_size;
int mid_hexsz;
int out_cnt;
return (SMB_LGRP_MEMBER_NOT_IN_GROUP);
return (SMB_LGRP_NO_MEMORY);
out_cnt++;
return (SMB_LGRP_MEMBER_NOT_IN_GROUP);
return (SMB_LGRP_SUCCESS);
int i, size;
return (SMB_LGRP_PRIV_HELD);
return (SMB_LGRP_NO_MEMORY);
return (SMB_LGRP_SUCCESS);
int i, size;
return (SMB_LGRP_PRIV_NOT_HELD);
return (SMB_LGRP_NO_MEMORY);
return (SMB_LGRP_PRIV_NOT_HELD);
return (SMB_LGRP_SUCCESS);
assert(0);
return (SMB_LGRP_BAD_DATA);
return (SMB_LGRP_NO_MEMORY);
return (SMB_LGRP_SUCCESS);
int m_num;
int mids_size;
int i, rc;
return (SMB_LGRP_NO_MEMORY);
return (SMB_LGRP_NO_MEMORY);
return (rc);
return (SMB_LGRP_SUCCESS);
int rc;
return (SMB_LGRP_SUCCESS);
return (SMB_LGRP_NO_MEMORY);
return (SMB_LGRP_NO_MEMORY);
return (rc);
return (rc);
return (rc);
return (SMB_LGRP_SUCCESS);
static boolean_t
return (B_FALSE);
return (B_TRUE);
int id_type;
int rc;
return (SMB_LGRP_NO_SID);
*rid);
return (SMB_LGRP_SID_NOTLOCAL);
return (SMB_LGRP_SUCCESS);
return (SMB_LGRP_DB_ERROR);
return (SMB_LGRP_NO_MEMORY);
return (SMB_LGRP_SUCCESS);
int idtype;
int rc;
return (SMB_LGRP_NO_MEMORY);
static boolean_t
return (B_FALSE);
return (B_FALSE);
return (rc);
int len = 0;
int badchar = 0;
return (SMB_LGRP_PGRP_INVALID);
len++;
return (SMB_LGRP_PGRP_INVALID);
badchar++;
return (SMB_LGRP_PGRP_INVALID);
return (SMB_LGRP_PGRP_NOTUNIQUE);
return (SMB_LGRP_PGRP_UNIQUE);
int o_mask;
int newdone = 0;
int rc = 0;
if (!newdone)