/* * * Copyright 1999 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. * * * Comments: * */ #pragma ident "%Z%%M% %I% %E% SMI" #include #include #include "lber.h" #include "ldap.h" #include "ldap-private.h" #include "ldap-int.h" int ldap_create_virtuallist_control(LDAP *ld, LDAPVirtualList *ldvlistp, LDAPControl **ctrlp) { BerElement *ber; int rc; if (NULL == ld) return (LDAP_PARAM_ERROR); if (NULL == ctrlp || NULL == ldvlistp) return (LDAP_PARAM_ERROR); if ((ber = alloc_ber_with_options(ld)) == NULLBER) { ld->ld_errno = LDAP_NO_MEMORY; return (LDAP_NO_MEMORY); } if (ber_printf(ber, "{ii", ldvlistp->ldvlist_before_count, ldvlistp->ldvlist_after_count) == -1) { ld->ld_errno = LDAP_ENCODING_ERROR; ber_free(ber, 1); return (LDAP_ENCODING_ERROR); } if (NULL == ldvlistp->ldvlist_attrvalue) { if (ber_printf(ber, "t{ii}}", LDAP_TAG_VLV_BY_INDEX, ldvlistp->ldvlist_index, ldvlistp->ldvlist_size) == -1) { ld->ld_errno = LDAP_ENCODING_ERROR; ber_free(ber, 1); return (LDAP_ENCODING_ERROR); } } else { if (ber_printf(ber, "to}", LDAP_TAG_VLV_BY_VALUE, ldvlistp->ldvlist_attrvalue, strlen(ldvlistp->ldvlist_attrvalue)) == -1) { ld->ld_errno = LDAP_ENCODING_ERROR; ber_free(ber, 1); return (LDAP_ENCODING_ERROR); } } rc = ldap_build_control(LDAP_CONTROL_VLVREQUEST, ber, 1, 1, ctrlp); ld->ld_errno = rc; return (rc); } int ldap_parse_virtuallist_control(LDAP *ld, LDAPControl **ctrls, unsigned long *target_posp, unsigned long *list_sizep, int *errcodep) { BerElement *ber; int i, foundListControl; LDAPControl *listCtrlp; if (NULL == ld) return (LDAP_PARAM_ERROR); /* only ldapv3 or higher can do virtual lists. */ if (ld->ld_version != LDAP_VERSION3) { ld->ld_errno = LDAP_NOT_SUPPORTED; return (LDAP_NOT_SUPPORTED); } /* find the listControl in the list of controls if it exists */ if (ctrls == NULL) { ld->ld_errno = LDAP_NOT_SUPPORTED; return (LDAP_NOT_SUPPORTED); } foundListControl = 0; for (i = 0; ((ctrls[i] != NULL) && (!foundListControl)); i++) { foundListControl = !(strcmp(ctrls[i]->ldctl_oid, LDAP_CONTROL_VLVRESPONSE)); } if (!foundListControl) { ld->ld_errno = LDAP_CONTROL_NOT_FOUND; return (LDAP_CONTROL_NOT_FOUND); } else { /* let local var point to the listControl */ listCtrlp = ctrls[i-1]; } /* allocate a Ber element with the contents of the list_control's */ /* struct berval */ if ((ber = ber_init(&listCtrlp->ldctl_value)) == NULL) { ld->ld_errno = LDAP_NO_MEMORY; return (LDAP_NO_MEMORY); } /* decode the result from the Berelement */ if (LBER_ERROR == ber_scanf(ber, "{iie}", target_posp, list_sizep, errcodep)) { ld->ld_errno = LDAP_DECODING_ERROR; ber_free(ber, 1); return (LDAP_DECODING_ERROR); } /* the ber encoding is no longer needed */ ber_free(ber, 1); return (LDAP_SUCCESS); }