mirror of
git://git.gnupg.org/gnupg.git
synced 2025-04-17 15:44:34 +02:00
Made scdaemon more robust on Windows.
This commit is contained in:
parent
d0ca953014
commit
b519a52cea
4
NEWS
4
NEWS
@ -20,7 +20,7 @@ Noteworthy changes in version 2.0.10 (unreleased)
|
|||||||
|
|
||||||
* [gpgsm] Made --output option work with --export-secret-key-p12.
|
* [gpgsm] Made --output option work with --export-secret-key-p12.
|
||||||
|
|
||||||
* gpg-connect-agent accepts commands given as command line arguments.
|
* [gpg-connect-agent] Accept commands given as command line arguments.
|
||||||
|
|
||||||
* [gpg] The option --fixed-list-mode is now implicitly used and obsolete.
|
* [gpg] The option --fixed-list-mode is now implicitly used and obsolete.
|
||||||
|
|
||||||
@ -35,6 +35,8 @@ Noteworthy changes in version 2.0.10 (unreleased)
|
|||||||
|
|
||||||
* Support for version 2 OpenPGP cards.
|
* Support for version 2 OpenPGP cards.
|
||||||
|
|
||||||
|
* [scdaemon] Made it more robust on W32.
|
||||||
|
|
||||||
* Libgcrypt 1.4 is now required.
|
* Libgcrypt 1.4 is now required.
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,3 +1,8 @@
|
|||||||
|
2008-10-15 Werner Koch <wk@g10code.com>
|
||||||
|
|
||||||
|
* call-scd.c (start_scd): Enable assuan loggging if requested.
|
||||||
|
(agent_scd_check_aliveness) [W32]: Fix use of GetExitCodeProcess.
|
||||||
|
|
||||||
2008-10-14 Werner Koch <wk@g10code.com>
|
2008-10-14 Werner Koch <wk@g10code.com>
|
||||||
|
|
||||||
* gpg-agent.c (get_agent_scd_notify_event): Need to use a manual
|
* gpg-agent.c (get_agent_scd_notify_event): Need to use a manual
|
||||||
|
@ -343,6 +343,9 @@ start_scd (ctrl_t ctrl)
|
|||||||
if (opt.verbose)
|
if (opt.verbose)
|
||||||
log_debug ("first connection to SCdaemon established\n");
|
log_debug ("first connection to SCdaemon established\n");
|
||||||
|
|
||||||
|
if (DBG_ASSUAN)
|
||||||
|
assuan_set_log_stream (ctx, log_get_stream ());
|
||||||
|
|
||||||
/* Get the name of the additional socket opened by scdaemon. */
|
/* Get the name of the additional socket opened by scdaemon. */
|
||||||
{
|
{
|
||||||
membuf_t data;
|
membuf_t data;
|
||||||
@ -412,9 +415,10 @@ agent_scd_check_aliveness (void)
|
|||||||
{
|
{
|
||||||
pth_event_t evt;
|
pth_event_t evt;
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
int rc;
|
|
||||||
#ifdef HAVE_W32_SYSTEM
|
#ifdef HAVE_W32_SYSTEM
|
||||||
DWORD dummyec;
|
DWORD rc;
|
||||||
|
#else
|
||||||
|
int rc;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!primary_scd_ctx)
|
if (!primary_scd_ctx)
|
||||||
@ -443,8 +447,11 @@ agent_scd_check_aliveness (void)
|
|||||||
{
|
{
|
||||||
pid = assuan_get_pid (primary_scd_ctx);
|
pid = assuan_get_pid (primary_scd_ctx);
|
||||||
#ifdef HAVE_W32_SYSTEM
|
#ifdef HAVE_W32_SYSTEM
|
||||||
|
/* If we have a PID we disconnect if either GetExitProcessCode
|
||||||
|
fails or if ir returns the exit code of the scdaemon. 259 is
|
||||||
|
the error code for STILL_ALIVE. */
|
||||||
if (pid != (pid_t)(void*)(-1) && pid
|
if (pid != (pid_t)(void*)(-1) && pid
|
||||||
&& !GetExitCodeProcess ((HANDLE)pid, &dummyec))
|
&& (!GetExitCodeProcess ((HANDLE)pid, &rc) || rc != 259))
|
||||||
#else
|
#else
|
||||||
if (pid != (pid_t)(-1) && pid
|
if (pid != (pid_t)(-1) && pid
|
||||||
&& ((rc=waitpid (pid, NULL, WNOHANG))==-1 || (rc == pid)) )
|
&& ((rc=waitpid (pid, NULL, WNOHANG))==-1 || (rc == pid)) )
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
|
2008-10-15 Werner Koch <wk@g10code.com>
|
||||||
|
|
||||||
|
* logging.c (do_logv) [W32]: Flush the log stream.
|
||||||
|
|
||||||
2008-09-29 Werner Koch <wk@g10code.com>
|
2008-09-29 Werner Koch <wk@g10code.com>
|
||||||
|
|
||||||
* argparse.c (ARGERR_): Use constants for error values.
|
* argparse.c (ARGERR_): Use constants for error values.
|
||||||
|
@ -490,6 +490,10 @@ do_logv (int level, const char *fmt, va_list arg_ptr)
|
|||||||
vfprintf(logstream,fmt,arg_ptr) ;
|
vfprintf(logstream,fmt,arg_ptr) ;
|
||||||
if (*fmt && fmt[strlen(fmt)-1] != '\n')
|
if (*fmt && fmt[strlen(fmt)-1] != '\n')
|
||||||
missing_lf = 1;
|
missing_lf = 1;
|
||||||
|
#ifdef HAVE_W32_SYSTEM
|
||||||
|
else
|
||||||
|
fflush (logstream);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (level == JNLIB_LOG_FATAL)
|
if (level == JNLIB_LOG_FATAL)
|
||||||
|
@ -1,3 +1,12 @@
|
|||||||
|
2008-10-15 Werner Koch <wk@g10code.com>
|
||||||
|
|
||||||
|
* command.c (scd_command_handler): Return true if there is no more
|
||||||
|
active session.
|
||||||
|
* scdaemon.c (start_connection_thread): Set shutdown flag if
|
||||||
|
requested by command handler.
|
||||||
|
(main): Make PIPE_SERVER module global.
|
||||||
|
(handle_connections): Disable listen_fd if a shutdown is pending.
|
||||||
|
|
||||||
2008-10-14 Werner Koch <wk@g10code.com>
|
2008-10-14 Werner Koch <wk@g10code.com>
|
||||||
|
|
||||||
|
|
||||||
|
@ -2442,11 +2442,7 @@ apdu_open_reader (const char *portstr)
|
|||||||
pcsc_api_loaded = 1;
|
pcsc_api_loaded = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef NEED_PCSC_WRAPPER
|
|
||||||
return open_pcsc_reader_wrapped (portstr);
|
|
||||||
#else
|
|
||||||
return open_pcsc_reader (portstr);
|
return open_pcsc_reader (portstr);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* command.c - SCdaemon command handler
|
/* command.c - SCdaemon command handler
|
||||||
* Copyright (C) 2001, 2002, 2003, 2004, 2005,
|
* Copyright (C) 2001, 2002, 2003, 2004, 2005,
|
||||||
* 2007 Free Software Foundation, Inc.
|
* 2007, 2008 Free Software Foundation, Inc.
|
||||||
*
|
*
|
||||||
* This file is part of GnuPG.
|
* This file is part of GnuPG.
|
||||||
*
|
*
|
||||||
@ -1776,8 +1776,9 @@ register_commands (assuan_context_t ctx)
|
|||||||
|
|
||||||
|
|
||||||
/* Startup the server. If FD is given as -1 this is simple pipe
|
/* Startup the server. If FD is given as -1 this is simple pipe
|
||||||
server, otherwise it is a regular server. */
|
server, otherwise it is a regular server. Returns true if there
|
||||||
void
|
are no more active asessions. */
|
||||||
|
int
|
||||||
scd_command_handler (ctrl_t ctrl, int fd)
|
scd_command_handler (ctrl_t ctrl, int fd)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
@ -1872,6 +1873,9 @@ scd_command_handler (ctrl_t ctrl, int fd)
|
|||||||
|
|
||||||
/* Release the Assuan context. */
|
/* Release the Assuan context. */
|
||||||
assuan_deinit_server (ctx);
|
assuan_deinit_server (ctx);
|
||||||
|
|
||||||
|
/* If there are no more sessions return true. */
|
||||||
|
return !session_list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* scdaemon.c - The GnuPG Smartcard Daemon
|
/* scdaemon.c - The GnuPG Smartcard Daemon
|
||||||
* Copyright (C) 2001, 2002, 2004, 2005,
|
* Copyright (C) 2001, 2002, 2004, 2005,
|
||||||
* 2007 Free Software Foundation, Inc.
|
* 2007, 2008 Free Software Foundation, Inc.
|
||||||
*
|
*
|
||||||
* This file is part of GnuPG.
|
* This file is part of GnuPG.
|
||||||
*
|
*
|
||||||
@ -167,6 +167,9 @@ static int shutdown_pending;
|
|||||||
/* It is possible that we are currently running under setuid permissions */
|
/* It is possible that we are currently running under setuid permissions */
|
||||||
static int maybe_setuid = 1;
|
static int maybe_setuid = 1;
|
||||||
|
|
||||||
|
/* Flag telling whether we are running as a pipe server. */
|
||||||
|
static int pipe_server;
|
||||||
|
|
||||||
/* Name of the communication socket */
|
/* Name of the communication socket */
|
||||||
static char *socket_name;
|
static char *socket_name;
|
||||||
|
|
||||||
@ -304,7 +307,6 @@ main (int argc, char **argv )
|
|||||||
int default_config =1;
|
int default_config =1;
|
||||||
int greeting = 0;
|
int greeting = 0;
|
||||||
int nogreeting = 0;
|
int nogreeting = 0;
|
||||||
int pipe_server = 0;
|
|
||||||
int multi_server = 0;
|
int multi_server = 0;
|
||||||
int is_daemon = 0;
|
int is_daemon = 0;
|
||||||
int nodetach = 0;
|
int nodetach = 0;
|
||||||
@ -1027,19 +1029,18 @@ start_connection_thread (void *arg)
|
|||||||
log_info (_("handler for fd %d started\n"),
|
log_info (_("handler for fd %d started\n"),
|
||||||
FD2INT(ctrl->thread_startup.fd));
|
FD2INT(ctrl->thread_startup.fd));
|
||||||
|
|
||||||
scd_command_handler (ctrl, FD2INT(ctrl->thread_startup.fd));
|
/* If this is a pipe server, we request a shutdown if the command
|
||||||
|
hanlder asked for it. With the next ticker event and given that
|
||||||
|
no other connections are running the shutdown will then
|
||||||
|
happen. */
|
||||||
|
if (scd_command_handler (ctrl, FD2INT(ctrl->thread_startup.fd))
|
||||||
|
&& pipe_server)
|
||||||
|
shutdown_pending = 1;
|
||||||
|
|
||||||
if (opt.verbose)
|
if (opt.verbose)
|
||||||
log_info (_("handler for fd %d terminated\n"),
|
log_info (_("handler for fd %d terminated\n"),
|
||||||
FD2INT (ctrl->thread_startup.fd));
|
FD2INT (ctrl->thread_startup.fd));
|
||||||
|
|
||||||
/* If this thread is the pipe connection thread, flag that a
|
|
||||||
shutdown is required. With the next ticker event and given that
|
|
||||||
no other connections are running the shutdown will then
|
|
||||||
happen. */
|
|
||||||
if (ctrl->thread_startup.fd == GNUPG_INVALID_FD)
|
|
||||||
shutdown_pending = 1;
|
|
||||||
|
|
||||||
scd_deinit_default_ctrl (ctrl);
|
scd_deinit_default_ctrl (ctrl);
|
||||||
xfree (ctrl);
|
xfree (ctrl);
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -1105,6 +1106,7 @@ handle_connections (int listen_fd)
|
|||||||
file descriptors to wait for, so that the select will be
|
file descriptors to wait for, so that the select will be
|
||||||
used to just wait on a signal or timeout event. */
|
used to just wait on a signal or timeout event. */
|
||||||
FD_ZERO (&fdset);
|
FD_ZERO (&fdset);
|
||||||
|
listen_fd = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create a timeout event if needed. */
|
/* Create a timeout event if needed. */
|
||||||
|
@ -121,7 +121,7 @@ const char *scd_get_socket_name (void);
|
|||||||
|
|
||||||
/*-- command.c --*/
|
/*-- command.c --*/
|
||||||
void initialize_module_command (void);
|
void initialize_module_command (void);
|
||||||
void scd_command_handler (ctrl_t, int);
|
int scd_command_handler (ctrl_t, int);
|
||||||
void send_status_info (ctrl_t ctrl, const char *keyword, ...)
|
void send_status_info (ctrl_t ctrl, const char *keyword, ...)
|
||||||
GNUPG_GCC_A_SENTINEL(1);
|
GNUPG_GCC_A_SENTINEL(1);
|
||||||
void scd_update_reader_status_file (void);
|
void scd_update_reader_status_file (void);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user