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