idmap_cache.c revision 9b214d32697277d03ed2e5d98c4a7bfef16dcf4d
/*
* 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_TRIGGER_SIZE 4096
#define CACHE_GID_TRIGGER_SIZE 2048
#define CACHE_UID_GID_TRIGGER_SIZE \
#define UNDEF_ISUSER (-1)
do {\
} while (0)
#define list_remove(ele)\
do {\
} while (0)
do {\
list_remove(ele);\
}\
} while (0)
typedef struct sid2uid_gid {
struct sid2uid_gid *flink;
struct sid2uid_gid *blink;
const char *sid_prefix;
int is_user;
typedef struct pid2sid_winname {
struct pid2sid_winname *flink;
struct pid2sid_winname *blink;
const char *sid_prefix;
const char *winname;
const char *windomain;
typedef struct winname2uid_gid {
struct winname2uid_gid *flink;
struct winname2uid_gid *blink;
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 idmap_cache_t idmap_cache;
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
{
}
idmap_cache_lookup_uidbysid(const char *sid_prefix,
{
int status = IDMAP_ERR_NOMAPPING;
}
}
return (status);
}
idmap_cache_lookup_gidbysid(const char *sid_prefix,
{
int status = IDMAP_ERR_NOMAPPING;
}
}
return (status);
}
idmap_cache_lookup_pidbysid(const char *sid_prefix,
{
int status = IDMAP_ERR_NOMAPPING;
}
}
}
return (status);
}
{
int status = IDMAP_ERR_NOMAPPING;
if (*sid_prefix != NULL)
else
}
}
return (status);
}
{
int status = IDMAP_ERR_NOMAPPING;
if (*sid_prefix != NULL)
else
}
}
return (status);
}
{
int status = IDMAP_ERR_NOMAPPING;
*domain =
else
status =
} else {
}
} else
} else
}
}
return (status);
}
{
int status = IDMAP_ERR_NOMAPPING;
*domain =
else
status =
} else {
}
} else
} else
}
}
return (status);
}
{
int status = IDMAP_ERR_NOMAPPING;
}
}
return (status);
}
{
int status = IDMAP_ERR_NOMAPPING;
}
}
return (status);
}
void
idmap_cache_add_sid2uid(const char *sid_prefix,
{
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
idmap_cache_add_sid2gid(const char *sid_prefix,
{
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
idmap_cache_add_sid2pid(const char *sid_prefix,
{
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)
}
}