xref: /onnv-gate/usr/src/lib/libldap4/common/option.c (revision 0:68f95e015346)
1 /*
2  * Copyright (c) 1995-2001 by Sun Microsystems, Inc.
3  * All rights reserved.
4  */
5 
6 #pragma ident	"%Z%%M%	%I%	%E% SMI"
7 
8 #include <stdio.h>
9 #include <string.h>
10 #include "lber.h"
11 #include "ldap.h"
12 #include "ldap-private.h"
13 #include "ldap-int.h"
14 
15 extern LDAPControl ** ldap_controls_dup(LDAPControl **ctrls);
16 
17 /*
18  * ldap_get_option()
19  */
20 int
ldap_get_option(LDAP * ld,int option,void * outvalue)21 ldap_get_option(LDAP *ld, int option, void *outvalue)
22 {
23 	if (ld == NULL)
24 		return (-1);
25 #ifdef _REENTRANT
26 	LOCK_LDAP(ld);
27 #endif
28 	switch (option) {
29 	case LDAP_OPT_API_INFO:
30 		((LDAPAPIInfo *)outvalue)->ldapai_api_version =
31 			LDAP_API_VERSION;
32 		if (((LDAPAPIInfo *)outvalue)->ldapai_info_version !=
33 			LDAP_API_INFO_VERSION) {
34 			((LDAPAPIInfo *)outvalue)->ldapai_info_version =
35 				LDAP_API_INFO_VERSION;
36 #ifdef _REENTRANT
37 				UNLOCK_LDAP(ld);
38 #endif
39 				return (-1);
40 		}
41 		((LDAPAPIInfo *)outvalue)->ldapai_protocol_version =
42 			LDAP_VERSION_MAX;
43 		/* No extensions are currently supported */
44 		((LDAPAPIInfo *)outvalue)->ldapai_extensions = NULL;
45 		((LDAPAPIInfo *)outvalue)->ldapai_vendor_name =
46 			strdup(LDAP_VENDOR_NAME);
47 		((LDAPAPIInfo *)outvalue)->ldapai_vendor_version =
48 			LDAP_VENDOR_VERSION;
49 		break;
50 	case LDAP_OPT_DESC:	/* depricated option */
51 		*(int *)outvalue = ld->ld_sb.sb_sd;
52 		break;
53 	case LDAP_OPT_DEREF:
54 		*(int *)outvalue = ld->ld_deref;
55 		break;
56 	case LDAP_OPT_SIZELIMIT:
57 		*(int *)outvalue = ld->ld_sizelimit;
58 		break;
59 	case LDAP_OPT_TIMELIMIT:
60 		*(int *)outvalue = ld->ld_timelimit;
61 		break;
62 	case LDAP_OPT_REBIND_FN:	/* depricated option */
63 		outvalue = (void *)ld->ld_rebindproc;
64 		break;
65 	case LDAP_OPT_REBIND_ARG:	/* depricated option */
66 		outvalue = ld->ld_rebind_extra_arg;
67 		break;
68 	case LDAP_OPT_REFERRALS:
69 		*(int *)outvalue = ld->ld_follow_referral;
70 		break;
71 	case LDAP_OPT_RESTART:
72 		*(int *)outvalue = ld->ld_restart;
73 		break;
74 	case LDAP_OPT_PROTOCOL_VERSION:
75 		*(int *)outvalue = ld->ld_version;
76 		break;
77 	case LDAP_OPT_SERVER_CONTROLS:
78 		outvalue = ld->ld_srvctrls;
79 		break;
80 	case LDAP_OPT_CLIENT_CONTROLS:
81 		outvalue = ld->ld_cltctrls;
82 		break;
83 	case LDAP_OPT_API_FEATURE_INFO:
84 		if ((((LDAPAPIFeatureInfo *)outvalue)->ldapaif_info_version !=
85 			LDAP_FEATURE_INFO_VERSION) ||
86 			(((LDAPAPIFeatureInfo *)outvalue)->ldapaif_name ==
87 			NULL)) {
88 			((LDAPAPIFeatureInfo *)outvalue)->ldapaif_info_version =
89 				LDAP_FEATURE_INFO_VERSION;
90 #ifdef _REENTRANT
91 				UNLOCK_LDAP(ld);
92 #endif
93 				return (-1);
94 		}
95 		/*
96 		 * This option must be completed when optional api's (or
97 		 * (extensions) are supported by this library.  Right now
98 		 * there are none, and therefore this section can not be
99 		 * completed.
100 		 */
101 		break;
102 	case LDAP_OPT_HOST_NAME:
103 		*(char **)outvalue = ld->ld_host;
104 		break;
105 	case LDAP_OPT_ERROR_NUMBER:
106 		*(int *)outvalue = ld->ld_errno;
107 		break;
108 	case LDAP_OPT_ERROR_STRING:
109 		*(char **)outvalue = ld->ld_error;
110 		break;
111 	case LDAP_OPT_MATCHED_DN:
112 /*	case LDAP_OPT_ERROR_MATCHED:	depricated option */
113 		*(char **)outvalue = ld->ld_matched;
114 		break;
115 	case LDAP_X_OPT_CONNECT_TIMEOUT:
116 		*((int *)outvalue) = ld->ld_connect_timeout;
117 		break;
118 	default:
119 #ifdef _REENTRANT
120 		UNLOCK_LDAP(ld);
121 #endif
122 		return (-1);
123 	}
124 
125 #ifdef _REENTRANT
126 	UNLOCK_LDAP(ld);
127 #endif
128 	return (0);
129 }
130 
131 int
ldap_set_option(LDAP * ld,int option,void * invalue)132 ldap_set_option(LDAP *ld, int option, void *invalue)
133 {
134 	if (ld == NULL)
135 		return (-1);
136 #ifdef _REENTRANT
137 	LOCK_LDAP(ld);
138 #endif
139 	switch (option) {
140 	case LDAP_OPT_DESC:
141 		break;
142 	case LDAP_OPT_DEREF:
143 		if (*(int *)invalue != LDAP_DEREF_NEVER &&
144 			*(int *)invalue != LDAP_DEREF_SEARCHING &&
145 			*(int *)invalue != LDAP_DEREF_FINDING &&
146 			*(int *)invalue != LDAP_DEREF_ALWAYS) {
147 #ifdef _REENTRANT
148 			UNLOCK_LDAP(ld);
149 #endif
150 			return (-1);
151 		}
152 		ld->ld_deref = *(int *)invalue;
153 		break;
154 	case LDAP_OPT_SIZELIMIT:
155 		ld->ld_sizelimit = *(int *)invalue;
156 		break;
157 	case LDAP_OPT_TIMELIMIT:
158 		ld->ld_timelimit = *(int *)invalue;
159 		break;
160 	case LDAP_OPT_REBIND_FN:
161 		/* cast needs to be updated when ldap.h gets updated */
162 		ld->ld_rebindproc = (LDAP_REBIND_FUNCTION *)invalue;
163 		break;
164 	case LDAP_OPT_REBIND_ARG:
165 		ld->ld_rebind_extra_arg = invalue;
166 		break;
167 	case LDAP_OPT_REFERRALS:
168 		if (invalue != LDAP_OPT_ON && invalue != LDAP_OPT_OFF) {
169 #ifdef _REENTRANT
170 			UNLOCK_LDAP(ld);
171 #endif
172 			return (-1);
173 		}
174 		ld->ld_follow_referral = invalue ? 1 : 0;
175 		break;
176 	case LDAP_OPT_RESTART:
177 		if (invalue != LDAP_OPT_ON && invalue != LDAP_OPT_OFF) {
178 #ifdef _REENTRANT
179 			UNLOCK_LDAP(ld);
180 #endif
181 			return (-1);
182 		}
183 		ld->ld_restart = invalue ? 1 : 0;
184 		break;
185 	case LDAP_OPT_PROTOCOL_VERSION:
186 		if (*(int *)invalue < LDAP_VERSION1 ||
187 			*(int *)invalue > LDAP_VERSION3) {
188 #ifdef _REENTRANT
189 			UNLOCK_LDAP(ld);
190 #endif
191 			return (-1);
192 		}
193 		ld->ld_version = *(int *)invalue;
194 		break;
195 	case LDAP_OPT_SERVER_CONTROLS:
196 		if (ld->ld_srvctrls != NULL) {
197 			ldap_controls_free(ld->ld_srvctrls);
198 		}
199 		ld->ld_srvctrls = NULL;
200 		if (invalue != NULL)
201 			ld->ld_srvctrls = ldap_controls_dup(invalue);
202 		break;
203 	case LDAP_OPT_CLIENT_CONTROLS:
204 		if (ld->ld_cltctrls != NULL) {
205 			ldap_controls_free(ld->ld_cltctrls);
206 		}
207 		ld->ld_cltctrls = NULL;
208 		if (invalue != NULL)
209 			ld->ld_cltctrls = ldap_controls_dup(invalue);
210 		break;
211 	case LDAP_OPT_HOST_NAME:
212 		if (ld->ld_host != NULL) {
213 			free(ld->ld_host);
214 		}
215 		ld->ld_host = NULL;
216 		if ((char *)invalue != NULL)
217 			ld->ld_host = strdup((char *)invalue);
218 		break;
219 	case LDAP_OPT_ERROR_NUMBER:
220 		break;
221 	case LDAP_OPT_ERROR_STRING:
222 		break;
223 	case LDAP_OPT_MATCHED_DN:
224 		if (ld->ld_matched)
225 			free(ld->ld_matched);
226 		ld->ld_matched = NULL;
227 		if ((char *)invalue != NULL)
228 			ld->ld_matched = strdup((char *)invalue);
229 		break;
230 	case LDAP_X_OPT_CONNECT_TIMEOUT:
231 		ld->ld_connect_timeout = *((int *)invalue);
232 		break;
233 	default:
234 #ifdef _REENTRANT
235 		UNLOCK_LDAP(ld);
236 #endif
237 		return (-1);
238 	}
239 #ifdef _REENTRANT
240 	UNLOCK_LDAP(ld);
241 #endif
242 	return (0);
243 }
244