1
0
mirror of git://git.gnupg.org/gnupg.git synced 2024-05-27 21:41:23 +02:00

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 <gniibe@fsij.org>
This commit is contained in:
NIIBE Yutaka 2023-12-20 10:55:26 +09:00
parent b298322d36
commit 1f04993cd0
No known key found for this signature in database
GPG Key ID: 640114AF89DE6054
2 changed files with 65 additions and 31 deletions

View File

@ -69,7 +69,7 @@ else
bin_PROGRAMS += gpgconf-w32 bin_PROGRAMS += gpgconf-w32
endif endif
libexec_PROGRAMS = gpg-check-pattern gpg-pair-tool libexec_PROGRAMS = gpg-check-pattern gpg-pair-tool dotlock
if !HAVE_W32_SYSTEM if !HAVE_W32_SYSTEM
libexec_PROGRAMS += gpg-auth libexec_PROGRAMS += gpg-auth
endif endif
@ -203,6 +203,12 @@ gpg_auth_LDADD = $(common_libs) \
$(GPG_ERROR_LIBS) \ $(GPG_ERROR_LIBS) \
$(LIBINTL) $(NETLIBS) $(LIBICONV) $(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 # 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. # gpg-wks-client location. We assume bin is a sibling of libexec.
install-exec-local: install-exec-local:

View File

@ -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 * Copyright (C) 2023 g10 Code GmbH
* *
* This file is part of GnuPG. * This file is part of GnuPG.
@ -25,63 +25,91 @@
#include <stdarg.h> #include <stdarg.h>
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
#include <signal.h>
#include <unistd.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 static void
lock (const char *fname) lock (const char *filename)
{ {
dotlock_t h; 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) 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)) if (dotlock_take (h, 0))
die ("error taking lock"); {
perror ("error taking lock");
dotlock_destroy (h);
exit (1);
}
dotlock_destroy (h);
} }
static void static void
unlock (const char *fname, long timeout) unlock (const char *filename)
{ {
dotlock_t h; dotlock_t h;
unsigned int flags = (DOTLOCK_FLAG_LOCK_BY_PARENT unsigned int flags = (DOTLOCK_LOCK_BY_PARENT | DOTLOCK_LOCKED);
| DOTLOCK_FLAG_READONLY);
h = dotlock_create (fname, flags); h = dotlock_create (filename, flags);
if (!h) 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); dotlock_destroy (h);
} }
int int
main (int argc, char **argv) main (int argc, const char *argv[])
{ {
const char *name;
const char *fname; 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 () if (argc != 2)
lock (fname); {
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 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; return 0;
} }
/*
Local Variables:
compile-command: "cc -Wall -O2 -D_FILE_OFFSET_BITS=64 -o t-dotlock t-dotlock.c"
End:
*/