summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/idmap/kidmap_priv.h
blob: 54170684defa6ec903fd177945824cda8305e788 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
/*
 * 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 2008 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

/*
 * Windows to Solaris Identity Mapping kernel API
 * This header file contains private definitions.
 */

#ifndef _KIDMAP_PRIV_H
#define	_KIDMAP_PRIV_H

#include <sys/avl.h>

#ifdef	__cplusplus
extern "C" {
#endif

typedef struct sid2pid {
	avl_node_t	avl_link;
	struct sid2pid	*flink;
	struct sid2pid	*blink;
	const char 	*sid_prefix;
	uint32_t	rid;
	uid_t		uid;
	time_t		uid_ttl;
	gid_t		gid;
	time_t		gid_ttl;
	int		is_user;
} sid2pid_t;


typedef struct pid2sid {
	avl_node_t	avl_link;
	struct pid2sid	*flink;
	struct pid2sid	*blink;
	const char 	*sid_prefix;
	uint32_t	rid;
	uid_t		pid;
	time_t		ttl;
} pid2sid_t;



typedef struct idmap_sid2pid_cache {
	avl_tree_t		tree;
	kmutex_t		mutex;
	struct sid2pid		head;
	time_t			purge_time;
	int			uid_num;
	int			gid_num;
	int			pid_num;
} idmap_sid2pid_cache_t;


typedef struct idmap_pid2sid_cache {
	avl_tree_t		tree;
	kmutex_t		mutex;
	struct pid2sid		head;
	time_t			purge_time;
} idmap_pid2sid_cache_t;


/*
 * There is a cache for every mapping request because a group SID
 * on Windows can be set in a file owner field and versa-visa.
 * To stop this causing problems on Solaris a SID can map to
 * both a UID and a GID.
 */
typedef struct idmap_cache {
	idmap_sid2pid_cache_t	sid2pid;
	idmap_pid2sid_cache_t	uid2sid;
	idmap_pid2sid_cache_t	gid2sid;
} idmap_cache_t;


void
kidmap_cache_create(idmap_cache_t *cache);

void
kidmap_cache_delete(idmap_cache_t *cache);

void
kidmap_cache_purge(idmap_cache_t *cache);


int
kidmap_cache_lookup_uidbysid(idmap_cache_t *cache, const char *sid_prefix,
			uint32_t rid, uid_t *uid);

int
kidmap_cache_lookup_gidbysid(idmap_cache_t *cache, const char *sid_prefix,
			uint32_t rid, gid_t *gid);

int
kidmap_cache_lookup_pidbysid(idmap_cache_t *cache, const char *sid_prefix,
			uint32_t rid, uid_t *pid, int *is_user);

int
kidmap_cache_lookup_sidbyuid(idmap_cache_t *cache, const char **sid_prefix,
			uint32_t *rid, uid_t uid);

int
kidmap_cache_lookup_sidbygid(idmap_cache_t *cache, const char **sid_prefix,
			uint32_t *rid, gid_t gid);


void
kidmap_cache_add_sid2uid(idmap_cache_t *cache, const char *sid_prefix,
			uint32_t rid, uid_t uid, int direction);

void
kidmap_cache_add_sid2gid(idmap_cache_t *cache, const char *sid_prefix,
			uint32_t rid, gid_t gid, int direction);

void
kidmap_cache_add_sid2pid(idmap_cache_t *cache, const char *sid_prefix,
			uint32_t rid, uid_t pid, int is_user, int direction);
void
kidmap_cache_get_data(idmap_cache_t *cache, size_t *uidbysid, size_t *gidbysid,
			size_t *pidbysid, size_t *sidbyuid, size_t *sidbygid);
int
kidmap_start(void);

int
kidmap_stop(void);

void
kidmap_sid_prefix_store_init(void);

const char *
kidmap_find_sid_prefix(const char *sid_prefix);

#ifdef	__cplusplus
}
#endif

#endif	/* _KIDMAP_PRIV_H */