diff options
author | Werner Koch <wk@gnupg.org> | 2017-06-23 13:20:42 +0200 |
---|---|---|
committer | Werner Koch <wk@gnupg.org> | 2017-06-23 13:20:42 +0200 |
commit | 1ead1ca818bddabc3bca22c195be667993eb3e2e (patch) | |
tree | 5899fddd101a36ddbcd2176b1da5ac9c4d81bd4c /common | |
parent | build: Add missing LIBASSUAN_CFLAGS to dirmngr/. (diff) | |
download | gnupg2-1ead1ca818bddabc3bca22c195be667993eb3e2e.tar.xz gnupg2-1ead1ca818bddabc3bca22c195be667993eb3e2e.zip |
agent: Shutdown on removal of the home directory.
* common/sysutils.c (gnupg_inotify_watch_delete_self): New.
* agent/gpg-agent.c (handle_connections): Rename my_inotify_fd to
sock_inotify_fd.
(handle_connections): Add home_inotify_fd to watch the home directory.
--
GnuPG-bug-id: 3218
Note that we should add this also to dirmngr. And for non-Linux
systems a stat in ticker should be implemented.
Signed-off-by: Werner Koch <wk@gnupg.org>
Diffstat (limited to 'common')
-rw-r--r-- | common/sysutils.c | 37 | ||||
-rw-r--r-- | common/sysutils.h | 1 |
2 files changed, 38 insertions, 0 deletions
diff --git a/common/sysutils.c b/common/sysutils.c index ea0acdb3e..1aa2e5314 100644 --- a/common/sysutils.c +++ b/common/sysutils.c @@ -1125,6 +1125,43 @@ w32_get_user_sid (void) /* Support for inotify under Linux. */ +/* Store a new inotify file handle for FNAME at R_FD or return an + * error code. This file descriptor watch the removal of FNAME. */ +gpg_error_t +gnupg_inotify_watch_delete_self (int *r_fd, const char *fname) +{ +#if HAVE_INOTIFY_INIT + gpg_error_t err; + int fd; + + *r_fd = -1; + + if (!fname) + return my_error (GPG_ERR_INV_VALUE); + + fd = inotify_init (); + if (fd == -1) + return my_error_from_syserror (); + + if (inotify_add_watch (fd, fname, IN_DELETE_SELF) == -1) + { + err = my_error_from_syserror (); + close (fd); + return err; + } + + *r_fd = fd; + return 0; +#else /*!HAVE_INOTIFY_INIT*/ + + (void)fname; + *r_fd = -1; + return my_error (GPG_ERR_NOT_SUPPORTED); + +#endif /*!HAVE_INOTIFY_INIT*/ +} + + /* Store a new inotify file handle for SOCKET_NAME at R_FD or return * an error code. */ gpg_error_t diff --git a/common/sysutils.h b/common/sysutils.h index ecd9f846e..e93ea2b1c 100644 --- a/common/sysutils.h +++ b/common/sysutils.h @@ -74,6 +74,7 @@ char *gnupg_getcwd (void); char *gnupg_get_socket_name (int fd); int gnupg_fd_valid (int fd); +gpg_error_t gnupg_inotify_watch_delete_self (int *r_fd, const char *fname); gpg_error_t gnupg_inotify_watch_socket (int *r_fd, const char *socket_name); int gnupg_inotify_has_name (int fd, const char *name); |