summaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorWerner Koch <wk@gnupg.org>2017-06-23 13:20:42 +0200
committerWerner Koch <wk@gnupg.org>2017-06-23 13:20:42 +0200
commit1ead1ca818bddabc3bca22c195be667993eb3e2e (patch)
tree5899fddd101a36ddbcd2176b1da5ac9c4d81bd4c /common
parentbuild: Add missing LIBASSUAN_CFLAGS to dirmngr/. (diff)
downloadgnupg2-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.c37
-rw-r--r--common/sysutils.h1
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);