summaryrefslogtreecommitdiffstats
path: root/common/t-dotlock.c
diff options
context:
space:
mode:
authorWerner Koch <wk@gnupg.org>2023-12-13 10:08:12 +0100
committerWerner Koch <wk@gnupg.org>2023-12-18 15:21:26 +0100
commit937aeb1904eb5cbe7a8c1c686877c7a9e1196ca6 (patch)
treedc8e4dbd870fff29ceb2248d61d19769a81338af /common/t-dotlock.c
parentcommon: Improve error return for dotlock. (diff)
downloadgnupg2-937aeb1904eb5cbe7a8c1c686877c7a9e1196ca6.tar.xz
gnupg2-937aeb1904eb5cbe7a8c1c686877c7a9e1196ca6.zip
common: Add an info callback to dotlock.
* common/dotlock.h (enum dotlock_reasons): New. (DOTLOCK_PREPARE_CREATE): New flag. * common/dotlock.c (struct dotlock_handle): Add info_cb and info_cb_value. (dotlock_create): Support the new flag. (dotlock_finish_create): New. (read_lockfile): Silence in case of ENOENT. (dotlock_set_info_cb): New. Use callback after all error and info messages. (dotlock_take_unix, dotlock_take_w32): Allow termination by callback.
Diffstat (limited to '')
-rw-r--r--common/t-dotlock.c36
1 files changed, 35 insertions, 1 deletions
diff --git a/common/t-dotlock.c b/common/t-dotlock.c
index 994ef1be3..87e62bb33 100644
--- a/common/t-dotlock.c
+++ b/common/t-dotlock.c
@@ -52,6 +52,7 @@
#ifdef HAVE_W32_SYSTEM
#define DIM(v) (sizeof(v)/sizeof((v)[0]))
+
const char *
w32_strerror (int ec)
{
@@ -174,6 +175,11 @@ strconcat (const char *s1, ...)
#define PGM "t-dotlock"
+static int opt_silent;
+
+
+
+
#ifndef HAVE_W32_SYSTEM
static volatile int ctrl_c_pending_flag;
static void
@@ -217,6 +223,9 @@ inf (const char *format, ...)
{
va_list arg_ptr;
+ if (opt_silent)
+ return;
+
va_start (arg_ptr, format);
fprintf (stderr, PGM "[%lu]: ", (unsigned long)getpid ());
vfprintf (stderr, format, arg_ptr);
@@ -225,15 +234,35 @@ inf (const char *format, ...)
}
+static int
+lock_info_cb (dotlock_t h, void *opaque, enum dotlock_reasons reason,
+ const char *format, ...)
+{
+ va_list arg_ptr;
+
+ va_start (arg_ptr, format);
+ fprintf (stderr, PGM "[%lu]: info_cb: reason %d, ",
+ (unsigned long)getpid (), (int)reason);
+ vfprintf (stderr, format, arg_ptr);
+ va_end (arg_ptr);
+ return 0;
+}
+
+
static void
lock_and_unlock (const char *fname)
{
dotlock_t h;
unsigned long usec;
- h = dotlock_create (fname, 0);
+ h = dotlock_create (fname, DOTLOCK_PREPARE_CREATE);
if (!h)
die ("error creating lock file for '%s': %s", fname, strerror (errno));
+ dotlock_set_info_cb (h, lock_info_cb, NULL);
+ h = dotlock_finish_create (h, fname);
+ if (!h)
+ die ("error finishing lock file creation for '%s': %s",
+ fname, strerror (errno));
inf ("lock created");
do
@@ -270,6 +299,11 @@ main (int argc, char **argv)
ctrl_c_pending_flag = 1;
argc--;
}
+ if (argc > 1 && !strcmp (argv[1], "--silent"))
+ {
+ opt_silent = 1;
+ argc--;
+ }
if (argc > 1)
fname = argv[argc-1];