+
+
+
+
+int CtdlRegisterDirectoryServiceFunc(int (*func)(char *cn, char *ou, void **object), int cmd, char *module)
+{
+ struct DirectoryServiceHook *newfcn;
+
+ newfcn = DirectoryServiceHookList;
+ while (newfcn)
+ {
+ if (newfcn->cmd == cmd && !strcmp(newfcn->module, module))
+ {
+ CtdlLogPrintf(CTDL_ERR, "Directory service function already handled by module %s\n", module);
+ return -1;
+ }
+ newfcn = newfcn->next;
+ }
+
+ newfcn = (struct DirectoryServiceHook *) malloc (sizeof(struct DirectoryServiceHook));
+ newfcn->handler = func;
+ newfcn->cmd = cmd;
+ newfcn->module = module;
+ newfcn->next = DirectoryServiceHookList;
+ DirectoryServiceHookList = newfcn;
+
+ CtdlLogPrintf(CTDL_INFO, "Registered a new directory service function from module %s\n", module);
+ return 0;
+}
+
+int CtdlDoDirectoryServiceFunc(char *cn, char *ou, void **object, char *module, int cmd)
+{
+ struct DirectoryServiceHook *curfcn;
+ struct DirectoryObject *our_object_list = NULL;
+ struct DirectoryObject *newobject = NULL;
+ struct DirectoryObject *oldobject = NULL;
+
+
+ curfcn = DirectoryServiceHookList;
+ if (object)
+ our_object_list = (struct DirectoryObject *) *object;
+
+ while (curfcn)
+ {
+ if (curfcn->cmd == cmd)
+ {
+ if (!module)
+ {
+ if (cmd == DIRECTORY_CREATE_OBJECT)
+ {
+ newobject = (struct DirectoryObject*) malloc (sizeof(struct DirectoryObject));
+ newobject->module = curfcn->module;
+ newobject->object = NULL;
+ newobject->next = our_object_list;
+ our_object_list = newobject;
+ }
+ if (our_object_list)
+ {
+ for(newobject = our_object_list; newobject; newobject=newobject->next)
+ {
+ if (!strcmp(newobject->module, curfcn->module))
+ (void) curfcn->handler(cn, ou, &newobject->object);
+ }
+ }
+ else
+ (void) curfcn->handler(cn, ou, NULL);
+
+ continue;
+ }
+ else
+ {
+ if(!strcmp(curfcn->module, module))
+ {
+ if (cmd == DIRECTORY_CREATE_OBJECT)
+ {
+ newobject = (struct DirectoryObject*) malloc (sizeof(struct DirectoryObject));
+ newobject->module = module;
+ newobject->object = NULL;
+ newobject->next = our_object_list;
+ our_object_list = newobject;
+ }
+ if (our_object_list)
+ {
+ for(newobject = our_object_list; newobject; newobject=newobject->next)
+ {
+ if (!strcmp(newobject->module, curfcn->module))
+ (void) curfcn->handler(cn, ou, &newobject->object);
+ }
+ }
+ else
+ (void) (curfcn->handler(cn, ou, NULL));
+
+ break;
+ }
+ }
+ }
+ curfcn=curfcn->next;
+ }
+ if (our_object_list)
+ {
+ *object = our_object_list;
+ if (cmd == DIRECTORY_FREE_OBJECT)
+ { // The objects pointed to by the list should have been freed by the module that created it
+ for(newobject = our_object_list; newobject; )
+ {
+ oldobject=newobject;
+ newobject=newobject->next;
+ free(oldobject);
+ }
+ *object=NULL;
+ }
+ }
+ return 0;
+}
+
+void CtdlDestroyDirectoryServiceFuncs(void)
+{
+ struct DirectoryServiceHook *cur, *next;
+
+ cur = DirectoryServiceHookList;
+ DirectoryServiceHookList = NULL;
+ while (cur)
+ {
+ next = cur->next;
+ CtdlLogPrintf(CTDL_INFO, "Destroyed directory service function for module %s.\n", cur->module);
+ free(cur);
+ cur = next;
+ }
+}
+
+/*
+ * Dirty hack until we impliment a hook mechanism for this
+ */
+void CtdlModuleStartCryptoMsgs(char *ok_response, char *nosup_response, char *error_response)
+{
+#ifdef HAVE_OPENSSL
+ CtdlStartTLS (ok_response, nosup_response, error_response);
+#endif
+}