]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
ITS#8473 Implement ordering stable (de)registration
authorOndřej Kuzník <ondra@mistotebe.net>
Wed, 10 Jun 2020 09:34:50 +0000 (10:34 +0100)
committerQuanah Gibson-Mount <quanah@openldap.org>
Sun, 21 Jun 2020 22:53:14 +0000 (22:53 +0000)
servers/slapd/bconfig.c
servers/slapd/slapi/plugin.c
servers/slapd/slapi/proto-slapi.h

index 101a7532960ea3b2430620045600ef5f5ec71ac3..81566fc7e25d90e2edddd2543b3bd94f9ed069f6 100644 (file)
@@ -1418,8 +1418,13 @@ config_generic(ConfigArgs *c) {
                case CFG_SYNC_SUBENTRY:
                        break;
 
-               /* no-ops, requires slapd restart */
+#ifdef LDAP_SLAPI
                case CFG_PLUGIN:
+                       slapi_int_unregister_plugins(c->be, c->valx);
+                       break;
+#endif
+
+               /* no-op, requires slapd restart */
                case CFG_MODLOAD:
                        snprintf(c->log, sizeof( c->log ), "change requires slapd restart");
                        break;
@@ -2409,7 +2414,7 @@ sortval_reject:
 
 #ifdef LDAP_SLAPI
                case CFG_PLUGIN:
-                       if(slapi_int_read_config(c->be, c->fname, c->lineno, c->argc, c->argv) != LDAP_SUCCESS)
+                       if(slapi_int_read_config(c->be, c->fname, c->lineno, c->argc, c->argv, c->valx) != LDAP_SUCCESS)
                                return(1);
                        slapi_plugins_used++;
                        break;
index 0212ad1cd0662586281b6b73c78f630af6cc2e5d..92756083b5486ba41b9c8e82df1fd106c2466cae 100644 (file)
@@ -129,7 +129,7 @@ done:
 /*********************************************************************
  * Function Name:      slapi_int_register_plugin
  *
- * Description:        insert the slapi_pblock structure to the end of the plugin
+ * Description:        insert the slapi_pblock structure to a given position the end of the plugin
  *                     list 
  *
  * Input:              a pointer to a plugin slapi_pblock structure to be added to 
@@ -143,21 +143,23 @@ done:
  * Messages:           None
  *********************************************************************/
 int 
-slapi_int_register_plugin(
+slapi_int_register_plugin_index(
        Backend *be, 
-       Slapi_PBlock *pPB )
+       Slapi_PBlock *pPB,
+       int index )
 { 
        Slapi_PBlock    *pTmpPB;
        Slapi_PBlock    *pSavePB;
-       int              rc = LDAP_SUCCESS;
+       int             pos = 0, rc = LDAP_SUCCESS;
 
        assert( be != NULL );
 
        pTmpPB = SLAPI_BACKEND_PBLOCK( be );
-       if ( pTmpPB == NULL ) {
+       if ( pTmpPB == NULL || index == 0 ) {
                SLAPI_BACKEND_PBLOCK( be ) = pPB;
        } else {
-               while ( pTmpPB != NULL && rc == LDAP_SUCCESS ) {
+               while ( pTmpPB != NULL && rc == LDAP_SUCCESS &&
+                               ( index < 0 || pos++ < index ) ) {
                        pSavePB = pTmpPB;
                        rc = slapi_pblock_get( pTmpPB, SLAPI_IBM_PBLOCK, &pTmpPB );
                }
@@ -166,10 +168,22 @@ slapi_int_register_plugin(
                        rc = slapi_pblock_set( pSavePB, SLAPI_IBM_PBLOCK, (void *)pPB ); 
                }
        }
+
+       if ( index >= 0 && rc == LDAP_SUCCESS ) {
+               rc = slapi_pblock_set( pPB, SLAPI_IBM_PBLOCK, (void *)pTmpPB );
+       }
      
        return ( rc != LDAP_SUCCESS ) ? LDAP_OTHER : LDAP_SUCCESS;
 }
-       
+
+int
+slapi_int_register_plugin(
+       Backend *be,
+       Slapi_PBlock *pPB )
+{
+       return slapi_int_register_plugin_index( be, pPB, -1 );
+}
+
 /*********************************************************************
  * Function Name:      slapi_int_get_plugins
  *
@@ -630,7 +644,8 @@ slapi_int_read_config(
        const char      *fname, 
        int             lineno, 
        int             argc, 
-       char            **argv )
+       char            **argv,
+       int             index )
 {
        int             iType = -1;
        int             numPluginArgc = 0;
@@ -690,7 +705,7 @@ slapi_int_read_config(
                        }
                }
 
-               rc = slapi_int_register_plugin( be, pPlugin );
+               rc = slapi_int_register_plugin_index( be, pPlugin, index );
                if ( rc != LDAP_SUCCESS ) {
                        if ( iType == SLAPI_PLUGIN_EXTENDEDOP ) {
                                slapi_int_unregister_extop( be, &pGExtendedOps, pPlugin );
@@ -703,6 +718,74 @@ slapi_int_read_config(
        return 0;
 }
 
+int
+slapi_int_unregister_plugin(
+       Backend *be,
+       Slapi_PBlock *pPlugin,
+       Slapi_PBlock *pPrev
+)
+{
+       int type;
+
+       assert( pPlugin != NULL );
+
+       slapi_pblock_get( pPlugin, SLAPI_PLUGIN_TYPE, (void *)&type );
+       if ( type == SLAPI_PLUGIN_EXTENDEDOP ) {
+               slapi_int_unregister_extop( be, &pGExtendedOps, pPlugin );
+       }
+
+       if ( pPrev != NULL ) {
+               Slapi_PBlock *pNext = NULL;
+
+               slapi_pblock_get( pPlugin, SLAPI_IBM_PBLOCK, &pNext );
+               slapi_pblock_set( pPrev, SLAPI_IBM_PBLOCK, &pNext );
+       }
+       slapi_pblock_destroy( pPlugin );
+
+       return LDAP_SUCCESS;
+}
+
+int
+slapi_int_unregister_plugins(
+       Backend *be,
+       int index
+)
+{
+       Slapi_PBlock    *pTmpPB = NULL;
+       Slapi_PBlock    *pSavePB = NULL;
+       int rc = LDAP_SUCCESS;
+
+       pTmpPB = SLAPI_BACKEND_PBLOCK( be );
+       if ( pTmpPB == NULL ) {
+               return ( index < 0 ) ? LDAP_SUCCESS : LDAP_OTHER;
+       }
+
+       if ( index < 0 ) {
+               /* All plugins must go */
+               while ( pTmpPB != NULL && rc == LDAP_SUCCESS ) {
+                       pSavePB = pTmpPB;
+                       rc = slapi_pblock_get( pTmpPB, SLAPI_IBM_PBLOCK, &pTmpPB );
+                       if ( pSavePB != NULL ) {
+                               slapi_int_unregister_plugin( be, pSavePB, NULL );
+                       }
+               }
+       } else if ( index == 0 ) {
+               slapi_pblock_get( pTmpPB, SLAPI_IBM_PBLOCK, &pSavePB );
+               SLAPI_BACKEND_PBLOCK( be ) = pSavePB;
+               slapi_int_unregister_plugin( be, pTmpPB, NULL );
+       } else {
+               int pos = -1;
+               while ( pTmpPB != NULL && rc == LDAP_SUCCESS && ++pos < index ) {
+                       pSavePB = pTmpPB;
+                       rc = slapi_pblock_get( pTmpPB, SLAPI_IBM_PBLOCK, &pTmpPB );
+               }
+               if ( pos == index ) {
+                       slapi_int_unregister_plugin( be, pTmpPB, pSavePB );
+               }
+       }
+       return rc;
+}
+
 void
 slapi_int_plugin_unparse(
        Backend *be,
index 6d7203d7ea1313e4e8df4f15e8b01f5f5660dcda..9c9bc69b59caf4c6a7a8e16bcf49445bf4c47fb3 100644 (file)
@@ -65,13 +65,15 @@ LDAP_SLAPI_F (int) slapi_int_pblock_get_next LDAP_P(( Slapi_PBlock **pb ));
        
 /* plugin.c */
 LDAP_SLAPI_F (int) slapi_int_register_plugin LDAP_P((Backend *be, Slapi_PBlock *pPB));
+LDAP_SLAPI_F (int) slapi_int_register_plugin_index LDAP_P((Backend *be, Slapi_PBlock *pPB, int index));
 LDAP_SLAPI_F (int) slapi_int_call_plugins LDAP_P((Backend *be, int funcType, Slapi_PBlock * pPB));
 LDAP_SLAPI_F (int) slapi_int_get_plugins LDAP_P((Backend *be, int functype, SLAPI_FUNC **ppFuncPtrs));
 LDAP_SLAPI_F (int) slapi_int_register_extop LDAP_P((Backend *pBE, ExtendedOp **opList, Slapi_PBlock *pPB));
 LDAP_SLAPI_F (int) slapi_int_get_extop_plugin LDAP_P((struct berval  *reqoid, SLAPI_FUNC *pFuncAddr ));
 LDAP_SLAPI_F (struct berval *) slapi_int_get_supported_extop LDAP_P(( int ));
+LDAP_SLAPI_F (int) slapi_int_unregister_plugins LDAP_P((Backend *be, int index));
 LDAP_SLAPI_F (int) slapi_int_read_config LDAP_P((Backend *be, const char *fname, int lineno,
-               int argc, char **argv ));
+               int argc, char **argv, int index ));
 LDAP_SLAPI_F (void) slapi_int_plugin_unparse LDAP_P((Backend *be, BerVarray *out ));
 LDAP_SLAPI_F (int) slapi_int_initialize LDAP_P((void));