]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/extended.c
Fix rev 1.52, frontendDB uses index {-1}.
[openldap] / servers / slapd / extended.c
index e77ac961e7f8271e7a318a586e98f302470ac026..27e7ffd1ab1fad12936d797a2ebb1866c0a5c742 100644 (file)
@@ -41,7 +41,6 @@
 
 #define UNSUPPORTED_EXOP "unsupported extended operation"
 
-
 static struct extop_list {
        struct extop_list *next;
        struct berval oid;
@@ -56,17 +55,16 @@ static SLAP_EXTOP_MAIN_FN whoami_extop;
  * just a way to get built-in extops onto the extop list without
  * having a separate init routine for each built-in extop.
  */
-const struct berval slap_EXOP_CANCEL = BER_BVC(LDAP_EXOP_X_CANCEL);
-const struct berval slap_EXOP_WHOAMI = BER_BVC(LDAP_EXOP_X_WHO_AM_I);
-const struct berval slap_EXOP_MODIFY_PASSWD = BER_BVC(LDAP_EXOP_MODIFY_PASSWD);
-const struct berval slap_EXOP_START_TLS = BER_BVC(LDAP_EXOP_START_TLS);
-
 static struct {
        const struct berval *oid;
        slap_mask_t flags;
        SLAP_EXTOP_MAIN_FN *ext_main;
 } builtin_extops[] = {
-       { &slap_EXOP_CANCEL, SLAP_EXOP_HIDE, cancel_extop },
+#ifdef LDAP_X_TXN
+       { &slap_EXOP_TXN_START, 0, txn_start_extop },
+       { &slap_EXOP_TXN_END, 0, txn_end_extop },
+#endif
+       { &slap_EXOP_CANCEL, 0, cancel_extop },
        { &slap_EXOP_WHOAMI, 0, whoami_extop },
        { &slap_EXOP_MODIFY_PASSWD, SLAP_EXOP_WRITES, passwd_extop },
        { NULL, 0, NULL }
@@ -249,13 +247,15 @@ done:;
 }
 
 int
-load_extop(
+load_extop2(
        const struct berval *ext_oid,
        slap_mask_t ext_flags,
-       SLAP_EXTOP_MAIN_FN *ext_main )
+       SLAP_EXTOP_MAIN_FN *ext_main,
+       unsigned flags )
 {
        struct berval           oidm = BER_BVNULL;
        struct extop_list       *ext;
+       int                     insertme = 0;
 
        if ( !ext_main ) {
                return -1; 
@@ -276,25 +276,34 @@ load_extop(
 
        for ( ext = supp_ext_list; ext; ext = ext->next ) {
                if ( bvmatch( ext_oid, &ext->oid ) ) {
+                       if ( flags == 1 ) {
+                               break;
+                       }
                        return -1;
                }
        }
 
-       ext = ch_calloc(1, sizeof(struct extop_list) + ext_oid->bv_len + 1);
-       if (ext == NULL)
-               return(-1);
+       if ( flags == 0 || ext == NULL ) {
+               ext = ch_calloc( 1, sizeof(struct extop_list) + ext_oid->bv_len + 1 );
+               if ( ext == NULL ) {
+                       return(-1);
+               }
 
-       ext->flags = ext_flags;
+               ext->oid.bv_val = (char *)(ext + 1);
+               AC_MEMCPY( ext->oid.bv_val, ext_oid->bv_val, ext_oid->bv_len );
+               ext->oid.bv_len = ext_oid->bv_len;
+               ext->oid.bv_val[ext->oid.bv_len] = '\0';
 
-       ext->oid.bv_val = (char *)(ext + 1);
-       AC_MEMCPY( ext->oid.bv_val, ext_oid->bv_val, ext_oid->bv_len );
-       ext->oid.bv_len = ext_oid->bv_len;
-       ext->oid.bv_val[ext->oid.bv_len] = '\0';
+               insertme = 1;
+       }
 
+       ext->flags = ext_flags;
        ext->ext_main = ext_main;
-       ext->next = supp_ext_list;
 
-       supp_ext_list = ext;
+       if ( insertme ) {
+               ext->next = supp_ext_list;
+               supp_ext_list = ext;
+       }
 
        return(0);
 }
@@ -304,10 +313,10 @@ extops_init (void)
 {
        int i;
 
-       for (i = 0; builtin_extops[i].oid != NULL; i++) {
-               load_extop((struct berval *)builtin_extops[i].oid,
+       for ( i = 0; builtin_extops[i].oid != NULL; i++ ) {
+               load_extop( (struct berval *)builtin_extops[i].oid,
                        builtin_extops[i].flags,
-                       builtin_extops[i].ext_main);
+                       builtin_extops[i].ext_main );
        }
        return(0);
 }
@@ -338,6 +347,8 @@ find_extop( struct extop_list *list, struct berval *oid )
 }
 
 
+const struct berval slap_EXOP_WHOAMI = BER_BVC(LDAP_EXOP_WHO_AM_I);
+
 static int
 whoami_extop (
        Operation *op,
@@ -356,7 +367,8 @@ whoami_extop (
 
        op->o_bd = op->o_conn->c_authz_backend;
        if( backend_check_restrictions( op, rs,
-               (struct berval *)&slap_EXOP_WHOAMI ) != LDAP_SUCCESS ) {
+               (struct berval *)&slap_EXOP_WHOAMI ) != LDAP_SUCCESS )
+       {
                return rs->sr_err;
        }