* Makefile.am: Add OPENSC_LIBS to all programs.
[gnupg.git] / scd / scdaemon.c
index 29256d8..af813b5 100644 (file)
 #include <unistd.h>
 #include <signal.h>
 
+#define JNLIB_NEED_LOG_LOGV
+#include "scdaemon.h"
 #include <ksba.h>
 #include <gcrypt.h>
 
-#define JNLIB_NEED_LOG_LOGV
-#include "scdaemon.h"
-#include "../assuan/assuan.h" /* malloc hooks */
+#include <assuan.h> /* malloc hooks */
 
+#include "i18n.h"
 #include "sysutils.h"
-
-
-#define N_(a) a
-#define _(a) a
+#include "app-common.h"
 
 
 enum cmd_and_opt_values 
@@ -68,7 +66,11 @@ enum cmd_and_opt_values
   oNoGrab,
   oLogFile,
   oServer,
+  oDaemon,
   oBatch,
+  oReaderPort,
+  octapiDriver,
+  oDisableOpenSC,
 
 aTest };
 
@@ -78,7 +80,8 @@ static ARGPARSE_OPTS opts[] = {
   
   { 301, NULL, 0, N_("@Options:\n ") },
 
-  { oServer,   "server",     0, N_("run in server mode") },
+  { oServer,   "server",     0, N_("run in server mode (foreground)") },
+  { oDaemon,   "daemon",     0, N_("run in daemon mode (background)") },
   { oVerbose, "verbose",   0, N_("verbose") },
   { oQuiet,    "quiet",     0, N_("be somewhat more quiet") },
   { oSh,       "sh",        0, N_("sh-style command output") },
@@ -90,6 +93,16 @@ static ARGPARSE_OPTS opts[] = {
   { oDebugSC,  "debug-sc",  1, N_("|N|set OpenSC debug level to N")},
   { oNoDetach, "no-detach" ,0, N_("do not detach from the console")},
   { oLogFile,  "log-file"   ,2, N_("use a log file for the server")},
+  { oReaderPort, "reader-port", 2, N_("|N|connect to reader at port N")},
+  { octapiDriver, "ctapi-driver", 2, N_("NAME|use NAME as ctAPI driver")},
+  { oDisableOpenSC, "disable-opensc", 0,
+#ifdef HAVE_OPENSC
+                                         N_("Do not use the OpenSC layer")
+#else
+                                         "@"
+#endif
+                                         /* end --disable-opensc */},
+
 
 
   {0}
@@ -137,9 +150,9 @@ i18n_init (void)
     set_gettext_file( PACKAGE );
 #else
 #ifdef ENABLE_NLS
-    /* gtk_set_locale (); HMMM: We have not yet called gtk_init */
-    bindtextdomain( PACKAGE, LOCALEDIR );
-    textdomain( PACKAGE );
+    setlocale (LC_ALL, "");
+    bindtextdomain (PACKAGE, LOCALEDIR);
+    textdomain (PACKAGE);
 #endif
 #endif
 }
@@ -224,6 +237,7 @@ main (int argc, char **argv )
   int greeting = 0;
   int nogreeting = 0;
   int pipe_server = 0;
+  int is_daemon = 0;
   int nodetach = 0;
   int csh_style = 0;
   char *logfile = NULL;
@@ -239,10 +253,10 @@ main (int argc, char **argv )
 
   /* check that the libraries are suitable.  Do it here because
      the option parsing may need services of the library */
-  if (!gcry_check_version ( "1.1.5" ) )
+  if (!gcry_check_version (NEED_LIBGCRYPT_VERSION) )
     {
       log_fatal( _("libgcrypt is too old (need %s, have %s)\n"),
-                   "1.1.5", gcry_check_version (NULL) );
+                 NEED_LIBGCRYPT_VERSION, gcry_check_version (NULL) );
     }
 
   ksba_set_malloc_hooks (gcry_malloc, gcry_realloc, gcry_free);
@@ -296,6 +310,7 @@ main (int argc, char **argv )
 
   if (default_config)
     configname = make_filename (opt.homedir, "scdaemon.conf", NULL );
+
   
   argc = orig_argc;
   argv = orig_argv;
@@ -360,6 +375,11 @@ main (int argc, char **argv )
         case oCsh: csh_style = 1; break;
         case oSh: csh_style = 0; break;
         case oServer: pipe_server = 1; break;
+        case oDaemon: is_daemon = 1; break;
+
+        case oReaderPort: app_set_default_reader_port (pargs.r.ret_str); break;
+        case octapiDriver: opt.ctapi_driver = pargs.r.ret_str; break;
+        case oDisableOpenSC: opt.disable_opensc = 1; break;
 
         default : pargs.err = configfp? 1:2; break;
        }
@@ -397,6 +417,7 @@ main (int argc, char **argv )
       exit (1);
     }
 
+  
   if (debug_wait && pipe_server)
     {
       log_debug ("waiting for debugger - my pid is %u .....\n",
@@ -417,6 +438,11 @@ main (int argc, char **argv )
     { /* this is the simple pipe based server */
       scd_command_handler (-1);
     }
+  else if (!is_daemon)
+    {
+      log_info (_("please use the option `--daemon'"
+                  " to run the program in the background\n"));
+    }
   else
     { /* regular server mode */
       int fd;
@@ -427,7 +453,7 @@ main (int argc, char **argv )
       char *p;
 
       /* fixme: if there is already a running gpg-agent we should
-         sahre the same directory - and vice versa */
+         share the same directory - and vice versa */
       *socket_name = 0;
       snprintf (socket_name, DIM(socket_name)-1,
                 "/tmp/gpg-XXXXXX/S.scdaemon");