LDAP Patch

S Kalyanasundaram skalyanasundaram at novell.com
Mon Jan 21 03:40:13 UTC 2008


> I would like to have a look at it, sounds interesting. But we are using 
> Ubuntu and Cent OS -  could you please provide the diffs ?

Here it is, You should be able to apply on top of
http://home.ntelos.net/~masneyb/dhcp-3.0.5-ldap-patch without any
problem. 


--- server/ldap.c
+++ server/ldap.c	2007/03/01 11:22:25
@@ -1121,8 +1121,8 @@
     }
 
   while (ldap_stack != NULL && 
-         (ldap_stack->ldent == NULL ||
-          (ldap_stack->ldent = ldap_next_entry (ld, ldap_stack->ldent))
== NULL))
+         (ldap_stack->ldent == NULL || ( ldap_stack->processed &&
+          (ldap_stack->ldent = ldap_next_entry (ld, ldap_stack->ldent))
== NULL)))
     {
       if (ldap_stack->close_brace)
         {
@@ -1257,9 +1257,9 @@
 {
   char **objectClass, *dn;
   struct ldap_config_stack *entry;
-  LDAPMessage * ent, * res;
+  LDAPMessage *ent, *res, *entfirst, *resfirst;
   int i, j, ignore, found;
-  int ret;
+  int ret, parsedn = 1;
 
   if (ld == NULL)
     ldap_start ();
@@ -1271,6 +1271,7 @@
                                       "objectClass")) == NULL)
     return;
     
+  entry->processed = 1;
   ignore = 0;
   found = 1;
   for (i=0; objectClass[i] != NULL; i++)
@@ -1331,18 +1332,32 @@
                            LDAP_BUFFER_SIZE-1, NULL);
 
   dn = ldap_get_dn (ld, entry->ldent);
-
+  if (dn == NULL)
+    {
+      ldap_stop();
+      return;
+    }
 #if defined(DEBUG_LDAP)
-  if (dn != NULL)
-    log_info ("Found LDAP entry '%s'", dn);
+  else
+    {
+      log_info ("Found LDAP entry '%s'", dn);
+    }
 #endif
 
-  if (dn == NULL ||
-      (ret = ldap_search_s (ld, dn, LDAP_SCOPE_ONELEVEL,
"objectClass=*", 
+  if ((ret = ldap_search_s (ld, dn, LDAP_SCOPE_ONELEVEL,
"(!(|(|(objectClass=dhcpTSigKey)(objectClass=dhcpClass))
(objectClass=dhcpFailOverPeer)))",
                             NULL, 0, &res)) != LDAP_SUCCESS)
     {
-      if (dn)
-        ldap_memfree (dn);
+      ldap_memfree (dn);
+
+      ldap_stop();
+      return;
+    }
+
+  if ((ret = ldap_search_s (ld, dn, LDAP_SCOPE_ONELEVEL,
"(|(|(objectClass=dhcpTSigKey)(objectClass=dhcpClass))
(objectClass=dhcpFailOverPeer))",
+                            NULL, 0, &resfirst)) != LDAP_SUCCESS)
+    {
+      ldap_memfree (dn);
+      ldap_msgfree (res);
 
       ldap_stop();
       return;
@@ -1350,17 +1365,32 @@
 
   ldap_memfree (dn);
 
-  if ((ent = ldap_first_entry (ld, res)) != NULL)
+  ent = ldap_first_entry(ld, res);
+  entfirst = ldap_first_entry(ld, resfirst);
+
+  if (ent == NULL && entfirst == NULL)
+    {
+      parse_external_dns (entry->ldent);
+      next_ldap_entry (cfile);
+    }
+
+  if (ent != NULL)
     {
       add_to_config_stack (res, ent);
       parse_external_dns (entry->ldent);
+      parsedn = 0;
     }
   else
+    ldap_msgfree (res);
+
+  if (entfirst != NULL)
     {
-      ldap_msgfree (res);
-      parse_external_dns (entry->ldent);
-      next_ldap_entry (cfile);
+      add_to_config_stack (resfirst, entfirst);
+      if(parsedn)
+        parse_external_dns (entry->ldent);
     }
+  else
+    ldap_msgfree (resfirst);
 }

Regards,
  -Kalyan

 
 





More information about the dhcp-users mailing list