/*
* 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
* 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.
*/
/*
* Windows to Solaris Identity Mapping
* This module provides the libidmap idmap_cache.
*/
#include <assert.h>
#include <pthread.h>
#include <strings.h>
#include <stddef.h>
#include <stdlib.h>
#include <rpcsvc/idmap_prot.h>
#include "idmap_cache.h"
/*
* Internal definitions and functions
*/
#define CACHE_UID_GID_TRIGGER_SIZE \
do {\
} while (0)
do {\
} while (0)
do {\
list_remove(ele);\
}\
} while (0)
typedef struct sid2uid_gid {
const char *sid_prefix;
int is_user;
typedef struct pid2sid_winname {
const char *sid_prefix;
const char *winname;
const char *windomain;
typedef struct winname2uid_gid {
const char *winname;
const char *windomain;
typedef struct sid2uid_gid_cache {
int uid_num;
int gid_num;
int pid_num;
typedef struct pid2sid_winname_cache {
int sid_num;
int winname_num;
typedef struct winname2uid_gid_cache {
int uid_num;
int gid_num;
typedef struct idmap_cache {
typedef int (*avl_comp_fn)(const void*, const void*);
static void
static void
static void
/*
* Global structures
*/
static int
{
if (comp == 0)
if (comp < 0)
comp = -1;
else if (comp > 0)
comp = 1;
return ((int)comp);
}
static int
const pid2sid_winname_t *entry2)
{
return (1);
return (-1);
return (0);
}
static int
const winname2uid_gid_t *entry2)
{
int comp;
if (comp == 0) {
return (0);
return (1);
return (-1);
}
if (comp < 0)
comp = -1;
else if (comp > 0)
comp = 1;
return (comp);
}
/*
* Routine to update item
*
* Returns: 0 Success
* -1 Error
*/
static int
{
char *tmp;
return (-1);
}
/* *item is NULL */
return (-1);
/* str is NULL */
}
return (0);
}
/*
* The Cache is initialized on loading libidmap.so
*/
#pragma init(idmap_cache_create)
void
idmap_cache_create(void)
{
}
void
idmap_cache_purge(void)
{
void *cookie;
while ((sid2uid_gid = avl_destroy_nodes(
}
while ((uid2sid_winname = avl_destroy_nodes(
}
while ((gid2sid_winname = avl_destroy_nodes(
}
while ((winname2uid_gid = avl_destroy_nodes(
if (winname2uid_gid->windomain)
}
}
void
{
}
{
}
}
return (status);
}
{
}
}
return (status);
}
{
}
}
}
return (status);
}
{
if (*sid_prefix != NULL)
else
}
}
return (status);
}
{
if (*sid_prefix != NULL)
else
}
}
return (status);
}
{
*domain =
else
status =
} else {
}
} else
} else
}
}
return (status);
}
{
*domain =
else
status =
} else {
}
} else
} else
}
}
return (status);
}
{
}
}
return (status);
}
{
}
}
return (status);
}
void
{
if (direction == IDMAP_DIRECTION_BI ||
direction == IDMAP_DIRECTION_W2U) {
if (result) {
} else {
goto exit_sid2uid_gid;
goto exit_sid2uid_gid;
}
}
}
if (direction == IDMAP_DIRECTION_BI ||
direction == IDMAP_DIRECTION_U2W) {
&where);
if (result) {
goto exit_pid2sid_winname;
} else {
goto exit_pid2sid_winname;
goto exit_pid2sid_winname;
}
new->winname_ttl = 0;
where);
}
}
}
void
{
if (direction == IDMAP_DIRECTION_BI ||
direction == IDMAP_DIRECTION_W2U) {
if (result) {
} else {
goto exit_sid2uid_gid;
goto exit_sid2uid_gid;
}
}
}
if (direction == IDMAP_DIRECTION_BI ||
direction == IDMAP_DIRECTION_U2W) {
&where);
if (result) {
goto exit_gid2sid_winname;
} else {
goto exit_gid2sid_winname;
goto exit_gid2sid_winname;
}
new->winname_ttl = 0;
where);
}
}
}
void
{
if (direction == IDMAP_DIRECTION_BI ||
direction == IDMAP_DIRECTION_W2U) {
if (result) {
if (is_user) {
} else {
}
} else {
goto exit_sid2uid_gid;
goto exit_sid2uid_gid;
}
if (is_user) {
} else {
}
}
}
if (direction == IDMAP_DIRECTION_BI ||
direction == IDMAP_DIRECTION_U2W) {
if (is_user) {
(void) pthread_mutex_lock(
if (result) {
!= 0)
goto exit_uid2sid_winname;
} else {
goto exit_uid2sid_winname;
goto exit_uid2sid_winname;
}
new);
}
(void) pthread_mutex_unlock(
} else {
(void) pthread_mutex_lock(
if (result) {
!= 0)
goto exit_gid2sid_winname;
} else {
goto exit_gid2sid_winname;
goto exit_gid2sid_winname;
}
new);
}
(void) pthread_mutex_unlock(
}
}
}
void
int direction)
{
if (direction == IDMAP_DIRECTION_BI ||
direction == IDMAP_DIRECTION_W2U) {
&where);
if (result) {
} else {
goto exit_winname2uid_gid;
goto exit_winname2uid_gid;
}
goto exit_winname2uid_gid;
}
} else
where);
}
}
if (direction == IDMAP_DIRECTION_BI ||
direction == IDMAP_DIRECTION_U2W) {
&where);
if (result) {
goto exit_uid2sid_winname;
goto exit_uid2sid_winname;
if (result->winname_ttl == 0)
} else {
goto exit_uid2sid_winname;
goto exit_uid2sid_winname;
}
goto exit_uid2sid_winname;
}
} else
where);
}
}
}
void
int direction)
{
if (direction == IDMAP_DIRECTION_BI ||
direction == IDMAP_DIRECTION_W2U) {
&where);
if (result) {
} else {
goto exit_winname2uid_gid;
goto exit_winname2uid_gid;
}
goto exit_winname2uid_gid;
}
}
else
where);
}
}
if (direction == IDMAP_DIRECTION_BI ||
direction == IDMAP_DIRECTION_U2W) {
&where);
if (result) {
goto exit_gid2sid_winname;
goto exit_gid2sid_winname;
if (result->winname_ttl == 0)
} else {
goto exit_gid2sid_winname;
goto exit_gid2sid_winname;
}
goto exit_gid2sid_winname;
}
}
else
where);
}
}
}
static void
{
/* Remove least recently used */
if (item->sid_prefix)
}
}
static void
{
/* Remove least recently used */
}
}
static void
{
/* Remove least recently used */
if (item->winname_ttl != 0)
cache->winname_num--;
if (item->sid_prefix)
}
}