From 1f04993cd0acaf6fb4982e822f8d8b5722197e03 Mon Sep 17 00:00:00 2001 From: NIIBE Yutaka Date: Wed, 20 Dec 2023 10:55:26 +0900 Subject: [PATCH] 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 --- tools/Makefile.am | 8 ++++- tools/dotlock.c | 88 +++++++++++++++++++++++++++++++---------------- 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 #include #include -#include #include -#ifdef HAVE_W32_SYSTEM -# include "windows.h" -#else -#include -#endif -#include "dotlock.h" +#include +#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; - fname = argv[argc-1]; + if (argc >= 2 && !strcmp (argv[1], "-u")) + { + op_unlock = 1; + argc--; + argv++; + } - if () - lock (fname); + 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 - unlock (fname); + /* Other locks. */ + fname = name; + filename = make_absfilename (gnupg_homedir (), fname, NULL); + + if (op_unlock) + unlock (filename); + else + 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: -*/