mirror of
git://git.gnupg.org/gnupg.git
synced 2025-07-02 22:46:30 +02:00
agent: Move inotify code to common and improve it.
* common/sysutils.c: Include sys/inotify.h. (my_error_from_syserror, my_error): New. (gnupg_inotify_watch_socket): New. (gnupg_inotify_has_name): New. * agent/gpg-agent.c: Do not include sys/inotify.h. (my_inotify_is_name): Remove. (handle_connections): Remove HAVE_INOTIFY_INIT protected code and use the new functions. -- When removing not a simple socket file but the entire directory the old code missed most events and thus did not worked properly. IN_DELETE_SELF has also been added to the watch list to detect a removal of the directory. However, in all tests that event was not triggered. The only way it could be triggered was by not watching the socket dir but an arbitary directory and rmdir that. GnuPG-bug-id: 2756 Signed-off-by: Werner Koch <wk@gnupg.org>
This commit is contained in:
parent
c318561ef4
commit
2f7d4c38c9
3 changed files with 140 additions and 56 deletions
|
@ -47,9 +47,6 @@
|
|||
#ifdef HAVE_SIGNAL_H
|
||||
# include <signal.h>
|
||||
#endif
|
||||
#ifdef HAVE_INOTIFY_INIT
|
||||
# include <sys/inotify.h>
|
||||
#endif /*HAVE_INOTIFY_INIT*/
|
||||
#include <npth.h>
|
||||
|
||||
#define GNUPG_COMMON_NEED_AFLOCAL
|
||||
|
@ -2716,31 +2713,6 @@ start_connection_thread_ssh (void *arg)
|
|||
}
|
||||
|
||||
|
||||
#ifdef HAVE_INOTIFY_INIT
|
||||
/* Read an inotify event and return true if it matches NAME. */
|
||||
static int
|
||||
my_inotify_is_name (int fd, const char *name)
|
||||
{
|
||||
union {
|
||||
struct inotify_event ev;
|
||||
char _buf[sizeof (struct inotify_event) + 100 + 1];
|
||||
} buf;
|
||||
int n;
|
||||
|
||||
n = npth_read (fd, &buf, sizeof buf);
|
||||
if (n < sizeof (struct inotify_event))
|
||||
return 0;
|
||||
if (buf.ev.len < strlen (name)+1)
|
||||
return 0;
|
||||
if (strcmp (buf.ev.name, name))
|
||||
return 0; /* Not the desired file. */
|
||||
|
||||
return 1; /* Found. */
|
||||
}
|
||||
#endif /*HAVE_INOTIFY_INIT*/
|
||||
|
||||
|
||||
|
||||
/* Connection handler loop. Wait for connection requests and spawn a
|
||||
thread after accepting a connection. */
|
||||
static void
|
||||
|
@ -2749,6 +2721,7 @@ handle_connections (gnupg_fd_t listen_fd,
|
|||
gnupg_fd_t listen_fd_browser,
|
||||
gnupg_fd_t listen_fd_ssh)
|
||||
{
|
||||
gpg_error_t err;
|
||||
npth_attr_t tattr;
|
||||
struct sockaddr_un paddr;
|
||||
socklen_t plen;
|
||||
|
@ -2764,9 +2737,7 @@ handle_connections (gnupg_fd_t listen_fd,
|
|||
HANDLE events[2];
|
||||
unsigned int events_set;
|
||||
#endif
|
||||
#ifdef HAVE_INOTIFY_INIT
|
||||
int my_inotify_fd;
|
||||
#endif /*HAVE_INOTIFY_INIT*/
|
||||
int my_inotify_fd = -1;
|
||||
struct {
|
||||
const char *name;
|
||||
void *(*func) (void *arg);
|
||||
|
@ -2804,27 +2775,14 @@ handle_connections (gnupg_fd_t listen_fd,
|
|||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_INOTIFY_INIT
|
||||
if (disable_check_own_socket)
|
||||
my_inotify_fd = -1;
|
||||
else if ((my_inotify_fd = inotify_init ()) == -1)
|
||||
log_info ("error enabling fast daemon termination: %s\n",
|
||||
strerror (errno));
|
||||
else
|
||||
else if ((err = gnupg_inotify_watch_socket (&my_inotify_fd, socket_name)))
|
||||
{
|
||||
/* We need to watch the directory for the file because there
|
||||
* won't be an IN_DELETE_SELF for a socket file. */
|
||||
char *slash = strrchr (socket_name, '/');
|
||||
log_assert (slash && slash[1]);
|
||||
*slash = 0;
|
||||
if (inotify_add_watch (my_inotify_fd, socket_name, IN_DELETE) == -1)
|
||||
{
|
||||
close (my_inotify_fd);
|
||||
my_inotify_fd = -1;
|
||||
}
|
||||
*slash = '/';
|
||||
if (gpg_err_code (err) != GPG_ERR_NOT_SUPPORTED)
|
||||
log_info ("error enabling fast daemon termination: %s\n",
|
||||
gpg_strerror (err));
|
||||
}
|
||||
#endif /*HAVE_INOTIFY_INIT*/
|
||||
|
||||
/* On Windows we need to fire up a separate thread to listen for
|
||||
requests from Putty (an SSH client), so we can replace Putty's
|
||||
|
@ -2867,14 +2825,12 @@ handle_connections (gnupg_fd_t listen_fd,
|
|||
if (FD2INT (listen_fd_ssh) > nfd)
|
||||
nfd = FD2INT (listen_fd_ssh);
|
||||
}
|
||||
#ifdef HAVE_INOTIFY_INIT
|
||||
if (my_inotify_fd != -1)
|
||||
{
|
||||
FD_SET (my_inotify_fd, &fdset);
|
||||
if (my_inotify_fd > nfd)
|
||||
nfd = my_inotify_fd;
|
||||
}
|
||||
#endif /*HAVE_INOTIFY_INIT*/
|
||||
|
||||
listentbl[0].l_fd = listen_fd;
|
||||
listentbl[1].l_fd = listen_fd_extra;
|
||||
|
@ -2949,14 +2905,13 @@ handle_connections (gnupg_fd_t listen_fd,
|
|||
ctrl_t ctrl;
|
||||
npth_t thread;
|
||||
|
||||
#ifdef HAVE_INOTIFY_INIT
|
||||
if (my_inotify_fd != -1 && FD_ISSET (my_inotify_fd, &read_fdset)
|
||||
&& my_inotify_is_name (my_inotify_fd, GPG_AGENT_SOCK_NAME))
|
||||
if (my_inotify_fd != -1
|
||||
&& FD_ISSET (my_inotify_fd, &read_fdset)
|
||||
&& gnupg_inotify_has_name (my_inotify_fd, GPG_AGENT_SOCK_NAME))
|
||||
{
|
||||
shutdown_pending = 1;
|
||||
log_info ("socket file has been removed - shutting down\n");
|
||||
}
|
||||
#endif /*HAVE_INOTIFY_INIT*/
|
||||
|
||||
for (idx=0; idx < DIM(listentbl); idx++)
|
||||
{
|
||||
|
@ -3004,10 +2959,8 @@ handle_connections (gnupg_fd_t listen_fd,
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef HAVE_INOTIFY_INIT
|
||||
if (my_inotify_fd != -1)
|
||||
close (my_inotify_fd);
|
||||
#endif /*HAVE_INOTIFY_INIT*/
|
||||
cleanup ();
|
||||
log_info (_("%s %s stopped\n"), strusage(11), strusage(13));
|
||||
npth_attr_destroy (&tattr);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue