Update option s2k-count to match the documentation.
[gnupg.git] / dirmngr / dirmngr_ldap.c
index f257507..8433bbf 100644 (file)
@@ -1,21 +1,21 @@
 /* dirmngr-ldap.c  -  The LDAP helper for dirmngr.
- *     Copyright (C) 2004 g10 Code GmbH
+ * Copyright (C) 2004 g10 Code GmbH
+ * Copyright (C) 2010 Free Software Foundation, Inc.
  *
- * This file is part of DirMngr.
+ * This file is part of GnuPG.
  *
- * DirMngr is free software; you can redistribute it and/or modify
+ * GnuPG is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
+ * the Free Software Foundation; either version 3 of the License, or
  * (at your option) any later version.
  *
- * DirMngr is distributed in the hope that it will be useful,
+ * GnuPG is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
 #include <config.h>
    ldap wrapper process we need to include the prototype for our
    module's main function.  */
 #ifdef USE_LDAPWRAPPER
-# define pth_enter() do { } while (0)
-# define pth_leave() do { } while (0)
+static void pth_enter (void) { }
+static void pth_leave (void) { }
 #else
 # include "./ldap-wrapper.h"
 #endif
 
+#ifdef HAVE_W32CE_SYSTEM
+# include "w32-ldap-help.h"
+# define my_ldap_init(a,b)                      \
+  _dirmngr_ldap_init ((a), (b))
+# define my_ldap_simple_bind_s(a,b,c)           \
+  _dirmngr_ldap_simple_bind_s ((a),(b),(c))
+# define my_ldap_search_st(a,b,c,d,e,f,g,h)     \
+  _dirmngr_ldap_search_st ((a), (b), (c), (d), (e), (f), (g), (h))
+# define my_ldap_first_attribute(a,b,c)         \
+  _dirmngr_ldap_first_attribute ((a),(b),(c))
+# define my_ldap_next_attribute(a,b,c)          \
+  _dirmngr_ldap_next_attribute ((a),(b),(c))
+# define my_ldap_get_values_len(a,b,c)          \
+  _dirmngr_ldap_get_values_len ((a),(b),(c))
+# define my_ldap_free_attr(a)                   \
+  xfree ((a))
+#else
+# define my_ldap_init(a,b)              ldap_init ((a), (b))
+# define my_ldap_simple_bind_s(a,b,c)   ldap_simple_bind_s ((a), (b), (c))
+# define my_ldap_search_st(a,b,c,d,e,f,g,h)     \
+  ldap_search_st ((a), (b), (c), (d), (e), (f), (g), (h))
+# define my_ldap_first_attribute(a,b,c) ldap_first_attribute ((a),(b),(c))
+# define my_ldap_next_attribute(a,b,c)  ldap_next_attribute ((a),(b),(c))
+# define my_ldap_get_values_len(a,b,c)  ldap_get_values_len ((a),(b),(c))
+# define my_ldap_free_attr(a)           ldap_memfree ((a))
+#endif
+
 #define DEFAULT_LDAP_TIMEOUT 100 /* Arbitrary long timeout. */
 
 
 /* Constants for the options.  */
-enum 
+enum
   {
     oQuiet       = 'q',
     oVerbose     = 'v',
@@ -147,18 +174,20 @@ typedef struct my_opt_s *my_opt_t;
 
 
 /* Prototypes.  */
+#ifndef HAVE_W32_SYSTEM
 static void catch_alarm (int dummy);
+#endif
 static int process_url (my_opt_t myopt, const char *url);
 
 
 
 /* Function called by argparse.c to display information.  */
-#ifndef USE_LDAPWRAPPER
+#ifdef USE_LDAPWRAPPER
 static const char *
 my_strusage (int level)
 {
   const char *p;
-    
+
   switch(level)
     {
     case 11: p = "dirmngr_ldap (GnuPG)";
@@ -200,13 +229,14 @@ ldap_wrapper_main (char **argv, estream_t outstream)
   int only_search_timeout = 0;
   struct my_opt_s my_opt_buffer;
   my_opt_t myopt = &my_opt_buffer;
-  
+  char *malloced_buffer1 = NULL;
+
   memset (&my_opt_buffer, 0, sizeof my_opt_buffer);
 
 #ifdef USE_LDAPWRAPPER
   set_strusage (my_strusage);
-  log_set_prefix ("dirmngr_ldap", JNLIB_LOG_WITH_PREFIX); 
-  
+  log_set_prefix ("dirmngr_ldap", JNLIB_LOG_WITH_PREFIX);
+
   /* Setup I18N and common subsystems. */
   i18n_init();
 
@@ -235,8 +265,8 @@ ldap_wrapper_main (char **argv, estream_t outstream)
         {
         case oVerbose: myopt->verbose++; break;
         case oQuiet: myopt->quiet++; break;
-       case oTimeout: 
-         myopt->timeout.tv_sec = pargs.r.ret_int; 
+       case oTimeout:
+         myopt->timeout.tv_sec = pargs.r.ret_int;
          myopt->timeout.tv_usec = 0;
           myopt->alarm_timeout = pargs.r.ret_int;
          break;
@@ -276,7 +306,13 @@ ldap_wrapper_main (char **argv, estream_t outstream)
 
   if (myopt->proxy)
     {
-      myopt->host = xstrdup (myopt->proxy);
+      malloced_buffer1 = xtrystrdup (myopt->proxy);
+      if (!malloced_buffer1)
+        {
+          log_error ("error copying string: %s\n", strerror (errno));
+          return 1;
+        }
+      myopt->host = malloced_buffer1;
       p = strchr (myopt->host, ':');
       if (p)
         {
@@ -286,7 +322,7 @@ ldap_wrapper_main (char **argv, estream_t outstream)
       if (!myopt->port)
         myopt->port = 389;  /* make sure ports gets overridden.  */
     }
-        
+
   if (myopt->port < 0 || myopt->port > 65535)
     log_error (_("invalid port number %d\n"), myopt->port);
 
@@ -306,12 +342,12 @@ ldap_wrapper_main (char **argv, estream_t outstream)
 #ifndef HAVE_W32_SYSTEM
 # if defined(HAVE_SIGACTION) && defined(HAVE_STRUCT_SIGACTION)
       struct sigaction act;
-      
+
       act.sa_handler = catch_alarm;
       sigemptyset (&act.sa_mask);
       act.sa_flags = 0;
       if (sigaction (SIGALRM,&act,NULL))
-# else 
+# else
       if (signal (SIGALRM, catch_alarm) == SIG_ERR)
 # endif
           log_fatal ("unable to register timeout handler\n");
@@ -323,19 +359,18 @@ ldap_wrapper_main (char **argv, estream_t outstream)
     if (process_url (myopt, *argv))
       any_err = 1;
 
-
-  /* FIXME: Do we need to release stuff?  */
+  xfree (malloced_buffer1);
   return any_err;
 }
 
-
+#ifndef HAVE_W32_SYSTEM
 static void
 catch_alarm (int dummy)
 {
   (void)dummy;
   _exit (10);
 }
-
+#endif
 
 static void
 set_timeout (my_opt_t myopt)
@@ -378,11 +413,11 @@ print_ldap_entries (my_opt_t myopt, LDAP *ld, LDAPMessage *msg, char *want_attr)
             }
         }
 
-          
-      for (pth_enter (), attr = ldap_first_attribute (ld, item, &berctx),
+
+      for (pth_enter (), attr = my_ldap_first_attribute (ld, item, &berctx),
              pth_leave ();
            attr;
-           pth_enter (), attr = ldap_next_attribute (ld, item, berctx),
+           pth_enter (), attr = my_ldap_next_attribute (ld, item, berctx),
              pth_leave ())
         {
           struct berval **values;
@@ -390,7 +425,7 @@ print_ldap_entries (my_opt_t myopt, LDAP *ld, LDAPMessage *msg, char *want_attr)
 
           if (myopt->verbose > 1)
             log_info (_("          available attribute `%s'\n"), attr);
-          
+
           set_timeout (myopt);
 
           /* I case we want only one attribute we do a case
@@ -415,20 +450,20 @@ print_ldap_entries (my_opt_t myopt, LDAP *ld, LDAPMessage *msg, char *want_attr)
                 *cp2 = ';';
               if (cmpres)
                 {
-                  ldap_memfree (attr);
+                  my_ldap_free_attr (attr);
                   continue; /* Not found:  Try next attribute.  */
                 }
             }
 
           pth_enter ();
-          values = ldap_get_values_len (ld, item, attr);
+          values = my_ldap_get_values_len (ld, item, attr);
           pth_leave ();
 
           if (!values)
             {
               if (myopt->verbose)
                 log_info (_("attribute `%s' not found\n"), attr);
-              ldap_memfree (attr);
+              my_ldap_free_attr (attr);
               continue;
             }
 
@@ -439,7 +474,7 @@ print_ldap_entries (my_opt_t myopt, LDAP *ld, LDAPMessage *msg, char *want_attr)
                 for (idx=0; values[idx]; idx++)
                   log_info ("         length[%d]=%d\n",
                             idx, (int)values[0]->bv_len);
-              
+
             }
 
           if (myopt->multi)
@@ -452,13 +487,13 @@ print_ldap_entries (my_opt_t myopt, LDAP *ld, LDAPMessage *msg, char *want_attr)
               tmp[2] = (n >> 16);
               tmp[3] = (n >> 8);
               tmp[4] = (n);
-              if (es_fwrite (tmp, 5, 1, myopt->outstream) != 1 
+              if (es_fwrite (tmp, 5, 1, myopt->outstream) != 1
                   || es_fwrite (attr, n, 1, myopt->outstream) != 1)
                 {
                   log_error (_("error writing to stdout: %s\n"),
                              strerror (errno));
                   ldap_value_free_len (values);
-                  ldap_memfree (attr);
+                  my_ldap_free_attr (attr);
                   ber_free (berctx, 0);
                   return -1;
                 }
@@ -482,7 +517,7 @@ print_ldap_entries (my_opt_t myopt, LDAP *ld, LDAPMessage *msg, char *want_attr)
                       log_error (_("error writing to stdout: %s\n"),
                                  strerror (errno));
                       ldap_value_free_len (values);
-                      ldap_memfree (attr);
+                      my_ldap_free_attr (attr);
                       ber_free (berctx, 0);
                       return -1;
                     }
@@ -494,7 +529,7 @@ print_ldap_entries (my_opt_t myopt, LDAP *ld, LDAPMessage *msg, char *want_attr)
                   log_error (_("error writing to stdout: %s\n"),
                              strerror (errno));
                   ldap_value_free_len (values);
-                  ldap_memfree (attr);
+                  my_ldap_free_attr (attr);
                   ber_free (berctx, 0);
                   return -1;
                 }
@@ -504,12 +539,12 @@ print_ldap_entries (my_opt_t myopt, LDAP *ld, LDAPMessage *msg, char *want_attr)
                 break; /* Print only the first value.  */
             }
           ldap_value_free_len (values);
-          ldap_memfree (attr);
+          my_ldap_free_attr (attr);
           if (want_attr || !myopt->multi)
             break; /* We only want to return the first attribute.  */
         }
       ber_free (berctx, 0);
-    } 
+    }
 
   if (myopt->verbose > 1 && any)
     log_info ("result has been printed\n");
@@ -584,32 +619,33 @@ fetch_ldap (my_opt_t myopt, const char *url, const LDAPURLDesc *ludp)
 
   set_timeout (myopt);
   pth_enter ();
-  ld = ldap_init (host, port);
+  ld = my_ldap_init (host, port);
   pth_leave ();
   if (!ld)
     {
-      log_error (_("LDAP init to `%s:%d' failed: %s\n"), 
+      log_error (_("LDAP init to `%s:%d' failed: %s\n"),
                  host, port, strerror (errno));
       return -1;
     }
   pth_enter ();
-  ret = ldap_simple_bind_s (ld, myopt->user, myopt->pass);
+  /* Fixme:  Can we use MYOPT->user or is it shared with other theeads?.  */
+  ret = my_ldap_simple_bind_s (ld, myopt->user, myopt->pass);
   pth_leave ();
   if (ret)
     {
-      log_error (_("binding to `%s:%d' failed: %s\n"), 
+      log_error (_("binding to `%s:%d' failed: %s\n"),
                  host, port, strerror (errno));
-      /* FIXME: Need deinit (ld)?  */
+      ldap_unbind (ld);
       return -1;
     }
 
   set_timeout (myopt);
   pth_enter ();
-  rc = ldap_search_st (ld, dn, ludp->lud_scope, filter,
-                       myopt->multi && !myopt->attr && ludp->lud_attrs?
-                       ludp->lud_attrs:attrs,
-                       0,
-                       &myopt->timeout, &msg);
+  rc = my_ldap_search_st (ld, dn, ludp->lud_scope, filter,
+                          myopt->multi && !myopt->attr && ludp->lud_attrs?
+                          ludp->lud_attrs:attrs,
+                          0,
+                          &myopt->timeout, &msg);
   pth_leave ();
   if (rc == LDAP_SIZELIMIT_EXCEEDED && myopt->multi)
     {
@@ -621,8 +657,12 @@ fetch_ldap (my_opt_t myopt, const char *url, const LDAPURLDesc *ludp)
     }
   else if (rc)
     {
-      log_error (_("searching `%s' failed: %s\n"), 
+#ifdef HAVE_W32CE_SYSTEM
+      log_error ("searching `%s' failed: %d\n", url, rc);
+#else
+      log_error (_("searching `%s' failed: %s\n"),
                  url, ldap_err2string (rc));
+#endif
       if (rc != LDAP_NO_SUCH_OBJECT)
         {
           /* FIXME: Need deinit (ld)?  */
@@ -634,7 +674,7 @@ fetch_ldap (my_opt_t myopt, const char *url, const LDAPURLDesc *ludp)
   rc = print_ldap_entries (myopt, ld, msg, myopt->multi? NULL:attr);
 
   ldap_msgfree (msg);
-  /* FIXME: Need deinit (ld)?  */
+  ldap_unbind (ld);
   return rc;
 }
 
@@ -667,4 +707,3 @@ process_url (my_opt_t myopt, const char *url)
   ldap_free_urldesc (ludp);
   return rc;
 }
-