~ubuntu-branches/ubuntu/karmic/gnupg2/karmic-updates

« back to all changes in this revision

Viewing changes to scd/scdaemon.c

  • Committer: Bazaar Package Importer
  • Author(s): Eric Dorland
  • Date: 2009-03-08 22:46:47 UTC
  • mfrom: (1.1.11 upstream)
  • Revision ID: james.westby@ubuntu.com-20090308224647-gq17gatcl71lrc2k
Tags: 2.0.11-1
* New upstream release. (Closes: #496663)
* debian/control: Make the description a little more distinctive than
  gnupg v1's. Thanks Jari Aalto. (Closes: #496323)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/* scdaemon.c  -  The GnuPG Smartcard Daemon
2
2
 * Copyright (C) 2001, 2002, 2004, 2005, 
3
 
 *               2007 Free Software Foundation, Inc.
 
3
 *               2007, 2008, 2009 Free Software Foundation, Inc.
4
4
 *
5
5
 * This file is part of GnuPG.
6
6
 *
69
69
  oDebugWait,
70
70
  oDebugAllowCoreDump,
71
71
  oDebugCCIDDriver,
 
72
  oDebugLogTid,
72
73
  oNoGreeting,
73
74
  oNoOptions,
74
75
  oHomedir,
80
81
  oDaemon,
81
82
  oBatch,
82
83
  oReaderPort,
 
84
  oCardTimeout,
83
85
  octapiDriver,
84
86
  opcscDriver,
85
87
  oDisableCCID,
94
96
 
95
97
 
96
98
static ARGPARSE_OPTS opts[] = {
97
 
 
98
 
  { aGPGConfList, "gpgconf-list", 256, "@" },
99
 
  { aGPGConfTest, "gpgconf-test", 256, "@" },
 
99
  ARGPARSE_c (aGPGConfList, "gpgconf-list", "@"),
 
100
  ARGPARSE_c (aGPGConfTest, "gpgconf-test", "@"),
100
101
  
101
 
  { 301, NULL, 0, N_("@Options:\n ") },
 
102
  ARGPARSE_group (301, N_("@Options:\n ")),
102
103
 
103
 
  { oServer,   "server",     0, N_("run in server mode (foreground)") },
104
 
  { oMultiServer, "multi-server", 0,
105
 
                                N_("run in multi server mode (foreground)") },
106
 
  { oDaemon,   "daemon",     0, N_("run in daemon mode (background)") },
107
 
  { oVerbose, "verbose",   0, N_("verbose") },
108
 
  { oQuiet,     "quiet",     0, N_("be somewhat more quiet") },
109
 
  { oSh,        "sh",        0, N_("sh-style command output") },
110
 
  { oCsh,       "csh",       0, N_("csh-style command output") },
111
 
  { oOptions, "options"  , 2, N_("read options from file")},
112
 
  { oDebug,     "debug"     ,4|16, "@"},
113
 
  { oDebugAll, "debug-all"     ,0, "@"},
114
 
  { oDebugLevel, "debug-level" ,2, "@"},
115
 
  { oDebugWait,"debug-wait",1, "@"},
116
 
  { oDebugAllowCoreDump, "debug-allow-core-dump", 0, "@" },
117
 
  { oDebugCCIDDriver, "debug-ccid-driver", 0, "@"},
118
 
  { oDebugDisableTicker, "debug-disable-ticker", 0, "@"},
119
 
  { oNoDetach, "no-detach" ,0, N_("do not detach from the console")},
120
 
  { oLogFile,  "log-file"   ,2, N_("use a log file for the server")},
121
 
  { oReaderPort, "reader-port", 2, N_("|N|connect to reader at port N")},
122
 
  { octapiDriver, "ctapi-driver", 2, N_("|NAME|use NAME as ct-API driver")},
123
 
  { opcscDriver, "pcsc-driver", 2, N_("|NAME|use NAME as PC/SC driver")},
124
 
  { oDisableCCID, "disable-ccid", 0,
 
104
  ARGPARSE_s_n (oServer,"server", N_("run in server mode (foreground)")),
 
105
  ARGPARSE_s_n (oMultiServer, "multi-server", 
 
106
                N_("run in multi server mode (foreground)")),
 
107
  ARGPARSE_s_n (oDaemon, "daemon", N_("run in daemon mode (background)")),
 
108
  ARGPARSE_s_n (oVerbose, "verbose", N_("verbose")),
 
109
  ARGPARSE_s_n (oQuiet, "quiet", N_("be somewhat more quiet")),
 
110
  ARGPARSE_s_n (oSh,    "sh", N_("sh-style command output")),
 
111
  ARGPARSE_s_n (oCsh,   "csh", N_("csh-style command output")),
 
112
  ARGPARSE_s_s (oOptions, "options", N_("|FILE|read options from FILE")),
 
113
  ARGPARSE_p_u (oDebug, "debug", "@"),
 
114
  ARGPARSE_s_n (oDebugAll, "debug-all", "@"),
 
115
  ARGPARSE_s_s (oDebugLevel, "debug-level" ,
 
116
                N_("|LEVEL|set the debugging level to LEVEL")),
 
117
  ARGPARSE_s_i (oDebugWait, "debug-wait", "@"),
 
118
  ARGPARSE_s_n (oDebugAllowCoreDump, "debug-allow-core-dump", "@"),
 
119
  ARGPARSE_s_n (oDebugCCIDDriver, "debug-ccid-driver", "@"),
 
120
  ARGPARSE_s_n (oDebugDisableTicker, "debug-disable-ticker", "@"),
 
121
  ARGPARSE_s_n (oDebugLogTid, "debug-log-tid", "@"),
 
122
  ARGPARSE_s_n (oNoDetach, "no-detach", N_("do not detach from the console")),
 
123
  ARGPARSE_s_s (oLogFile,  "log-file", N_("|FILE|write a log to FILE")),
 
124
  ARGPARSE_s_s (oReaderPort, "reader-port", 
 
125
                N_("|N|connect to reader at port N")),
 
126
  ARGPARSE_s_s (octapiDriver, "ctapi-driver", 
 
127
                N_("|NAME|use NAME as ct-API driver")),
 
128
  ARGPARSE_s_s (opcscDriver, "pcsc-driver", 
 
129
                N_("|NAME|use NAME as PC/SC driver")),
 
130
  ARGPARSE_s_n (oDisableCCID, "disable-ccid",
125
131
#ifdef HAVE_LIBUSB
126
132
                                    N_("do not use the internal CCID driver")
127
133
#else
128
134
                                    "@"
129
135
#endif
130
 
                                         /* end --disable-ccid */},
131
 
  { oDisableKeypad, "disable-keypad", 0, N_("do not use a reader's keypad")},
132
 
  { oAllowAdmin, "allow-admin", 0, N_("allow the use of admin card commands")},
133
 
  { oDenyAdmin,  "deny-admin",  0, "@" },  
134
 
  { oDisableApplication, "disable-application", 2, "@"},
135
 
 
136
 
  {0}
 
136
                /* end --disable-ccid */),
 
137
  ARGPARSE_s_u (oCardTimeout, "card-timeout", 
 
138
                N_("|N|disconnect the card after N seconds of inactivity")),
 
139
  ARGPARSE_s_n (oDisableKeypad, "disable-keypad", 
 
140
                N_("do not use a reader's keypad")),
 
141
  ARGPARSE_s_n (oAllowAdmin, "allow-admin", "@"),
 
142
  ARGPARSE_s_n (oDenyAdmin, "deny-admin", 
 
143
                N_("deny the use of admin card commands")),
 
144
  ARGPARSE_s_s (oDisableApplication, "disable-application", "@"),
 
145
  
 
146
  ARGPARSE_end ()
137
147
};
138
148
 
139
149
 
148
158
#define DEFAULT_PCSC_DRIVER "libpcsclite.so"
149
159
#endif
150
160
 
151
 
/* The timer tick used for housekeeping stuff.  For Windows we use a
152
 
   longer period as the SetWaitableTimer seems to signal earlier than
153
 
   the 2 seconds.  */
154
 
#ifdef HAVE_W32_SYSTEM
155
 
#define TIMERTICK_INTERVAL    (4)
156
 
#else
157
 
#define TIMERTICK_INTERVAL    (2)    /* Seconds.  */
158
 
#endif
 
161
/* The timer tick used for housekeeping stuff.  We poll every 500ms to
 
162
   let the user immediately know a status change.
159
163
 
 
164
   This is not too good for power saving but given that there is no
 
165
   easy way to block on card status changes it is the best we can do.
 
166
   For PC/SC we could in theory use an extra thread to wait for status
 
167
   changes but that requires a native thread because there is no way
 
168
   to make the underlying PC/SC card change function block using a Pth
 
169
   mechanism.  Given that a native thread could only be used under W32
 
170
   we don't do that at all.  */
 
171
#define TIMERTICK_INTERVAL_SEC     (0)
 
172
#define TIMERTICK_INTERVAL_USEC    (500000)
160
173
 
161
174
/* Flag to indicate that a shutdown was requested. */
162
175
static int shutdown_pending;
164
177
/* It is possible that we are currently running under setuid permissions */
165
178
static int maybe_setuid = 1;
166
179
 
 
180
/* Flag telling whether we are running as a pipe server.  */
 
181
static int pipe_server;
 
182
 
167
183
/* Name of the communication socket */
168
184
static char *socket_name;
169
185
 
194
210
 
195
211
 
196
212
 
 
213
static char *
 
214
make_libversion (const char *libname, const char *(*getfnc)(const char*))
 
215
{
 
216
  const char *s;
 
217
  char *result;
 
218
  
 
219
  if (maybe_setuid)
 
220
    {
 
221
      gcry_control (GCRYCTL_INIT_SECMEM, 0, 0);  /* Drop setuid. */
 
222
      maybe_setuid = 0;
 
223
    }
 
224
  s = getfnc (NULL);
 
225
  result = xmalloc (strlen (libname) + 1 + strlen (s) + 1);
 
226
  strcpy (stpcpy (stpcpy (result, libname), " "), s);
 
227
  return result;
 
228
}
 
229
 
 
230
 
197
231
static const char *
198
232
my_strusage (int level)
199
233
{
 
234
  static char *ver_gcry, *ver_ksba;
200
235
  const char *p;
 
236
 
201
237
  switch (level)
202
238
    {
203
239
    case 11: p = "scdaemon (GnuPG)";
206
242
    case 17: p = PRINTABLE_OS_NAME; break;
207
243
    case 19: p = _("Please report bugs to <" PACKAGE_BUGREPORT ">.\n");
208
244
      break;
 
245
    case 20:
 
246
      if (!ver_gcry)
 
247
        ver_gcry = make_libversion ("libgcrypt", gcry_check_version);
 
248
      p = ver_gcry;
 
249
      break;
 
250
    case 21:
 
251
      if (!ver_ksba)
 
252
        ver_ksba = make_libversion ("libksba", ksba_check_version);
 
253
      p = ver_ksba;
 
254
      break;
209
255
    case 1:
210
256
    case 40: p =  _("Usage: scdaemon [options] (-h for help)");
211
257
      break;
219
265
}
220
266
 
221
267
 
 
268
static unsigned long
 
269
tid_log_callback (void)
 
270
{
 
271
#ifdef PTH_HAVE_PTH_THREAD_ID
 
272
  return pth_thread_id ();
 
273
#else
 
274
  return (unsigned long)pth_self ();
 
275
#endif
 
276
}
 
277
 
 
278
 
222
279
 
223
280
 
224
281
 
301
358
  int default_config =1;
302
359
  int greeting = 0;
303
360
  int nogreeting = 0;
304
 
  int pipe_server = 0;
305
361
  int multi_server = 0;
306
362
  int is_daemon = 0;
307
363
  int nodetach = 0;
321
377
  log_set_prefix ("scdaemon", 1|4); 
322
378
 
323
379
  /* Make sure that our subsystems are ready.  */
 
380
  i18n_init ();
324
381
  init_common_subsystems ();
325
382
 
326
 
  i18n_init ();
327
383
 
328
384
  /* Libgcrypt requires us to register the threading model first.
329
385
     Note that this will also do the pth_init. */
356
412
  may_coredump = disable_core_dumps ();
357
413
 
358
414
  /* Set default options. */
 
415
  opt.allow_admin = 1;
359
416
  opt.pcsc_driver = DEFAULT_PCSC_DRIVER; 
360
417
 
361
418
#ifdef HAVE_W32_SYSTEM
461
518
#endif /*HAVE_LIBUSB*/
462
519
          break;
463
520
        case oDebugDisableTicker: ticker_disabled = 1; break;
 
521
        case oDebugLogTid: 
 
522
          log_set_get_tid_callback (tid_log_callback);
 
523
          break;
464
524
 
465
525
        case oOptions:
466
526
          /* config files may not be nested (silently ignore them) */
491
551
 
492
552
        case oDisableKeypad: opt.disable_keypad = 1; break;
493
553
 
494
 
        case oAllowAdmin: opt.allow_admin = 1; break;
 
554
        case oAllowAdmin: /* Dummy because allow is now the default.  */
 
555
          break;
495
556
        case oDenyAdmin: opt.allow_admin = 0; break;
 
557
          
 
558
        case oCardTimeout: opt.card_timeout = pargs.r.ret_ulong; break;
496
559
 
497
560
        case oDisableApplication:
498
561
          add_to_strlist (&opt.disabled_applications, pargs.r.ret_str); 
499
562
          break;
500
563
 
501
 
        default : pargs.err = configfp? 1:2; break;
 
564
        default: 
 
565
          pargs.err = configfp? ARGPARSE_PRINT_WARNING:ARGPARSE_PRINT_ERROR; 
 
566
          break;
502
567
        }
503
568
    }
504
569
  if (configfp)
537
602
 
538
603
  set_debug (debug_level);
539
604
 
540
 
  if (debug_wait && pipe_server)
541
 
    {
542
 
      log_debug ("waiting for debugger - my pid is %u .....\n",
543
 
                 (unsigned int)getpid());
544
 
      gnupg_sleep (debug_wait);
545
 
      log_debug ("... okay\n");
546
 
    }
547
 
  
548
605
  initialize_module_command ();
549
606
 
550
607
  if (gpgconf_list == 2)
582
639
#ifdef HAVE_LIBUSB
583
640
      printf ("disable-ccid:%lu:\n", GC_OPT_FLAG_NONE );
584
641
#endif
585
 
      printf ("allow-admin:%lu:\n", GC_OPT_FLAG_NONE );
 
642
      printf ("deny-admin:%lu:\n", GC_OPT_FLAG_NONE );
586
643
      printf ("disable-keypad:%lu:\n", GC_OPT_FLAG_NONE );
 
644
      printf ("card-timeout:%lu:%d:\n", GC_OPT_FLAG_DEFAULT, 0);
587
645
 
588
646
      scd_exit (0);
589
647
    }
590
648
 
591
 
  /* now start with logging to a file if this is desired */
 
649
  /* Now start with logging to a file if this is desired.  */
592
650
  if (logfile)
593
651
    {
594
652
      log_set_file (logfile);
595
653
      log_set_prefix (NULL, 1|2|4);
596
654
    }
597
655
 
 
656
  if (debug_wait && pipe_server)
 
657
    {
 
658
      log_debug ("waiting for debugger - my pid is %u .....\n",
 
659
                 (unsigned int)getpid());
 
660
      gnupg_sleep (debug_wait);
 
661
      log_debug ("... okay\n");
 
662
    }
 
663
  
598
664
  if (pipe_server)
599
665
    { 
600
666
      /* This is the simple pipe based server */
702
768
          close (fd);
703
769
          
704
770
          /* create the info string: <name>:<pid>:<protocol_version> */
705
 
          if (asprintf (&infostr, "SCDAEMON_INFO=%s:%lu:1",
706
 
                        socket_name, (ulong)pid ) < 0)
 
771
          if (estream_asprintf (&infostr, "SCDAEMON_INFO=%s:%lu:1",
 
772
                                socket_name, (ulong) pid) < 0)
707
773
            {
708
774
              log_error ("out of core\n");
709
775
              kill (pid, SIGTERM);
738
804
                {
739
805
                  printf ( "%s; export SCDAEMON_INFO;\n", infostr);
740
806
                }
741
 
              free (infostr);
 
807
              xfree (infostr);
742
808
              exit (0); 
743
809
            }
744
810
          /* NOTREACHED */
820
886
static void
821
887
scd_deinit_default_ctrl (ctrl_t ctrl)
822
888
{
823
 
 
 
889
  (void)ctrl;
824
890
}
825
891
 
826
892
 
1024
1090
    log_info (_("handler for fd %d started\n"),
1025
1091
              FD2INT(ctrl->thread_startup.fd));
1026
1092
 
1027
 
  scd_command_handler (ctrl, FD2INT(ctrl->thread_startup.fd));
 
1093
  /* If this is a pipe server, we request a shutdown if the command
 
1094
     handler asked for it.  With the next ticker event and given that
 
1095
     no other connections are running the shutdown will then
 
1096
     happen.  */
 
1097
  if (scd_command_handler (ctrl, FD2INT(ctrl->thread_startup.fd))
 
1098
      && pipe_server)
 
1099
    shutdown_pending = 1;
1028
1100
 
1029
1101
  if (opt.verbose)
1030
1102
    log_info (_("handler for fd %d terminated\n"),
1031
1103
              FD2INT (ctrl->thread_startup.fd));
1032
1104
 
1033
 
  /* If this thread is the pipe connection thread, flag that a
1034
 
     shutdown is required.  With the next ticker event and given that
1035
 
     no other connections are running the shutdown will then
1036
 
     happen. */
1037
 
  if (ctrl->thread_startup.fd == GNUPG_INVALID_FD)
1038
 
    shutdown_pending = 1;
1039
 
  
1040
1105
  scd_deinit_default_ctrl (ctrl);
1041
1106
  xfree (ctrl);
1042
1107
  return NULL;
1102
1167
             file descriptors to wait for, so that the select will be
1103
1168
             used to just wait on a signal or timeout event. */
1104
1169
          FD_ZERO (&fdset);
 
1170
          listen_fd = -1;
1105
1171
        }
1106
1172
 
1107
 
      /* Create a timeout event if needed. */
 
1173
      /* Create a timeout event if needed.  Round it up to the next
 
1174
         microsecond interval to help with power saving. */
1108
1175
      if (!time_ev)
1109
 
        time_ev = pth_event (PTH_EVENT_TIME,
1110
 
                             pth_timeout (TIMERTICK_INTERVAL, 0));
 
1176
        {
 
1177
          pth_time_t nexttick = pth_timeout (TIMERTICK_INTERVAL_SEC,
 
1178
                                             TIMERTICK_INTERVAL_USEC/2);
 
1179
          if ((nexttick.tv_usec % (TIMERTICK_INTERVAL_USEC/2)) > 10)
 
1180
            {
 
1181
              nexttick.tv_usec = ((nexttick.tv_usec
 
1182
                                   /(TIMERTICK_INTERVAL_USEC/2))
 
1183
                                  + 1) * (TIMERTICK_INTERVAL_USEC/2);
 
1184
              if (nexttick.tv_usec >= 1000000)
 
1185
                {
 
1186
                  nexttick.tv_sec++;
 
1187
                  nexttick.tv_usec = 0;
 
1188
                }
 
1189
            }
 
1190
          time_ev = pth_event (PTH_EVENT_TIME, nexttick);
 
1191
        }
1111
1192
 
1112
1193
      /* POSIX says that fd_set should be implemented as a structure,
1113
1194
         thus a simple assignment is fine to copy the entire set.  */