diff options
Diffstat (limited to 'usr/src/lib/libldap4/common/controls.c')
-rw-r--r-- | usr/src/lib/libldap4/common/controls.c | 291 |
1 files changed, 0 insertions, 291 deletions
diff --git a/usr/src/lib/libldap4/common/controls.c b/usr/src/lib/libldap4/common/controls.c deleted file mode 100644 index fb61e5e56c..0000000000 --- a/usr/src/lib/libldap4/common/controls.c +++ /dev/null @@ -1,291 +0,0 @@ -/* - * - * Copyright 1999 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - * - * - * Comments: - * - */ - -#pragma ident "%Z%%M% %I% %E% SMI" - -#include <stdio.h> -#include <string.h> -#include "lber.h" -#include "ldap.h" -#include "ldap-private.h" -#include "ldap-int.h" - -static int ldap_control_copy_contents(LDAPControl *, LDAPControl *); - -void ldap_control_free (LDAPControl *ctrl) -{ - if (ctrl != NULL){ - if (ctrl->ldctl_oid) - free (ctrl->ldctl_oid); - if (ctrl->ldctl_value.bv_val != NULL) - free (ctrl->ldctl_value.bv_val); - free ((char *)ctrl); - } - return; -} - -void ldap_controls_free (LDAPControl **ctrls) -{ - int i; - - if (ctrls == NULL) - return; - - for (i = 0; ctrls[i] != NULL; i++){ - ldap_control_free(ctrls[i]); - } - free((char *)ctrls); -} - -LDAPControl * ldap_control_dup(LDAPControl *ctrl) -{ - LDAPControl *newctrl; - - if ((newctrl = (LDAPControl *)calloc(1, sizeof(LDAPControl))) == NULL) - return (NULL); - - if (ldap_control_copy_contents(newctrl, ctrl) != LDAP_SUCCESS) { - free(newctrl); - return (NULL); - } - - return(newctrl); -} - - -static int ldap_control_copy_contents(LDAPControl *ctrl_dst, -LDAPControl *ctrl_src) -{ - size_t len; - - if (NULL == ctrl_dst || NULL == ctrl_src) { - return (LDAP_PARAM_ERROR); - } - - ctrl_dst->ldctl_iscritical = ctrl_src->ldctl_iscritical; - - /* fill in the fields of this new control */ - if ((ctrl_dst->ldctl_oid = strdup(ctrl_src->ldctl_oid)) == NULL) { - return (LDAP_NO_MEMORY); - } - - len = (size_t)(ctrl_src->ldctl_value).bv_len; - if (ctrl_src->ldctl_value.bv_val == NULL || len <= 0) { - ctrl_dst->ldctl_value.bv_len = 0; - ctrl_dst->ldctl_value.bv_val = NULL; - } else { - ctrl_dst->ldctl_value.bv_len = len; - if ((ctrl_dst->ldctl_value.bv_val = malloc(len)) - == NULL) { - free(ctrl_dst->ldctl_oid); - return (LDAP_NO_MEMORY); - } - SAFEMEMCPY(ctrl_dst->ldctl_value.bv_val, - ctrl_src->ldctl_value.bv_val, len); - } - - return (LDAP_SUCCESS); -} - - -LDAPControl ** ldap_controls_dup(LDAPControl ** ctrls) -{ - int i; - LDAPControl **newctrls; - - for (i = 0; ctrls[i] != NULL; i++); - newctrls = (LDAPControl **)calloc(i+1, sizeof(LDAPControl*)); - if (newctrls == NULL) { - return (NULL); - } - - for (i = 0; ctrls[i] != NULL; i++) { - newctrls[i] = ldap_control_dup(ctrls[i]); - if (newctrls[i] == NULL) { - ldap_controls_free(newctrls); - return (NULL); - } - } - return (newctrls); -} - -int ldap_controls_code (BerElement *ber, LDAPControl **ctrls) -{ - int i, rc; - - if (ctrls && ctrls[0]){ - rc = ber_printf(ber, "t{", LDAP_TAG_CONTROL_LIST); - if (rc == -1){ - ber_free(ber, 1); - return(LDAP_ENCODING_ERROR); - } - - for (i = 0; ctrls[i] != NULL; i++){ - rc = ber_printf(ber, "{s", ctrls[i]->ldctl_oid); - if (rc == -1){ - ber_free(ber, 1); - return(LDAP_ENCODING_ERROR); - } - if (ctrls[i]->ldctl_iscritical){ - rc = ber_printf(ber, "b", ctrls[i]->ldctl_iscritical); - if (rc == -1){ - ber_free(ber, 1); - return(LDAP_ENCODING_ERROR); - } - } - - if (ctrls[i]->ldctl_value.bv_val) - rc = ber_printf(ber, "o}", ctrls[i]->ldctl_value.bv_val, ctrls[i]->ldctl_value.bv_len); - else - rc = ber_printf(ber, "}"); - if (rc == -1){ - ber_free(ber, 1); - return(LDAP_ENCODING_ERROR); - } - } - - rc = ber_printf(ber, "}"); - if (rc == -1){ - ber_free(ber, 1); - return(LDAP_ENCODING_ERROR); - } - } - return (LDAP_SUCCESS); -} - -/* Decode the sequence of control from the ber, return a NULL terminated list of LDAPControl* */ -LDAPControl ** ldap_controls_decode(BerElement *ber, int *errcode) -{ - LDAPControl ** ctrls = NULL; - - char *opaque; - unsigned int tag, len; - int i = 0, count = 0; - - BerElement tmpber = *ber; - - for (tag = ber_first_element(&tmpber, &len, &opaque); - tag != LBER_DEFAULT; - tag = ber_next_element(&tmpber, &len, opaque )) { - count ++; - ber_skip_tag(&tmpber, &len); - } - - - if ((ctrls = (LDAPControl **)calloc(count + 1, sizeof(LDAPControl *))) == NULL){ - *errcode = LDAP_NO_MEMORY; - return(NULL); - } - - for (tag = ber_first_element(ber, &len, &opaque ); - tag != LBER_DEFAULT; - tag = ber_next_element (ber, &len, opaque )) { - LDAPControl *aCtrl; - unsigned int ttag, tlen; - - if ((aCtrl = (LDAPControl *)calloc(1, sizeof(LDAPControl))) == NULL) { - *errcode = LDAP_NO_MEMORY; - ldap_controls_free(ctrls); - return (NULL); - } - if (ber_scanf(ber, "{a", &aCtrl->ldctl_oid) == LBER_ERROR){ - *errcode = LDAP_PROTOCOL_ERROR; - free(aCtrl); - ldap_controls_free(ctrls); - return (NULL); - } - aCtrl->ldctl_iscritical = 0; - ttag = ber_peek_tag(ber, &tlen); - if (ttag == 0x01) { /* Boolean : criticality */ - if (ber_scanf(ber, "b", &aCtrl->ldctl_iscritical) == LBER_ERROR){ - *errcode = LDAP_PROTOCOL_ERROR; - free(aCtrl); - ldap_controls_free(ctrls); - return (NULL); - } - ttag = ber_peek_tag(ber, &tlen); - } - if (ttag == 0x04) { /* Octet string : value (it's optional)*/ - if (ber_scanf(ber, "o", &aCtrl->ldctl_value) == LBER_ERROR){ - *errcode = LDAP_PROTOCOL_ERROR; - free(aCtrl); - ldap_controls_free(ctrls); - return (NULL); - } - - } else if (ttag != LBER_DEFAULT){ - *errcode = LDAP_PROTOCOL_ERROR; - free(aCtrl); - ldap_controls_free(ctrls); - return (NULL); - } - - if (ber_scanf(ber, "}") == LBER_ERROR){ - *errcode = LDAP_PROTOCOL_ERROR; - free(aCtrl); - ldap_controls_free(ctrls); - return (NULL); - } - /* add aCtrl in ctrls */ - ctrls[i++] = aCtrl; - } - return (ctrls); -} - -/* build an allocated LDAPv3 control. Returns an LDAP error code. */ -int ldap_build_control(char *oid, BerElement *ber, int freeber, -char iscritical, LDAPControl **ctrlp) -{ - int rc; - struct berval *bvp; - - if (ber == NULL) { - bvp = NULL; - } else { - /* allocate struct berval with contents of the BER encoding */ - rc = ber_flatten(ber, &bvp); - if (freeber) { - ber_free(ber, 1); - } - if (rc == -1) { - return (LDAP_NO_MEMORY); - } - } - - /* allocate the new control structure */ - if ((*ctrlp = (LDAPControl *)calloc(1, sizeof (LDAPControl))) - == NULL) { - if (bvp != NULL) { - ber_bvfree(bvp); - } - return (LDAP_NO_MEMORY); - } - - /* fill in the fields of this new control */ - (*ctrlp)->ldctl_iscritical = iscritical; - if (((*ctrlp)->ldctl_oid = strdup(oid)) == NULL) { - free(*ctrlp); - *ctrlp = NULL; - if (bvp != NULL) { - ber_bvfree(bvp); - } - return (LDAP_NO_MEMORY); - } - - if (bvp == NULL) { - (*ctrlp)->ldctl_value.bv_len = 0; - (*ctrlp)->ldctl_value.bv_val = NULL; - } else { - (*ctrlp)->ldctl_value = *bvp; /* struct copy */ - free(bvp); /* free container, not contents! */ - } - - return (LDAP_SUCCESS); -} |