aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNIIBE Yutaka <[email protected]>2023-12-20 01:55:26 +0000
committerNIIBE Yutaka <[email protected]>2023-12-20 02:05:50 +0000
commit1f04993cd0acaf6fb4982e822f8d8b5722197e03 (patch)
treeccec047b2713556d4f15e001018a9f60daa1d017
parentcommon: Clean up the temporary file at dotlock_destroy. (diff)
downloadgnupg-1f04993cd0acaf6fb4982e822f8d8b5722197e03.tar.gz
gnupg-1f04993cd0acaf6fb4982e822f8d8b5722197e03.zip
common: Add dotlock util under libexec.
* tools/Makefile.am (libexec_PROGRAMS): Add dotlock. * tools/dotlock.c: Finish the first implementation. -- Signed-off-by: NIIBE Yutaka <[email protected]>
-rw-r--r--tools/Makefile.am8
-rw-r--r--tools/dotlock.c88
2 files changed, 65 insertions, 31 deletions
diff --git a/tools/Makefile.am b/tools/Makefile.am
index 769a81a00..b813f55f9 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -69,7 +69,7 @@ else
bin_PROGRAMS += gpgconf-w32
endif
-libexec_PROGRAMS = gpg-check-pattern gpg-pair-tool
+libexec_PROGRAMS = gpg-check-pattern gpg-pair-tool dotlock
if !HAVE_W32_SYSTEM
libexec_PROGRAMS += gpg-auth
endif
@@ -203,6 +203,12 @@ gpg_auth_LDADD = $(common_libs) \
$(GPG_ERROR_LIBS) \
$(LIBINTL) $(NETLIBS) $(LIBICONV)
+dotlock_SOURCES = dotlock.c
+dotlock_LDADD = $(common_libs) \
+ $(LIBGCRYPT_LIBS) \
+ $(GPG_ERROR_LIBS) \
+ $(LIBINTL) $(NETLIBS) $(LIBICONV)
+
# Instead of a symlink we install a simple wrapper script for the new
# gpg-wks-client location. We assume bin is a sibling of libexec.
install-exec-local:
diff --git a/tools/dotlock.c b/tools/dotlock.c
index 27ae5205b..3dfb86c80 100644
--- a/tools/dotlock.c
+++ b/tools/dotlock.c
@@ -1,4 +1,4 @@
-/* dotlock.c - Command to handle dotlock.
+/* dotlock.c - A utility to handle dotlock by command line.
* Copyright (C) 2023 g10 Code GmbH
*
* This file is part of GnuPG.
@@ -25,63 +25,91 @@
#include <stdarg.h>
#include <string.h>
#include <errno.h>
-#include <signal.h>
#include <unistd.h>
-#ifdef HAVE_W32_SYSTEM
-# include "windows.h"
-#else
-#include <sys/random.h>
-#endif
-#include "dotlock.h"
+#include <gpg-error.h>
+#include "../common/util.h"
+#include "../common/stringhelp.h"
+#include "../common/dotlock.h"
static void
-lock (const char *fname)
+lock (const char *filename)
{
dotlock_t h;
- unsigned int flags = DOTLOCK_FLAG_LOCK_BY_PARENT;
+ unsigned int flags = DOTLOCK_LOCK_BY_PARENT;
- h = dotlock_create (fname, flags);
+ h = dotlock_create (filename, flags);
if (!h)
- die ("error creating lock file for '%s': %s", fname, strerror (errno));
+ {
+ perror ("error creating lock file");
+ exit (1);
+ }
if (dotlock_take (h, 0))
- die ("error taking lock");
+ {
+ perror ("error taking lock");
+ dotlock_destroy (h);
+ exit (1);
+ }
+
+ dotlock_destroy (h);
}
static void
-unlock (const char *fname, long timeout)
+unlock (const char *filename)
{
dotlock_t h;
- unsigned int flags = (DOTLOCK_FLAG_LOCK_BY_PARENT
- | DOTLOCK_FLAG_READONLY);
+ unsigned int flags = (DOTLOCK_LOCK_BY_PARENT | DOTLOCK_LOCKED);
- h = dotlock_create (fname, flags);
+ h = dotlock_create (filename, flags);
if (!h)
- die ("error creating lock file for '%s': %s", fname, strerror (errno));
+ {
+ perror ("no lock file");
+ exit (1);
+ }
+ dotlock_release (h);
dotlock_destroy (h);
}
int
-main (int argc, char **argv)
+main (int argc, const char *argv[])
{
+ const char *name;
const char *fname;
+ char *filename;
+ int op_unlock = 0;
+
+ if (argc >= 2 && !strcmp (argv[1], "-u"))
+ {
+ op_unlock = 1;
+ argc--;
+ argv++;
+ }
+
+ if (argc != 2)
+ {
+ printf ("Usage: %s [-u] NAME\n", argv[0]);
+ exit (1);
+ }
+
+ name = argv[1];
+
+ if (!strcmp (name, "pubring.db"))
+ /* Keybox pubring.db lock */
+ fname = "public-keys.d/pubring.db";
+ else
+ /* Other locks. */
+ fname = name;
- fname = argv[argc-1];
+ filename = make_absfilename (gnupg_homedir (), fname, NULL);
- if ()
- lock (fname);
+ if (op_unlock)
+ unlock (filename);
else
- unlock (fname);
+ lock (filename);
+ xfree (filename);
return 0;
}
-
-
-/*
-Local Variables:
-compile-command: "cc -Wall -O2 -D_FILE_OFFSET_BITS=64 -o t-dotlock t-dotlock.c"
-End:
-*/