- /* Update slap_known_controls, too. */
- slap_known_controls[num_known_controls-1] = sc->sc_oid;
- slap_known_controls[num_known_controls++] = NULL;
+ sc->sc_oid = ch_strdup( controloid );
+ sc->sc_cid = num_known_controls;
+
+ /* Update slap_known_controls, too. */
+ slap_known_controls[num_known_controls - 1] = sc->sc_oid;
+ slap_known_controls[num_known_controls++] = NULL;
+
+ LDAP_SLIST_NEXT( sc, sc_next ) = NULL;
+ LDAP_SLIST_INSERT_HEAD( &controls_list, sc, sc_next );
+
+ } else {
+ if ( sc->sc_extendedopsbv ) {
+ /* FIXME: in principle, we should rather merge
+ * existing extops with those supported by the
+ * new control handling implementation.
+ * In fact, whether a control is compatible with
+ * an extop should not be a matter of implementation.
+ * We likely also need a means for a newly
+ * registered extop to declare that it is
+ * comptible with an already registered control.
+ */
+ ber_bvarray_free( sc->sc_extendedopsbv );
+ sc->sc_extendedopsbv = NULL;
+ sc->sc_extendedops = NULL;
+ }
+ }
+
+ sc->sc_extendedopsbv = extendedopsbv;
+ sc->sc_mask = controlmask;
+ sc->sc_parse = controlparsefn;
+ if ( controlcid ) {
+ *controlcid = sc->sc_cid;
+ }