Complete Contents
Getting Started
Chapter 1 Understanding Server Plug-Ins
Chapter 2 Writing and Compiling Plug-Ins
Chapter 3 Calling the Front-End API Functions
Chapter 4 Quick Start
Chapter 5 Writing Database Plug-Ins
Chapter 6 Writing Pre/Post-Operation Plug-Ins
Chapter 7 Defining Functions for LDAP Operations
Chapter 8 Defining Functions for Database Operations
Chapter 9 Defining Functions for Authentication
Chapter 10 Writing Entry Store/Fetch Plug-Ins
Chapter 11 Writing Extended Operation Plug-Ins
Chapter 12 Writing Matching Rule Plug-Ins
Chapter 13 Data Type and Structure Reference
Chapter 14 Function Reference
Chapter 15 Parameter Reference
Glossary
Previous Next Contents Bookshelf


Chapter 11 Writing Extended Operation Plug-Ins

This chapter explains how to write plug-in functions to handle extended operations (which are defined in the LDAP v3 protocol).


How Extended Operation Plug-Ins Work
Extended operations are part of the LDAP v3 protocol. You can define your own operation that you want the server to perform, and you can assign an OID to identify that operation.

LDAP clients can request the operation by sending an extended operation request. Within the request, the client specifies:

When the Directory Server receives the request, the server calls the plug-in registered with the specified OID. The plug-in function has access to both the OID and the data in the client's request. The function can send back to the client a response containing:

In order to use extended operations, you need to configure both the server and the client to understand the specific extended operation that you want performed.


Writing Extended Operation Functions
Like other plug-in functions, extended operation functions pass a single parameter block and return an integer value:

int my_ext_func( Slapi_PBlock *pb );

These functions should return 0 if successful and a non-zero value if unsuccessful.

When the Directory Server receives an extended operation request, the front-end calls the extended operation function with the same OID as specified in the request.

The front-end makes the following information available in the form of parameters in a parameter block.
Parameter ID
Data Type
Description
SLAPI_EXT_OP_REQ_OID

char *

Object ID (OID) of the extended operation specified in the request.
SLAPI_EXT_OP_REQ_VALUE

struct berval*

Value specified in the request.
SLAPI_EXT_OP_RET_OID

char *

Object ID (OID) that you want sent back to the client.
SLAPI_EXT_OP_RET_VALUE

struct berval*

Value that you want sent back to the client.

Typically, your function should perform some operation on the value specified in the SLAPI_EXT_OP_REQ_VALUE parameter.

Your function should return one of the following values:


Registering Extended Operation Functions
As is the case with other server plug-in functions (see "Working with Parameter Blocks" on page  30), extended operation functions are specified in a parameter block that you can set on server startup.

In your initialization function, you can call the slapi_pblock_set() function to set the SLAPI_PLUGIN_EXT_OP_FN parameter to your function and the SLAPI_PLUGIN_EXT_OP_OIDLIST parameter to the list of OIDs of the extended operations supported by your function.

You can write your initialization function so that the OID is passed in from the directive. (See "Passing Extra Arguments to the Plug-Ins" on page  45 for details.) For example, the following initialization function sets the SLAPI_PLUGIN_EXT_OP_OIDLIST parameter to the additional parameters specified i

int

extended_init( Slapi_PBlock *pb )

{

int i;

char **argv;

char **oids;

/* Get the additional arguments specified in the directive */

if ( slapi_pblock_get( pb, SLAPI_PLUGIN_ARGV, &argv ) != 0 ) {

slapi_log_error( SLAPI_LOG_PLUGIN, "extended_init",

"Server could not get argv.\n" );

return( -1 );

}

if ( argv == NULL ) {

slapi_log_error( SLAPI_LOG_PLUGIN, "extended_init",

"Required argument <oiD> is missing\n" );

return( -1 );

}

/* Get the number of additional arguments and copy them. */

for ( i = 0; argv[i] != NULL; i++ )

;

oids = (char **) slapi_ch_malloc( (i+1) * sizeof(char *) );

for ( i = 0; argv[i] != NULL; i++ ) {

oids[i] = slapi_ch_strdup( argv[i] );

}

oids[i] = NULL;

/* Specify the version of the plug-in */

if ( slapi_pblock_set( pb, SLAPI_PLUGIN_VERSION,

SLAPI_PLUGIN_VERSION_01 ) != 0 ||

/* Specify the OID of the extended operation */

slapi_pblock_set( pb, SLAPI_PLUGIN_EXT_OP_OIDLISTs,

(void*) oids ) != 0 ||

/* Specify the function that the server should call */

slapi_pblock_set( pb, SLAPI_PLUGIN_EXT_OP_FN,

(void*) extended_op ) != 0 ) {

slapi_log_error( SLAPI_LOG_PLUGIN, "extended_init",

"An error occurred.\n" );

return( -1 );

}

slapi_log_error( SLAPI_LOG_PLUGIN, "extended_init",

"Plug-in sucessfully registered.\n" );

return(0);

}

In the slapd.conf configuration file. Add a directive in the following form to specify the name and location of your plug-in function and to specify the object identification (OID) of the operation:

plugin extendedop <library_name> <function_name> <OID>

<library_name> is the name and path to your shared library or dynamic link library, <function_name> is the name of your plug-in function, and <OID> is the object identifier of the extended operation.

For example, the following directive registers the function named my_ext_op() as the extended operation plug-in function for the operation with the OID 1.2.3.4.

plugin extendedop /usr/nslib/myext.so my_ext_op 1.2.3.4

Note. Each extended operation plug-in is associated with a back-end. Make sure that the plugin directive that registers the plug-in is within the database section for that back-end in the slapd.conf file. (The plugin directive should be after the database directive and before the next database directive, if any.)


Specifying Start and Close Functions
For each extended operation plug-in, you can specify the name of a function to be called after the server starts and before the server is shut down.

Use the following parameters to specify these functions:
SLAPI_PLUGIN_START_FN

Specifies the function called after the Directory Server starts up.
SLAPI_PLUGIN_CLOSE_FN

Specifies the function called before the Directory Server shuts down.

If you register multiple plug-ins with different start and close functions, the functions are called in the order that the plug-ins are registered (in other words, in the order that the plugin directives appear in the slapd.conf file).

 

© Copyright 1998 Netscape Communications Corporation