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