Author: nkinder
Update of /cvs/dirsec/ldapserver/ldap/servers/plugins/memberof
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv18174/ldap/servers/plugins/memberof
Modified Files:
memberof.c
Log Message:
Resolves: 439907
Summary: Enhanced SLAPI task API and ported existing tasks to use new API.
Index: memberof.c
===================================================================
RCS file: /cvs/dirsec/ldapserver/ldap/servers/plugins/memberof/memberof.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- memberof.c 28 Mar 2008 21:45:52 -0000 1.4
+++ memberof.c 3 Apr 2008 16:52:46 -0000 1.5
@@ -49,10 +49,10 @@
*
* To start the memberof task add an entry like:
*
- * dn: cn=memberof task 2, cn=memberof task, cn=tasks, cn=config
+ * dn: cn=mytask, cn=memberof task, cn=tasks, cn=config
* objectClass: top
* objectClass: extensibleObject
- * cn: sample task
+ * cn: mytask
* basedn: dc=example, dc=com
* filter: (uid=test4)
*
@@ -75,7 +75,6 @@
#define MEMBEROF_GROUP_ATTR "member"
#define MEMBEROF_ATTR "memberof"
#define MEMBEROF_GROUP_ATTR_IS_DN 1
-#define MEMBEROF_GROUP_ATTR_TYPE "uid"
#define MEMBEROF_GROUP_FILTER "(" MEMBEROF_GROUP_ATTR "=*)"
#define MEMBEROF_PLUGIN_SUBSYSTEM "memberof-plugin" /* used for logging */
@@ -92,50 +91,6 @@
void *next;
} memberofstringll;
-
-
-/****** secrets *********/
-
-/*from FDS slap.h
- * until we get a proper api for access
- */
-#define TASK_RUNNING_AS_TASK 0x0
-
-/*from FDS slapi-private.h
- * until we get a proper api for access
- */
-
-
-#define SLAPI_DSE_CALLBACK_OK (1)
-#define SLAPI_DSE_CALLBACK_ERROR (-1)
-#define SLAPI_DSE_CALLBACK_DO_NOT_APPLY (0)
-
-/******************************************************************************
- * Online tasks interface (to support import, export, etc)
- * After some cleanup, we could consider making these public.
- */
-struct _slapi_task {
- struct _slapi_task *next;
- char *task_dn;
- int task_exitcode; /* for the end user */
- int task_state; /* (see above) */
- int task_progress; /* number between 0 and task_work */
- int task_work; /* "units" of work to be done */
- int task_flags; /* (see above) */
-
- /* it is the task's responsibility to allocate this memory & free it: */
- char *task_status; /* transient status info */
- char *task_log; /* appended warnings, etc */
-
- void *task_private; /* for use by backends */
- TaskCallbackFn cancel; /* task has been cancelled by user */
- TaskCallbackFn destructor; /* task entry is being destroyed */
- int task_refcount;
-};
-
-/****** secrets ********/
-
-
/*** function prototypes ***/
/* exported functions */
@@ -169,7 +124,7 @@
static int memberof_del_attr_list(Slapi_PBlock *pb, char *groupdn, Slapi_Attr *attr);
static int memberof_moddn_attr_list(Slapi_PBlock *pb, char *pre_dn, char *post_dn,
Slapi_Attr *attr);
-static int memberofd_replace_list(Slapi_PBlock *pb, char *group_dn);
+static int memberof_replace_list(Slapi_PBlock *pb, char *group_dn);
static void memberof_set_plugin_id(void * plugin_id);
static void *memberof_get_plugin_id();
static int memberof_compare(const void *a, const void *b);
@@ -195,9 +150,10 @@
static int memberof_task_add(Slapi_PBlock *pb, Slapi_Entry *e,
Slapi_Entry *eAfter, int *returncode, char *returntext,
void *arg);
+static void memberof_task_destructor(Slapi_Task *task);
static const char *fetch_attr(Slapi_Entry *e, const char *attrname,
const char *default_val);
-static void memberof_memberof_fixup_task_thread(void *arg);
+static void memberof_fixup_task_thread(void *arg);
static int memberof_fix_memberof(char *dn, char *filter_str);
static int memberof_fix_memberof_callback(Slapi_Entry *e, void *callback_data);
@@ -511,6 +467,8 @@
memberof_lock();
+ /* get a list of member attributes present in the group
+ * entry that is being renamed. */
if(0 == slapi_entry_attr_find(post_e, MEMBEROF_GROUP_ATTR, &attr))
{
memberof_moddn_attr_list(pb, pre_dn, post_dn, attr);
@@ -656,7 +614,7 @@
{
/* If there are no values in the smod, we should
* just do a replace instead. The user is just
- * trying to delete all members from this this
+ * trying to delete all members from this group
* entry, which the replace code deals with. */
if (slapi_mod_get_num_values(smod) == 0)
{
@@ -673,7 +631,7 @@
case LDAP_MOD_REPLACE:
{
/* replace current values */
- memberofd_replace_list(pb, dn);
+ memberof_replace_list(pb, dn);
break;
}
@@ -877,6 +835,14 @@
{
op_str = "ADD";
}
+ else if(LDAP_MOD_REPLACE == mod_op)
+ {
+ op_str = "REPLACE";
+ }
+ else
+ {
+ op_str = "UNKNOWN";
+ }
slapi_log_error( SLAPI_LOG_PLUGIN, MEMBEROF_PLUGIN_SUBSYSTEM,
"memberof_modop_one_r: %s %s in %s\n"
@@ -1347,7 +1313,7 @@
return rc;
}
-/* memberof_memberof_search_callback()
+/* memberof_test_membership()
* for each attribute in the memberof attribute
* determine if the entry is still a member
*
@@ -1517,7 +1483,7 @@
* Perform replace the group DN list in the memberof attribute of the list of targets
*
*/
-int memberofd_replace_list(Slapi_PBlock *pb, char *group_dn)
+int memberof_replace_list(Slapi_PBlock *pb, char *group_dn)
{
struct slapi_entry *pre_e = NULL;
struct slapi_entry *post_e = NULL;
@@ -1876,29 +1842,22 @@
slapi_unlock_mutex(memberof_operation_lock);
}
-/*
- *
- */
-
typedef struct _task_data
{
char *dn;
char *filter_str;
- Slapi_Task *task;
} task_data;
-void memberof_memberof_fixup_task_thread(void *arg)
+void memberof_fixup_task_thread(void *arg)
{
- task_data *td = (task_data *)arg;
- Slapi_Task *task = td->task;
+ Slapi_Task *task = (Slapi_Task *)arg;
+ task_data *td = NULL;
int rc = 0;
- task->task_work = 1;
- task->task_progress = 0;
- task->task_state = SLAPI_TASK_RUNNING;
-
- slapi_task_status_changed(task);
+ /* Fetch our task data from the task */
+ td = (task_data *)slapi_task_get_data(task);
+ slapi_task_begin(task, 1);
slapi_task_log_notice(task, "Memberof task starts (arg: %s) ...\n",
td->filter_str);
@@ -1907,20 +1866,10 @@
slapi_task_log_notice(task, "Memberof task finished.");
slapi_task_log_status(task, "Memberof task finished.");
+ slapi_task_inc_progress(task);
- task->task_progress = 1;
- task->task_exitcode = rc;
- task->task_state = SLAPI_TASK_FINISHED;
- slapi_task_status_changed(task);
-
- slapi_ch_free_string(&td->dn);
- slapi_ch_free_string(&td->filter_str);
-
- {
- /* make the compiler happy */
- void *ptd = td;
- slapi_ch_free(&ptd);
- }
+ /* this will queue the destruction of the task */
+ slapi_task_finish(task, rc);
}
/* extract a single value from the entry (as a string) -- if it's not in the
@@ -1966,13 +1915,7 @@
goto out;
}
- /* allocate new task now */
- task = slapi_new_task(slapi_entry_get_ndn(e));
- task->task_state = SLAPI_TASK_SETUP;
- task->task_work = 1;
- task->task_progress = 0;
-
- /* create a pblock to pass the necessary info to the task thread */
+ /* setup our task data */
mytaskdata = (task_data*)slapi_ch_malloc(sizeof(task_data));
if (mytaskdata == NULL)
{
@@ -1982,11 +1925,19 @@
}
mytaskdata->dn = slapi_ch_strdup(dn);
mytaskdata->filter_str = slapi_ch_strdup(filter);
- mytaskdata->task = task;
+
+ /* allocate new task now */
+ task = slapi_new_task(slapi_entry_get_ndn(e));
+
+ /* register our destructor for cleaning up our private data */
+ slapi_task_set_destructor_fn(task, memberof_task_destructor);
+
+ /* Stash a pointer to our data in the task */
+ slapi_task_set_data(task, mytaskdata);
/* start the sample task as a separate thread */
- thread = PR_CreateThread(PR_USER_THREAD, memberof_memberof_fixup_task_thread,
- (void *)mytaskdata, PR_PRIORITY_NORMAL, PR_GLOBAL_THREAD,
+ thread = PR_CreateThread(PR_USER_THREAD, memberof_fixup_task_thread,
+ (void *)task, PR_PRIORITY_NORMAL, PR_GLOBAL_THREAD,
PR_UNJOINABLE_THREAD, SLAPD_DEFAULT_THREAD_STACKSIZE);
if (thread == NULL)
{
@@ -1994,28 +1945,29 @@
"unable to create task thread!\n");
*returncode = LDAP_OPERATIONS_ERROR;
rv = SLAPI_DSE_CALLBACK_ERROR;
-
- slapi_ch_free_string(&mytaskdata->dn);
- slapi_ch_free_string(&mytaskdata->filter_str);
-
- {
- void *ptask = mytaskdata;
- slapi_ch_free(&ptask);
- goto out;
- }
+ slapi_task_finish(task, *returncode);
+ } else {
+ rv = SLAPI_DSE_CALLBACK_OK;
}
- /* thread successful -- don't free the pb, let the thread do that. */
- return SLAPI_DSE_CALLBACK_OK;
-
out:
- if (task)
- {
- slapi_destroy_task(task);
- }
return rv;
}
+void
+memberof_task_destructor(Slapi_Task *task)
+{
+ if (task) {
+ task_data *mydata = (task_data *)slapi_task_get_data(task);
+ if (mydata) {
+ slapi_ch_free_string(&mydata->dn);
+ slapi_ch_free_string(&mydata->filter_str);
+ /* Need to cast to avoid a compiler warning */
+ slapi_ch_free((void **)&mydata);
+ }
+ }
+}
+
int memberof_fix_memberof(char *dn, char *filter_str)
{
int rc = 0;