common: Minor change of hex2str to allow for embedded nul.
[gnupg.git] / dirmngr / dirmngr-client.c
index 00b12b7..770e941 100644 (file)
@@ -29,7 +29,7 @@
 #include <assert.h>
 
 #include <gpg-error.h>
-#include <assuan.h> 
+#include <assuan.h>
 
 #define JNLIB_NEED_LOG_LOGV
 #include "../common/logging.h"
 
 #include "i18n.h"
 #include "util.h"
+#include "init.h"
 
 
 /* Constants for the options.  */
-enum 
+enum
   {
     oQuiet       = 'q',
     oVerbose     = 'v',
@@ -76,12 +77,12 @@ static ARGPARSE_OPTS opts[] = {
   { oUrl,      "url",       0, N_("expect an URL for --lookup")},
   { oLoadCRL,  "load-crl",  0, N_("load a CRL into the dirmngr")},
   { oSquidMode,"squid-mode",0, N_("special mode for use by Squid")},
-  { oPEM,      "pem",       0, N_("certificates are expected in PEM format")},
+  { oPEM,      "pem",       0, N_("expect certificates in PEM format")},
   { oForceDefaultResponder, "force-default-responder", 0,
     N_("force the use of the default OCSP responder")},
   { 0, NULL, 0, NULL }
 };
+
 
 /* The usual structure for the program flags.  */
 static struct
@@ -137,10 +138,10 @@ static const char *
 my_strusage (int level)
 {
   const char *p;
-    
+
   switch(level)
     {
-    case 11: p = "dirmngr-client (GnuPG)";
+    case 11: p = "dirmngr-client (@GNUPG@)";
       break;
     case 13: p = VERSION; break;
     case 17: p = PRINTABLE_OS_NAME; break;
@@ -180,20 +181,21 @@ main (int argc, char **argv )
   int cmd_loadcrl = 0;
   int cmd_squid_mode = 0;
 
+  early_system_init ();
   set_strusage (my_strusage);
   log_set_prefix ("dirmngr-client",
-                  JNLIB_LOG_WITH_PREFIX); 
+                  JNLIB_LOG_WITH_PREFIX);
 
   /* For W32 we need to initialize the socket subsystem.  Becuase we
      don't use Pth we need to do this explicit. */
-#ifdef HAVE_W32_SYSTEM  
+#ifdef HAVE_W32_SYSTEM
  {
    WSADATA wsadat;
 
    WSAStartup (0x202, &wsadat);
  }
 #endif /*HAVE_W32_SYSTEM*/
-  
+
   /* Init Assuan.  */
   assuan_set_assuan_log_prefix (log_get_prefix (NULL));
   assuan_set_gpg_err_source (GPG_ERR_SOURCE_DEFAULT);
@@ -211,7 +213,7 @@ main (int argc, char **argv )
         {
         case oVerbose: opt.verbose++; break;
         case oQuiet: opt.quiet++; break;
-          
+
         case oOCSP: opt.use_ocsp++; break;
         case oPing: cmd_ping = 1; break;
         case oCacheCert: cmd_cache_cert = 1; break;
@@ -221,7 +223,7 @@ main (int argc, char **argv )
         case oLocal: opt.local = 1; break;
         case oLoadCRL: cmd_loadcrl = 1; break;
         case oPEM: opt.pem = 1; break;
-        case oSquidMode: 
+        case oSquidMode:
           opt.pem = 1;
           opt.escaped_pem = 1;
           cmd_squid_mode = 1;
@@ -235,11 +237,11 @@ main (int argc, char **argv )
     exit (2);
 
   /* Build the helptable for radix64 to bin conversion. */
-  if (opt.pem) 
+  if (opt.pem)
     {
       int i;
       unsigned char *s;
-      
+
       for (i=0; i < 256; i++ )
         asctobin[i] = 255; /* Used to detect invalid characters. */
       for (s=bintoasc, i=0; *s; s++, i++)
@@ -272,7 +274,7 @@ main (int argc, char **argv )
     {
       err = read_certificate (*argv, &certbuf, &certbuflen);
       if (err)
-        log_error (_("error reading certificate from `%s': %s\n"),
+        log_error (_("error reading certificate from '%s': %s\n"),
                    *argv, gpg_strerror (err));
     }
   else
@@ -327,7 +329,7 @@ main (int argc, char **argv )
           err = do_loadcrl (ctx, *argv);
           if (err)
             {
-              log_error (_("loading CRL `%s' failed: %s\n"),
+              log_error (_("loading CRL '%s' failed: %s\n"),
                          *argv, gpg_strerror (err));
               last_err = err;
             }
@@ -408,7 +410,7 @@ status_cb (void *opaque, const char *line)
   (void)opaque;
 
   if (opt.verbose > 2)
-    log_info (_("got status: `%s'\n"), line);
+    log_info (_("got status: '%s'\n"), line);
   return 0;
 }
 
@@ -428,7 +430,7 @@ data_cb (void *opaque, const void *buffer, size_t length)
     }
   return 0;
 }
-  
+
 
 /* Try to connect to the dirmngr via socket or fork it off and work by
    pipes.  Handle the server's initial greeting */
@@ -440,10 +442,13 @@ start_dirmngr (int only_daemon)
   assuan_context_t ctx;
   int try_default = 0;
 
-  infostr = opt.force_pipe_server? NULL : getenv ("DIRMNGR_INFO");
+  infostr = opt.force_pipe_server? NULL : getenv (DIRMNGR_INFO_NAME);
   if (only_daemon && (!infostr || !*infostr))
     {
-      infostr = xstrdup (dirmngr_socket_name ());
+      if (dirmngr_user_socket_name ())
+        infostr = xstrdup (dirmngr_user_socket_name ());
+      else
+        infostr = xstrdup (dirmngr_sys_socket_name ());
       try_default = 1;
     }
 
@@ -459,7 +464,7 @@ start_dirmngr (int only_daemon)
     {
       const char *pgmname;
       const char *argv[3];
-      int no_close_list[3];
+      assuan_fd_t no_close_list[3];
       int i;
 
       if (only_daemon)
@@ -470,7 +475,7 @@ start_dirmngr (int only_daemon)
 
       if (opt.verbose)
         log_info (_("no running dirmngr - starting one\n"));
-      
+
       if (!opt.dirmngr_program || !*opt.dirmngr_program)
         opt.dirmngr_program = "./dirmngr";
       if ( !(pgmname = strrchr (opt.dirmngr_program, '/')))
@@ -485,8 +490,8 @@ start_dirmngr (int only_daemon)
       i=0;
       if (log_get_fd () != -1)
         no_close_list[i++] = assuan_fd_from_posix_fd (log_get_fd ());
-      no_close_list[i++] = assuan_fd_from_posix_fd (fileno (stderr));
-      no_close_list[i] = -1;
+      no_close_list[i++] = assuan_fd_from_posix_fd (es_fileno (es_stderr));
+      no_close_list[i] = ASSUAN_INVALID_FD;
 
       /* Connect to the agent and perform initial handshaking.  */
       rc = assuan_pipe_connect (ctx, opt.dirmngr_program, argv,
@@ -502,7 +507,8 @@ start_dirmngr (int only_daemon)
         {
           if ( !(p = strchr (infostr, ':')) || p == infostr)
             {
-              log_error (_("malformed DIRMNGR_INFO environment variable\n"));
+              log_error (_("malformed %s environment variable\n"),
+                         DIRMNGR_INFO_NAME);
               xfree (infostr);
               if (only_daemon)
                 return NULL;
@@ -681,8 +687,8 @@ read_pem_certificate (const char *fname, unsigned char **rbuf, size_t *rbuflen)
              real LF and not a trailing percent escaped one. */
           if (c== '\n' && !escaped_c)
             goto ready;
-          break; 
-        default: 
+          break;
+        default:
           BUG();
         }
     }
@@ -729,7 +735,7 @@ read_certificate (const char *fname, unsigned char **rbuf, size_t *rbuflen)
   buf = NULL;
   bufsize = buflen = 0;
 #define NCHUNK 8192
-  do 
+  do
     {
       bufsize += NCHUNK;
       if (!buf)
@@ -791,7 +797,7 @@ inq_cert (void *opaque, const char *line)
     }
   else
     {
-      log_info (_("unsupported inquiry `%s'\n"), line);
+      log_info (_("unsupported inquiry '%s'\n"), line);
       err = gpg_error (GPG_ERR_ASS_UNKNOWN_INQUIRE);
       /* Note that this error will let assuan_transact terminate
          immediately instead of return the error to the caller.  It is
@@ -816,10 +822,10 @@ do_check (assuan_context_t ctx, const unsigned char *cert, size_t certlen)
   parm.cert = cert;
   parm.certlen = certlen;
 
-  err = assuan_transact (ctx, 
+  err = assuan_transact (ctx,
                          (opt.use_ocsp && opt.force_default_responder
-                          ? "CHECKOCSP --force-default-responder" 
-                          : opt.use_ocsp? "CHECKOCSP" : "CHECKCRL"), 
+                          ? "CHECKOCSP --force-default-responder"
+                          : opt.use_ocsp? "CHECKOCSP" : "CHECKCRL"),
                          NULL, NULL, inq_cert, &parm, status_cb, NULL);
   if (opt.verbose > 1)
     log_info ("response of dirmngr: %s\n", err? gpg_strerror (err): "okay");
@@ -884,10 +890,10 @@ do_loadcrl (assuan_context_t ctx, const char *filename)
       fname = canonicalize_file_name (filename);
       if (!fname)
         {
-          log_error ("error canonicalizing `%s': %s\n",
+          log_error ("error canonicalizing '%s': %s\n",
                      filename, strerror (errno));
           return gpg_error (GPG_ERR_GENERAL);
-        }      
+        }
 #else
       fname = xstrdup (filename);
 #endif
@@ -897,7 +903,7 @@ do_loadcrl (assuan_context_t ctx, const char *filename)
           return gpg_error (GPG_ERR_GENERAL);
         }
     }
-  
+
   line = xmalloc (8 + 6 + strlen (fname) * 3 + 1);
   p = stpcpy (line, "LOADCRL ");
   if (opt.url)
@@ -938,7 +944,7 @@ do_lookup (assuan_context_t ctx, const char *pattern)
   struct b64state state;
 
   if (opt.verbose)
-    log_info (_("looking up `%s'\n"), pattern);
+    log_info (_("looking up '%s'\n"), pattern);
 
   err = b64enc_start (&state, stdout, NULL);
   if (err)
@@ -988,7 +994,7 @@ squid_loop_body (assuan_context_t ctx)
   gpg_error_t err;
   unsigned char *certbuf;
   size_t certbuflen = 0;
-  
+
   err = read_pem_certificate (NULL, &certbuf, &certbuflen);
   if (gpg_err_code (err) == GPG_ERR_EOF)
     return err;
@@ -1008,7 +1014,7 @@ squid_loop_body (assuan_context_t ctx)
         log_info (_("certificate is valid\n"));
       puts ("OK");
     }
-  else 
+  else
     {
       if (!opt.quiet)
         {
@@ -1020,7 +1026,7 @@ squid_loop_body (assuan_context_t ctx)
         }
       puts ("ERROR");
     }
-  
+
   fflush (stdout);
 
   return 0;