1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef	_NS_CACHE_DOOR_H
27 #define	_NS_CACHE_DOOR_H
28 
29 /*
30  * Definitions for client side of doors-based ldap caching
31  */
32 
33 #ifdef	__cplusplus
34 extern "C" {
35 #endif
36 
37 #include <netdb.h>
38 #include <netinet/in.h>
39 #include <arpa/inet.h>
40 #include <sys/socket.h>
41 #include <grp.h>
42 #include <pwd.h>
43 
44 
45 /*
46  *	statistics & control structure
47  */
48 
49 typedef struct ldap_stat {
50 	int	ldap_numbercalls;	/* number of times called */
51 	int	ldap_ttl;		/* time to live for positive entries */
52 } ldap_stat_t;
53 
54 
55 /*
56  * Structure used to transfer arrays of strings.
57  * Buffer format:
58  *   count
59  *   array of offsets from start of buffer
60  *   array of characters of strings
61  *        charp = buf + ldap_offsets[n];
62  */
63 
64 typedef struct ldap_strlist {
65 	int	ldap_count;		/* number of strings */
66 	int	ldap_offsets[1];	/* array of offsets */
67 } ldap_strlist_t;
68 
69 /*
70  * Structure used to request/inform config and server status changes.
71  */
72 
73 typedef struct ldap_get_chg_cookie {
74 	pid_t		mgr_pid;  /* current process id of ldap_cachemgr */
75 	uint32_t	seq_num;  /* current config sequence number */
76 } ldap_get_chg_cookie_t;
77 
78 typedef struct ldap_get_change {
79 	uint32_t		op;	/* start or stop */
80 	ldap_get_chg_cookie_t	cookie;	/* get status change cookie */
81 } ldap_get_change_t;
82 
83 typedef struct ldap_get_change_out {
84 	uint32_t	type;		 /* config change or server change */
85 	ldap_get_chg_cookie_t cookie;    /* get status change cookie */
86 	uint32_t	server_count;	 /* if server change: num of servers */
87 	uint32_t	data_size;	 /* if server change: size of data */
88 	char 		data[sizeof (int)]; /* real size is data_size */
89 } ldap_get_change_out_t;
90 
91 typedef struct ldap_config_out {
92 	ldap_get_chg_cookie_t cookie;    /* get status change cookie */
93 	uint32_t	data_size;	 /* length of the config string */
94 	char 		config_str[sizeof (int)]; /* real size is data_size */
95 } ldap_config_out_t;
96 
97 typedef struct ldap_admin_mod_result {
98 	uint32_t	ns_err;		/* ns_ldap error code */
99 	uint32_t	status;		/* error status */
100 	uint32_t	msg_size;	/* length of error message */
101 	char 		msg[sizeof (int)]; /* real size is msg_size */
102 } ldap_admin_mod_result_t;
103 
104 /*
105  * structure returned by server for all calls
106  */
107 
108 #define	BUFFERSIZE	8192
109 #define	OFFSET		36
110 
111 typedef struct {
112 	int 		ldap_bufferbytesused;
113 	int 		ldap_return_code;
114 	int 		ldap_errno;
115 
116 	union {
117 		char		config[BUFFERSIZE - OFFSET]; /* V1 Config */
118 		ldap_stat_t 	stats;
119 		char 		buff[4];
120 		char 		ber[4];		/* BER/DER encoded packet */
121 		ldap_strlist_t	strlist;
122 		ldap_config_out_t config_str;
123 		ldap_get_change_out_t changes;
124 		ldap_admin_mod_result_t admin_result;
125 	} ldap_u;
126 
127 } ldap_return_t;
128 
129 /*
130  * calls look like this
131  */
132 
133 typedef struct {
134 	int ldap_callnumber;
135 	union {
136 		uid_t uid;
137 		gid_t gid;
138 		char domainname[sizeof (int)]; 	/* size is indeterminate */
139 		struct {
140 			int  a_type;
141 			int  a_length;
142 			char a_data[sizeof (int)];
143 		} addr;
144 		char servername[sizeof (int)]; 	/* Format: server:port */
145 		ldap_strlist_t	strlist;
146 		ldap_get_change_t get_change;
147 	} ldap_u;
148 } ldap_call_t;
149 /*
150  * how the client views the call process
151  */
152 
153 typedef union {
154 	ldap_call_t 		ldap_call;
155 	ldap_return_t 		ldap_ret;
156 	char 			ldap_buff[sizeof (int)];
157 } ldap_data_t;
158 
159 /* Version 1 Cache Manager calls */
160 	/* Cache manager ping */
161 #define	NULLCALL	0
162 	/* NativeLDAP I Get Config */
163 #define	GETLDAPCONFIG	1
164 #define	GETLDAPCONFIGV1	1
165 
166 /*
167  * administrative calls
168  */
169 
170 #define	KILLSERVER	7
171 #define	GETADMIN	8
172 #define	SETADMIN	9
173 
174 /*
175  * debug levels
176  */
177 
178 #define	DBG_OFF		0
179 #define	DBG_CANT_FIND	1
180 #define	DBG_NETLOOKUPS	2
181 #define	DBG_SERVER_LIST_REFRESH	3	/* debug server list refresh */
182 #define	DBG_PROFILE_REFRESH	4	/* debug profile TTL/refresh */
183 #define	DBG_ALL		6
184 
185 /* Version 2 Cache Manager calls */
186 	/* NativeLDAP II Get Server and RootDSE Info */
187 #define	GETLDAPSERVER	21
188 	/* NativeLDAP II Get cached data */
189 #define	GETCACHE	22
190 	/* NativeLDAP II Set cached data */
191 #define	SETCACHE	23
192 	/* NativeLDAP II get cache data statistics */
193 #define	GETCACHESTAT	24
194 	/* Configuration change or server status change notification */
195 #define	GETSTATUSCHANGE	25
196 	/* perform admin modify via ldap_cachemgr */
197 #define	ADMINMODIFY	26
198 	/* get admin credentials for shadow lookups */
199 #define	GETADMINCRED	27
200 
201 /*
202  * GETLDAPSERVER request flags
203  */
204 
205 #define	NS_CACHE_NEW	"0"
206 #define	NS_CACHE_NORESP	"1"
207 #define	NS_CACHE_NEXT	"2"
208 #define	NS_CACHE_WRITE	"3"
209 #define	NS_CACHE_ADDR_HOSTNAME	"H"
210 #define	NS_CACHE_ADDR_IP	"I"
211 
212 /*
213  * GETSTATUSCHANGE operation: start or stop
214  */
215 #define	NS_STATUS_CHANGE_OP_START	1
216 #define	NS_STATUS_CHANGE_OP_STOP	2
217 
218 /*
219  * GETSTATUSCHANGE change type: config or server
220  */
221 #define	NS_STATUS_CHANGE_TYPE_CONFIG	1
222 #define	NS_STATUS_CHANGE_TYPE_SERVER	2
223 
224 /*
225  * Server status change
226  */
227 #define	NS_SERVER_CHANGE_UP	"0"	/* mapped to NS_SERVER_UP */
228 #define	NS_SERVER_CHANGE_DOWN	"1"	/* mapped to NS_SERVER_DOWN */
229 /*
230  * GETCACHE/SETCACHE data flags
231  */
232 #define	NS_CACHE_DN2DOMAIN	"DM"
233 
234 /*
235  * Max size name we allow to be passed to avoid
236  * buffer overflow problems
237  */
238 #define	LDAPMAXNAMELEN	255
239 
240 /*
241  * defines for client-server interaction
242  */
243 
244 #define	LDAP_CACHE_DOOR_VERSION 1
245 #define	LDAP_CACHE_DOOR "/var/run/ldap_cache_door"
246 #define	LDAP_CACHE_DOOR_COOKIE ((void*)(0xdeadbeef^LDAP_CACHE_DOOR_VERSION))
247 #define	UPDATE_DOOR_COOKIE ((void*)(0xdeadcafe)
248 
249 #define	NS_CACHE_SUCCESS	0
250 #define	NS_CACHE_NOTFOUND  	-1
251 #define	NS_CACHE_CREDERROR 	-2
252 #define	NS_CACHE_SERVERERROR 	-3
253 #define	NS_CACHE_NOSERVER 	-4
254 
255 int
256 __ns_ldap_trydoorcall(ldap_data_t **dptr, int *ndata, int *adata);
257 int
258 __ns_ldap_trydoorcall_getfd();
259 int
260 __ns_ldap_trydoorcall_send(ldap_data_t **dptr, int *ndata, int *adata);
261 void
262 __ns_ldap_doorfd_close();
263 
264 #ifdef	__cplusplus
265 }
266 #endif
267 
268 
269 #endif	/* _NS_CACHE_DOOR_H */
270