mirror of
git://git.gnupg.org/gnupg.git
synced 2025-04-12 22:11:29 +02:00
Replace file locking by the new portable dotlock code.
* include/dotlock.h: New. From current gnupg master. * util/dotlock.c: Ditto. Include util.h. The major changes done in master are: Factor Unix and W32 specific code out into specific functions. Define HAVE_POSIX_SYSTEM. Rearrange some functions. (disable_dotlock): Rename to dotlock_disable. (create_dotlock): Rename to dotlock_create and add a dummy arg. (destroy_dotlock): Rename to dotlock_destroy. (make_dotlock): Rename to dotlock_take. (release_dotlock): Rename to dotlock_release. (remove_lockfiles): Rename to dotlock_remove_lockfiles.
This commit is contained in:
parent
dccdcef319
commit
b9333cd890
@ -933,7 +933,8 @@ AM_CONDITIONAL(ENABLE_AGENT_SUPPORT, test "$agent_support" = yes)
|
|||||||
|
|
||||||
dnl Checks for header files.
|
dnl Checks for header files.
|
||||||
AC_HEADER_STDC
|
AC_HEADER_STDC
|
||||||
AC_CHECK_HEADERS([unistd.h langinfo.h termio.h locale.h getopt.h pwd.h])
|
AC_CHECK_HEADERS([unistd.h langinfo.h termio.h locale.h getopt.h pwd.h \
|
||||||
|
signal.h])
|
||||||
|
|
||||||
# Note that we do not check for iconv here because this is done anyway
|
# Note that we do not check for iconv here because this is done anyway
|
||||||
# by the gettext checks and thus it allows us to disable the use of
|
# by the gettext checks and thus it allows us to disable the use of
|
||||||
|
@ -1895,7 +1895,7 @@ main (int argc, char **argv )
|
|||||||
secure_randoxmalloc(); /* put random number into secure memory */
|
secure_randoxmalloc(); /* put random number into secure memory */
|
||||||
may_coredump = disable_core_dumps();
|
may_coredump = disable_core_dumps();
|
||||||
init_signals();
|
init_signals();
|
||||||
create_dotlock(NULL); /* register locking cleanup */
|
dotlock_create (NULL, 0); /* Register locking cleanup. */
|
||||||
i18n_init();
|
i18n_init();
|
||||||
opt.command_fd = -1; /* no command fd */
|
opt.command_fd = -1; /* no command fd */
|
||||||
opt.compress_level = -1; /* defaults to standard compress level */
|
opt.compress_level = -1; /* defaults to standard compress level */
|
||||||
@ -2607,7 +2607,7 @@ main (int argc, char **argv )
|
|||||||
case oNoEscapeFrom: opt.escape_from = 0; break;
|
case oNoEscapeFrom: opt.escape_from = 0; break;
|
||||||
case oLockOnce: opt.lock_once = 1; break;
|
case oLockOnce: opt.lock_once = 1; break;
|
||||||
case oLockNever:
|
case oLockNever:
|
||||||
disable_dotlock ();
|
dotlock_disable ();
|
||||||
random_disable_locking ();
|
random_disable_locking ();
|
||||||
break;
|
break;
|
||||||
case oLockMultiple:
|
case oLockMultiple:
|
||||||
|
15
g10/gpgv.c
15
g10/gpgv.c
@ -148,7 +148,7 @@ main( int argc, char **argv )
|
|||||||
|
|
||||||
tty_no_terminal(1);
|
tty_no_terminal(1);
|
||||||
tty_batchmode(1);
|
tty_batchmode(1);
|
||||||
disable_dotlock();
|
dotlock_disable ();
|
||||||
|
|
||||||
set_native_charset (NULL); /* Try to auto set the character set */
|
set_native_charset (NULL); /* Try to auto set the character set */
|
||||||
|
|
||||||
@ -430,9 +430,10 @@ void rl_free_line_state (void) {}
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* We do not do any locking, so use these stubs here */
|
/* We do not do any locking, so use these stubs here */
|
||||||
void disable_dotlock(void) {}
|
void dotlock_disable(void) {}
|
||||||
DOTLOCK create_dotlock( const char *file_to_lock ) { return NULL; }
|
dotlock_t dotlock_create (const char *file_to_lock, unsigned int flags)
|
||||||
void destroy_dotlock (DOTLOCK h) {}
|
{ return NULL; }
|
||||||
int make_dotlock( DOTLOCK h, long timeout ) { return 0;}
|
void dotlock_destroy (dotlock_t h) {}
|
||||||
int release_dotlock( DOTLOCK h ) {return 0;}
|
int dotlock_take (dotlock_t h, long timeout) { return 0;}
|
||||||
void remove_lockfiles(void) {}
|
int dotlock_release (dotlock_t h) {return 0;}
|
||||||
|
void dotlock_remove_lockfiles (void) {}
|
||||||
|
10
g10/keydb.c
10
g10/keydb.c
@ -76,7 +76,7 @@ static void unlock_all (KEYDB_HANDLE hd);
|
|||||||
static int
|
static int
|
||||||
maybe_create_keyring (char *filename, int force)
|
maybe_create_keyring (char *filename, int force)
|
||||||
{
|
{
|
||||||
DOTLOCK lockhd = NULL;
|
dotlock_t lockhd = NULL;
|
||||||
IOBUF iobuf;
|
IOBUF iobuf;
|
||||||
int rc;
|
int rc;
|
||||||
mode_t oldmask;
|
mode_t oldmask;
|
||||||
@ -120,7 +120,7 @@ maybe_create_keyring (char *filename, int force)
|
|||||||
/* To avoid races with other instances of gpg trying to create or
|
/* To avoid races with other instances of gpg trying to create or
|
||||||
update the keyring (it is removed during an update for a short
|
update the keyring (it is removed during an update for a short
|
||||||
time), we do the next stuff in a locked state. */
|
time), we do the next stuff in a locked state. */
|
||||||
lockhd = create_dotlock (filename);
|
lockhd = dotlock_create (filename, 0);
|
||||||
if (!lockhd)
|
if (!lockhd)
|
||||||
{
|
{
|
||||||
/* A reason for this to fail is that the directory is not
|
/* A reason for this to fail is that the directory is not
|
||||||
@ -136,7 +136,7 @@ maybe_create_keyring (char *filename, int force)
|
|||||||
return G10ERR_GENERAL;
|
return G10ERR_GENERAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( make_dotlock (lockhd, -1) )
|
if ( dotlock_take (lockhd, -1) )
|
||||||
{
|
{
|
||||||
/* This is something bad. Probably a stale lockfile. */
|
/* This is something bad. Probably a stale lockfile. */
|
||||||
log_info ("can't lock `%s'\n", filename );
|
log_info ("can't lock `%s'\n", filename );
|
||||||
@ -180,8 +180,8 @@ maybe_create_keyring (char *filename, int force)
|
|||||||
leave:
|
leave:
|
||||||
if (lockhd)
|
if (lockhd)
|
||||||
{
|
{
|
||||||
release_dotlock (lockhd);
|
dotlock_release (lockhd);
|
||||||
destroy_dotlock (lockhd);
|
dotlock_destroy (lockhd);
|
||||||
}
|
}
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
212
g10/keyring.c
212
g10/keyring.c
@ -30,7 +30,7 @@
|
|||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "keyring.h"
|
#include "keyring.h"
|
||||||
#include "packet.h"
|
#include "packet.h"
|
||||||
#include "keydb.h"
|
#include "keydb.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
#include "main.h" /*for check_key_signature()*/
|
#include "main.h" /*for check_key_signature()*/
|
||||||
#include "i18n.h"
|
#include "i18n.h"
|
||||||
@ -45,14 +45,14 @@ struct off_item {
|
|||||||
/*off_t off;*/
|
/*off_t off;*/
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct off_item **OffsetHashTable;
|
typedef struct off_item **OffsetHashTable;
|
||||||
|
|
||||||
|
|
||||||
typedef struct keyring_name *KR_NAME;
|
typedef struct keyring_name *KR_NAME;
|
||||||
struct keyring_name {
|
struct keyring_name {
|
||||||
struct keyring_name *next;
|
struct keyring_name *next;
|
||||||
int secret;
|
int secret;
|
||||||
DOTLOCK lockhd;
|
dotlock_t lockhd;
|
||||||
int is_locked;
|
int is_locked;
|
||||||
int did_full_scan;
|
int did_full_scan;
|
||||||
char fname[1];
|
char fname[1];
|
||||||
@ -76,7 +76,7 @@ struct keyring_handle {
|
|||||||
int error;
|
int error;
|
||||||
} current;
|
} current;
|
||||||
struct {
|
struct {
|
||||||
CONST_KR_NAME kr;
|
CONST_KR_NAME kr;
|
||||||
off_t offset;
|
off_t offset;
|
||||||
size_t pk_no;
|
size_t pk_no;
|
||||||
size_t uid_no;
|
size_t uid_no;
|
||||||
@ -99,7 +99,7 @@ static struct off_item *
|
|||||||
new_offset_item (void)
|
new_offset_item (void)
|
||||||
{
|
{
|
||||||
struct off_item *k;
|
struct off_item *k;
|
||||||
|
|
||||||
k = xmalloc_clear (sizeof *k);
|
k = xmalloc_clear (sizeof *k);
|
||||||
return k;
|
return k;
|
||||||
}
|
}
|
||||||
@ -118,7 +118,7 @@ release_offset_items (struct off_item *k)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static OffsetHashTable
|
static OffsetHashTable
|
||||||
new_offset_hash_table (void)
|
new_offset_hash_table (void)
|
||||||
{
|
{
|
||||||
struct off_item **tbl;
|
struct off_item **tbl;
|
||||||
@ -159,7 +159,7 @@ update_offset_hash_table (OffsetHashTable tbl, u32 *kid, off_t off)
|
|||||||
|
|
||||||
for (k = tbl[(kid[1] & 0x07ff)]; k; k = k->next)
|
for (k = tbl[(kid[1] & 0x07ff)]; k; k = k->next)
|
||||||
{
|
{
|
||||||
if (k->kid[0] == kid[0] && k->kid[1] == kid[1])
|
if (k->kid[0] == kid[0] && k->kid[1] == kid[1])
|
||||||
{
|
{
|
||||||
/*k->off = off;*/
|
/*k->off = off;*/
|
||||||
return;
|
return;
|
||||||
@ -189,7 +189,7 @@ update_offset_hash_table_from_kb (OffsetHashTable tbl, KBNODE node, off_t off)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Register a filename for plain keyring files. ptr is set to a
|
* Register a filename for plain keyring files. ptr is set to a
|
||||||
* pointer to be used to create a handles etc, or the already-issued
|
* pointer to be used to create a handles etc, or the already-issued
|
||||||
* pointer if it has already been registered. The function returns 1
|
* pointer if it has already been registered. The function returns 1
|
||||||
@ -241,12 +241,12 @@ keyring_is_writable (void *token)
|
|||||||
|
|
||||||
return r? !access (r->fname, W_OK) : 0;
|
return r? !access (r->fname, W_OK) : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Create a new handle for the resource associated with TOKEN. SECRET
|
/* Create a new handle for the resource associated with TOKEN. SECRET
|
||||||
is just just as a cross-check.
|
is just just as a cross-check.
|
||||||
|
|
||||||
The returned handle must be released using keyring_release (). */
|
The returned handle must be released using keyring_release (). */
|
||||||
KEYRING_HANDLE
|
KEYRING_HANDLE
|
||||||
keyring_new (void *token, int secret)
|
keyring_new (void *token, int secret)
|
||||||
@ -255,7 +255,7 @@ keyring_new (void *token, int secret)
|
|||||||
KR_NAME resource = token;
|
KR_NAME resource = token;
|
||||||
|
|
||||||
assert (resource && !resource->secret == !secret);
|
assert (resource && !resource->secret == !secret);
|
||||||
|
|
||||||
hd = xmalloc_clear (sizeof *hd);
|
hd = xmalloc_clear (sizeof *hd);
|
||||||
hd->resource = resource;
|
hd->resource = resource;
|
||||||
hd->secret = !!secret;
|
hd->secret = !!secret;
|
||||||
@ -263,7 +263,7 @@ keyring_new (void *token, int secret)
|
|||||||
return hd;
|
return hd;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
keyring_release (KEYRING_HANDLE hd)
|
keyring_release (KEYRING_HANDLE hd)
|
||||||
{
|
{
|
||||||
if (!hd)
|
if (!hd)
|
||||||
@ -290,7 +290,7 @@ keyring_get_resource_name (KEYRING_HANDLE hd)
|
|||||||
* Lock the keyring with the given handle, or unlok if yes is false.
|
* Lock the keyring with the given handle, or unlok if yes is false.
|
||||||
* We ignore the handle and lock all registered files.
|
* We ignore the handle and lock all registered files.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
keyring_lock (KEYRING_HANDLE hd, int yes)
|
keyring_lock (KEYRING_HANDLE hd, int yes)
|
||||||
{
|
{
|
||||||
KR_NAME kr;
|
KR_NAME kr;
|
||||||
@ -302,7 +302,7 @@ keyring_lock (KEYRING_HANDLE hd, int yes)
|
|||||||
if (!keyring_is_writable(kr))
|
if (!keyring_is_writable(kr))
|
||||||
continue;
|
continue;
|
||||||
if (!kr->lockhd) {
|
if (!kr->lockhd) {
|
||||||
kr->lockhd = create_dotlock( kr->fname );
|
kr->lockhd = dotlock_create (kr->fname, 0);
|
||||||
if (!kr->lockhd) {
|
if (!kr->lockhd) {
|
||||||
log_info ("can't allocate lock for `%s'\n", kr->fname );
|
log_info ("can't allocate lock for `%s'\n", kr->fname );
|
||||||
rc = G10ERR_GENERAL;
|
rc = G10ERR_GENERAL;
|
||||||
@ -311,18 +311,18 @@ keyring_lock (KEYRING_HANDLE hd, int yes)
|
|||||||
}
|
}
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
/* and now set the locks */
|
/* and now set the locks */
|
||||||
for (kr=kr_names; kr; kr = kr->next) {
|
for (kr=kr_names; kr; kr = kr->next) {
|
||||||
if (!keyring_is_writable(kr))
|
if (!keyring_is_writable(kr))
|
||||||
continue;
|
continue;
|
||||||
if (kr->is_locked)
|
if (kr->is_locked)
|
||||||
;
|
;
|
||||||
else if (make_dotlock (kr->lockhd, -1) ) {
|
else if (dotlock_take (kr->lockhd, -1) ) {
|
||||||
log_info ("can't lock `%s'\n", kr->fname );
|
log_info ("can't lock `%s'\n", kr->fname );
|
||||||
rc = G10ERR_GENERAL;
|
rc = G10ERR_GENERAL;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
kr->is_locked = 1;
|
kr->is_locked = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -333,12 +333,12 @@ keyring_lock (KEYRING_HANDLE hd, int yes)
|
|||||||
continue;
|
continue;
|
||||||
if (!kr->is_locked)
|
if (!kr->is_locked)
|
||||||
;
|
;
|
||||||
else if (release_dotlock (kr->lockhd))
|
else if (dotlock_release (kr->lockhd))
|
||||||
log_info ("can't unlock `%s'\n", kr->fname );
|
log_info ("can't unlock `%s'\n", kr->fname );
|
||||||
else
|
else
|
||||||
kr->is_locked = 0;
|
kr->is_locked = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@ -348,7 +348,7 @@ keyring_lock (KEYRING_HANDLE hd, int yes)
|
|||||||
/*
|
/*
|
||||||
* Return the last found keyring. Caller must free it.
|
* Return the last found keyring. Caller must free it.
|
||||||
* The returned keyblock has the kbode flag bit 0 set for the node with
|
* The returned keyblock has the kbode flag bit 0 set for the node with
|
||||||
* the public key used to locate the keyblock or flag bit 1 set for
|
* the public key used to locate the keyblock or flag bit 1 set for
|
||||||
* the user ID node.
|
* the user ID node.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
@ -394,7 +394,7 @@ keyring_get_keyblock (KEYRING_HANDLE hd, KBNODE *ret_kb)
|
|||||||
init_packet (pkt);
|
init_packet (pkt);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (rc) {
|
if (rc) {
|
||||||
log_error ("keyring_get_keyblock: read error: %s\n",
|
log_error ("keyring_get_keyblock: read error: %s\n",
|
||||||
g10_errstr(rc) );
|
g10_errstr(rc) );
|
||||||
rc = G10ERR_INV_KEYRING;
|
rc = G10ERR_INV_KEYRING;
|
||||||
@ -416,14 +416,14 @@ keyring_get_keyblock (KEYRING_HANDLE hd, KBNODE *ret_kb)
|
|||||||
in_cert = 1;
|
in_cert = 1;
|
||||||
if (pkt->pkttype == PKT_RING_TRUST) {
|
if (pkt->pkttype == PKT_RING_TRUST) {
|
||||||
/*(this code is duplicated after the loop)*/
|
/*(this code is duplicated after the loop)*/
|
||||||
if ( lastnode
|
if ( lastnode
|
||||||
&& lastnode->pkt->pkttype == PKT_SIGNATURE
|
&& lastnode->pkt->pkttype == PKT_SIGNATURE
|
||||||
&& (pkt->pkt.ring_trust->sigcache & 1) ) {
|
&& (pkt->pkt.ring_trust->sigcache & 1) ) {
|
||||||
/* This is a ring trust packet with a checked signature
|
/* This is a ring trust packet with a checked signature
|
||||||
* status cache following directly a signature paket.
|
* status cache following directly a signature paket.
|
||||||
* Set the cache status into that signature packet. */
|
* Set the cache status into that signature packet. */
|
||||||
PKT_signature *sig = lastnode->pkt->pkt.signature;
|
PKT_signature *sig = lastnode->pkt->pkt.signature;
|
||||||
|
|
||||||
sig->flags.checked = 1;
|
sig->flags.checked = 1;
|
||||||
sig->flags.valid = !!(pkt->pkt.ring_trust->sigcache & 2);
|
sig->flags.valid = !!(pkt->pkt.ring_trust->sigcache & 2);
|
||||||
}
|
}
|
||||||
@ -441,27 +441,27 @@ keyring_get_keyblock (KEYRING_HANDLE hd, KBNODE *ret_kb)
|
|||||||
keyblock = node;
|
keyblock = node;
|
||||||
else
|
else
|
||||||
add_kbnode (keyblock, node);
|
add_kbnode (keyblock, node);
|
||||||
|
|
||||||
if ( pkt->pkttype == PKT_PUBLIC_KEY
|
if ( pkt->pkttype == PKT_PUBLIC_KEY
|
||||||
|| pkt->pkttype == PKT_PUBLIC_SUBKEY
|
|| pkt->pkttype == PKT_PUBLIC_SUBKEY
|
||||||
|| pkt->pkttype == PKT_SECRET_KEY
|
|| pkt->pkttype == PKT_SECRET_KEY
|
||||||
|| pkt->pkttype == PKT_SECRET_SUBKEY)
|
|| pkt->pkttype == PKT_SECRET_SUBKEY)
|
||||||
{
|
{
|
||||||
if (++pk_no == hd->found.pk_no)
|
if (++pk_no == hd->found.pk_no)
|
||||||
node->flag |= 1;
|
node->flag |= 1;
|
||||||
}
|
}
|
||||||
else if ( pkt->pkttype == PKT_USER_ID)
|
else if ( pkt->pkttype == PKT_USER_ID)
|
||||||
{
|
{
|
||||||
if (++uid_no == hd->found.uid_no)
|
if (++uid_no == hd->found.uid_no)
|
||||||
node->flag |= 2;
|
node->flag |= 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
pkt = xmalloc (sizeof *pkt);
|
pkt = xmalloc (sizeof *pkt);
|
||||||
init_packet(pkt);
|
init_packet(pkt);
|
||||||
}
|
}
|
||||||
set_packet_list_mode(save_mode);
|
set_packet_list_mode(save_mode);
|
||||||
|
|
||||||
if (rc == -1 && keyblock)
|
if (rc == -1 && keyblock)
|
||||||
rc = 0; /* got the entire keyblock */
|
rc = 0; /* got the entire keyblock */
|
||||||
|
|
||||||
if (rc || !ret_kb)
|
if (rc || !ret_kb)
|
||||||
@ -469,7 +469,7 @@ keyring_get_keyblock (KEYRING_HANDLE hd, KBNODE *ret_kb)
|
|||||||
else {
|
else {
|
||||||
/*(duplicated form the loop body)*/
|
/*(duplicated form the loop body)*/
|
||||||
if ( pkt && pkt->pkttype == PKT_RING_TRUST
|
if ( pkt && pkt->pkttype == PKT_RING_TRUST
|
||||||
&& lastnode
|
&& lastnode
|
||||||
&& lastnode->pkt->pkttype == PKT_SIGNATURE
|
&& lastnode->pkt->pkttype == PKT_SIGNATURE
|
||||||
&& (pkt->pkt.ring_trust->sigcache & 1) ) {
|
&& (pkt->pkt.ring_trust->sigcache & 1) ) {
|
||||||
PKT_signature *sig = lastnode->pkt->pkt.signature;
|
PKT_signature *sig = lastnode->pkt->pkt.signature;
|
||||||
@ -483,7 +483,7 @@ keyring_get_keyblock (KEYRING_HANDLE hd, KBNODE *ret_kb)
|
|||||||
iobuf_close(a);
|
iobuf_close(a);
|
||||||
|
|
||||||
/* Make sure that future search operations fail immediately when
|
/* Make sure that future search operations fail immediately when
|
||||||
* we know that we are working on a invalid keyring
|
* we know that we are working on a invalid keyring
|
||||||
*/
|
*/
|
||||||
if (rc == G10ERR_INV_KEYRING)
|
if (rc == G10ERR_INV_KEYRING)
|
||||||
hd->current.error = rc;
|
hd->current.error = rc;
|
||||||
@ -543,11 +543,11 @@ keyring_insert_keyblock (KEYRING_HANDLE hd, KBNODE kb)
|
|||||||
fname = hd->found.kr->fname;
|
fname = hd->found.kr->fname;
|
||||||
else if (hd->current.kr)
|
else if (hd->current.kr)
|
||||||
fname = hd->current.kr->fname;
|
fname = hd->current.kr->fname;
|
||||||
else
|
else
|
||||||
fname = hd->resource? hd->resource->fname:NULL;
|
fname = hd->resource? hd->resource->fname:NULL;
|
||||||
|
|
||||||
if (!fname)
|
if (!fname)
|
||||||
return G10ERR_GENERAL;
|
return G10ERR_GENERAL;
|
||||||
|
|
||||||
/* close this one otherwise we will lose the position for
|
/* close this one otherwise we will lose the position for
|
||||||
* a next search. Fixme: it would be better to adjust the position
|
* a next search. Fixme: it would be better to adjust the position
|
||||||
@ -562,7 +562,7 @@ keyring_insert_keyblock (KEYRING_HANDLE hd, KBNODE kb)
|
|||||||
{
|
{
|
||||||
update_offset_hash_table_from_kb (kr_offtbl, kb, 0);
|
update_offset_hash_table_from_kb (kr_offtbl, kb, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -608,10 +608,10 @@ keyring_delete_keyblock (KEYRING_HANDLE hd)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Start the next search on this handle right at the beginning
|
* Start the next search on this handle right at the beginning
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
keyring_search_reset (KEYRING_HANDLE hd)
|
keyring_search_reset (KEYRING_HANDLE hd)
|
||||||
{
|
{
|
||||||
assert (hd);
|
assert (hd);
|
||||||
@ -621,17 +621,17 @@ keyring_search_reset (KEYRING_HANDLE hd)
|
|||||||
hd->current.iobuf = NULL;
|
hd->current.iobuf = NULL;
|
||||||
hd->current.eof = 0;
|
hd->current.eof = 0;
|
||||||
hd->current.error = 0;
|
hd->current.error = 0;
|
||||||
|
|
||||||
hd->found.kr = NULL;
|
hd->found.kr = NULL;
|
||||||
hd->found.offset = 0;
|
hd->found.offset = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
prepare_search (KEYRING_HANDLE hd)
|
prepare_search (KEYRING_HANDLE hd)
|
||||||
{
|
{
|
||||||
if (hd->current.error)
|
if (hd->current.error)
|
||||||
return hd->current.error; /* still in error state */
|
return hd->current.error; /* still in error state */
|
||||||
|
|
||||||
if (hd->current.kr && !hd->current.eof) {
|
if (hd->current.kr && !hd->current.eof) {
|
||||||
@ -640,7 +640,7 @@ prepare_search (KEYRING_HANDLE hd)
|
|||||||
return 0; /* okay */
|
return 0; /* okay */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!hd->current.kr && hd->current.eof)
|
if (!hd->current.kr && hd->current.eof)
|
||||||
return -1; /* still EOF */
|
return -1; /* still EOF */
|
||||||
|
|
||||||
if (!hd->current.kr) { /* start search with first keyring */
|
if (!hd->current.kr) { /* start search with first keyring */
|
||||||
@ -652,7 +652,7 @@ prepare_search (KEYRING_HANDLE hd)
|
|||||||
assert (!hd->current.iobuf);
|
assert (!hd->current.iobuf);
|
||||||
}
|
}
|
||||||
else { /* EOF */
|
else { /* EOF */
|
||||||
iobuf_close (hd->current.iobuf);
|
iobuf_close (hd->current.iobuf);
|
||||||
hd->current.iobuf = NULL;
|
hd->current.iobuf = NULL;
|
||||||
hd->current.kr = NULL;
|
hd->current.kr = NULL;
|
||||||
hd->current.eof = 1;
|
hd->current.eof = 1;
|
||||||
@ -809,7 +809,7 @@ compare_name (int mode, const char *name, const char *uid, size_t uidlen)
|
|||||||
int i;
|
int i;
|
||||||
const char *s, *se;
|
const char *s, *se;
|
||||||
|
|
||||||
if (mode == KEYDB_SEARCH_MODE_EXACT) {
|
if (mode == KEYDB_SEARCH_MODE_EXACT) {
|
||||||
for (i=0; name[i] && uidlen; i++, uidlen--)
|
for (i=0; name[i] && uidlen; i++, uidlen--)
|
||||||
if (uid[i] != name[i])
|
if (uid[i] != name[i])
|
||||||
break;
|
break;
|
||||||
@ -820,7 +820,7 @@ compare_name (int mode, const char *name, const char *uid, size_t uidlen)
|
|||||||
if (ascii_memistr( uid, uidlen, name ))
|
if (ascii_memistr( uid, uidlen, name ))
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else if ( mode == KEYDB_SEARCH_MODE_MAIL
|
else if ( mode == KEYDB_SEARCH_MODE_MAIL
|
||||||
|| mode == KEYDB_SEARCH_MODE_MAILSUB
|
|| mode == KEYDB_SEARCH_MODE_MAILSUB
|
||||||
|| mode == KEYDB_SEARCH_MODE_MAILEND) {
|
|| mode == KEYDB_SEARCH_MODE_MAILEND) {
|
||||||
for (i=0, s= uid; i < uidlen && *s != '<'; s++, i++)
|
for (i=0, s= uid; i < uidlen && *s != '<'; s++, i++)
|
||||||
@ -832,7 +832,7 @@ compare_name (int mode, const char *name, const char *uid, size_t uidlen)
|
|||||||
;
|
;
|
||||||
if (i < uidlen) {
|
if (i < uidlen) {
|
||||||
i = se - s;
|
i = se - s;
|
||||||
if (mode == KEYDB_SEARCH_MODE_MAIL) {
|
if (mode == KEYDB_SEARCH_MODE_MAIL) {
|
||||||
if( strlen(name)-2 == i
|
if( strlen(name)-2 == i
|
||||||
&& !ascii_memcasecmp( s, name+1, i) )
|
&& !ascii_memcasecmp( s, name+1, i) )
|
||||||
return 0;
|
return 0;
|
||||||
@ -856,11 +856,11 @@ compare_name (int mode, const char *name, const char *uid, size_t uidlen)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Search through the keyring(s), starting at the current position,
|
* Search through the keyring(s), starting at the current position,
|
||||||
* for a keyblock which contains one of the keys described in the DESC array.
|
* for a keyblock which contains one of the keys described in the DESC array.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
keyring_search (KEYRING_HANDLE hd, KEYDB_SEARCH_DESC *desc,
|
keyring_search (KEYRING_HANDLE hd, KEYDB_SEARCH_DESC *desc,
|
||||||
size_t ndesc, size_t *descindex)
|
size_t ndesc, size_t *descindex)
|
||||||
{
|
{
|
||||||
@ -880,28 +880,28 @@ keyring_search (KEYRING_HANDLE hd, KEYDB_SEARCH_DESC *desc,
|
|||||||
|
|
||||||
/* figure out what information we need */
|
/* figure out what information we need */
|
||||||
need_uid = need_words = need_keyid = need_fpr = any_skip = 0;
|
need_uid = need_words = need_keyid = need_fpr = any_skip = 0;
|
||||||
for (n=0; n < ndesc; n++)
|
for (n=0; n < ndesc; n++)
|
||||||
{
|
{
|
||||||
switch (desc[n].mode)
|
switch (desc[n].mode)
|
||||||
{
|
{
|
||||||
case KEYDB_SEARCH_MODE_EXACT:
|
case KEYDB_SEARCH_MODE_EXACT:
|
||||||
case KEYDB_SEARCH_MODE_SUBSTR:
|
case KEYDB_SEARCH_MODE_SUBSTR:
|
||||||
case KEYDB_SEARCH_MODE_MAIL:
|
case KEYDB_SEARCH_MODE_MAIL:
|
||||||
case KEYDB_SEARCH_MODE_MAILSUB:
|
case KEYDB_SEARCH_MODE_MAILSUB:
|
||||||
case KEYDB_SEARCH_MODE_MAILEND:
|
case KEYDB_SEARCH_MODE_MAILEND:
|
||||||
need_uid = 1;
|
need_uid = 1;
|
||||||
break;
|
break;
|
||||||
case KEYDB_SEARCH_MODE_WORDS:
|
case KEYDB_SEARCH_MODE_WORDS:
|
||||||
need_uid = 1;
|
need_uid = 1;
|
||||||
need_words = 1;
|
need_words = 1;
|
||||||
break;
|
break;
|
||||||
case KEYDB_SEARCH_MODE_SHORT_KID:
|
case KEYDB_SEARCH_MODE_SHORT_KID:
|
||||||
case KEYDB_SEARCH_MODE_LONG_KID:
|
case KEYDB_SEARCH_MODE_LONG_KID:
|
||||||
need_keyid = 1;
|
need_keyid = 1;
|
||||||
break;
|
break;
|
||||||
case KEYDB_SEARCH_MODE_FPR16:
|
case KEYDB_SEARCH_MODE_FPR16:
|
||||||
case KEYDB_SEARCH_MODE_FPR20:
|
case KEYDB_SEARCH_MODE_FPR20:
|
||||||
case KEYDB_SEARCH_MODE_FPR:
|
case KEYDB_SEARCH_MODE_FPR:
|
||||||
need_fpr = 1;
|
need_fpr = 1;
|
||||||
break;
|
break;
|
||||||
case KEYDB_SEARCH_MODE_FIRST:
|
case KEYDB_SEARCH_MODE_FIRST:
|
||||||
@ -910,7 +910,7 @@ keyring_search (KEYRING_HANDLE hd, KEYDB_SEARCH_DESC *desc,
|
|||||||
break;
|
break;
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
if (desc[n].skipfnc)
|
if (desc[n].skipfnc)
|
||||||
{
|
{
|
||||||
any_skip = 1;
|
any_skip = 1;
|
||||||
need_keyid = 1;
|
need_keyid = 1;
|
||||||
@ -929,7 +929,7 @@ keyring_search (KEYRING_HANDLE hd, KEYDB_SEARCH_DESC *desc,
|
|||||||
else if (ndesc == 1 && desc[0].mode == KEYDB_SEARCH_MODE_LONG_KID)
|
else if (ndesc == 1 && desc[0].mode == KEYDB_SEARCH_MODE_LONG_KID)
|
||||||
{
|
{
|
||||||
struct off_item *oi;
|
struct off_item *oi;
|
||||||
|
|
||||||
oi = lookup_offset_hash_table (kr_offtbl, desc[0].u.kid);
|
oi = lookup_offset_hash_table (kr_offtbl, desc[0].u.kid);
|
||||||
if (!oi)
|
if (!oi)
|
||||||
{ /* We know that we don't have this key */
|
{ /* We know that we don't have this key */
|
||||||
@ -938,9 +938,9 @@ keyring_search (KEYRING_HANDLE hd, KEYDB_SEARCH_DESC *desc,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
/* We could now create a positive search status and return.
|
/* We could now create a positive search status and return.
|
||||||
* However the problem is that another instance of gpg may
|
* However the problem is that another instance of gpg may
|
||||||
* have changed the keyring so that the offsets are not valid
|
* have changed the keyring so that the offsets are not valid
|
||||||
* anymore - therefore we don't do it
|
* anymore - therefore we don't do it
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -951,13 +951,13 @@ keyring_search (KEYRING_HANDLE hd, KEYDB_SEARCH_DESC *desc,
|
|||||||
log_debug ("word search mode does not yet work\n");
|
log_debug ("word search mode does not yet work\n");
|
||||||
/* FIXME: here is a long standing bug in our function and in addition we
|
/* FIXME: here is a long standing bug in our function and in addition we
|
||||||
just use the first search description */
|
just use the first search description */
|
||||||
for (n=0; n < ndesc && !name; n++)
|
for (n=0; n < ndesc && !name; n++)
|
||||||
{
|
{
|
||||||
if (desc[n].mode == KEYDB_SEARCH_MODE_WORDS)
|
if (desc[n].mode == KEYDB_SEARCH_MODE_WORDS)
|
||||||
name = desc[n].u.name;
|
name = desc[n].u.name;
|
||||||
}
|
}
|
||||||
assert (name);
|
assert (name);
|
||||||
if ( !hd->word_match.name || strcmp (hd->word_match.name, name) )
|
if ( !hd->word_match.name || strcmp (hd->word_match.name, name) )
|
||||||
{
|
{
|
||||||
/* name changed */
|
/* name changed */
|
||||||
xfree (hd->word_match.name);
|
xfree (hd->word_match.name);
|
||||||
@ -975,23 +975,23 @@ keyring_search (KEYRING_HANDLE hd, KEYDB_SEARCH_DESC *desc,
|
|||||||
main_offset = 0;
|
main_offset = 0;
|
||||||
pk_no = uid_no = 0;
|
pk_no = uid_no = 0;
|
||||||
initial_skip = 1; /* skip until we see the start of a keyblock */
|
initial_skip = 1; /* skip until we see the start of a keyblock */
|
||||||
while (!(rc=search_packet (hd->current.iobuf, &pkt, &offset, need_uid)))
|
while (!(rc=search_packet (hd->current.iobuf, &pkt, &offset, need_uid)))
|
||||||
{
|
{
|
||||||
byte afp[MAX_FINGERPRINT_LEN];
|
byte afp[MAX_FINGERPRINT_LEN];
|
||||||
size_t an;
|
size_t an;
|
||||||
|
|
||||||
if (pkt.pkttype == PKT_PUBLIC_KEY || pkt.pkttype == PKT_SECRET_KEY)
|
if (pkt.pkttype == PKT_PUBLIC_KEY || pkt.pkttype == PKT_SECRET_KEY)
|
||||||
{
|
{
|
||||||
main_offset = offset;
|
main_offset = offset;
|
||||||
pk_no = uid_no = 0;
|
pk_no = uid_no = 0;
|
||||||
initial_skip = 0;
|
initial_skip = 0;
|
||||||
}
|
}
|
||||||
if (initial_skip)
|
if (initial_skip)
|
||||||
{
|
{
|
||||||
free_packet (&pkt);
|
free_packet (&pkt);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
pk = NULL;
|
pk = NULL;
|
||||||
sk = NULL;
|
sk = NULL;
|
||||||
uid = NULL;
|
uid = NULL;
|
||||||
@ -1012,13 +1012,13 @@ keyring_search (KEYRING_HANDLE hd, KEYDB_SEARCH_DESC *desc,
|
|||||||
if (use_offtbl && !kr_offtbl_ready)
|
if (use_offtbl && !kr_offtbl_ready)
|
||||||
update_offset_hash_table (kr_offtbl, aki, main_offset);
|
update_offset_hash_table (kr_offtbl, aki, main_offset);
|
||||||
}
|
}
|
||||||
else if (pkt.pkttype == PKT_USER_ID)
|
else if (pkt.pkttype == PKT_USER_ID)
|
||||||
{
|
{
|
||||||
uid = pkt.pkt.user_id;
|
uid = pkt.pkt.user_id;
|
||||||
++uid_no;
|
++uid_no;
|
||||||
}
|
}
|
||||||
else if ( pkt.pkttype == PKT_SECRET_KEY
|
else if ( pkt.pkttype == PKT_SECRET_KEY
|
||||||
|| pkt.pkttype == PKT_SECRET_SUBKEY)
|
|| pkt.pkttype == PKT_SECRET_SUBKEY)
|
||||||
{
|
{
|
||||||
sk = pkt.pkt.secret_key;
|
sk = pkt.pkt.secret_key;
|
||||||
++pk_no;
|
++pk_no;
|
||||||
@ -1030,28 +1030,28 @@ keyring_search (KEYRING_HANDLE hd, KEYDB_SEARCH_DESC *desc,
|
|||||||
}
|
}
|
||||||
if (need_keyid)
|
if (need_keyid)
|
||||||
keyid_from_sk (sk, aki);
|
keyid_from_sk (sk, aki);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (n=0; n < ndesc; n++)
|
for (n=0; n < ndesc; n++)
|
||||||
{
|
{
|
||||||
switch (desc[n].mode) {
|
switch (desc[n].mode) {
|
||||||
case KEYDB_SEARCH_MODE_NONE:
|
case KEYDB_SEARCH_MODE_NONE:
|
||||||
BUG ();
|
BUG ();
|
||||||
break;
|
break;
|
||||||
case KEYDB_SEARCH_MODE_EXACT:
|
case KEYDB_SEARCH_MODE_EXACT:
|
||||||
case KEYDB_SEARCH_MODE_SUBSTR:
|
case KEYDB_SEARCH_MODE_SUBSTR:
|
||||||
case KEYDB_SEARCH_MODE_MAIL:
|
case KEYDB_SEARCH_MODE_MAIL:
|
||||||
case KEYDB_SEARCH_MODE_MAILSUB:
|
case KEYDB_SEARCH_MODE_MAILSUB:
|
||||||
case KEYDB_SEARCH_MODE_MAILEND:
|
case KEYDB_SEARCH_MODE_MAILEND:
|
||||||
case KEYDB_SEARCH_MODE_WORDS:
|
case KEYDB_SEARCH_MODE_WORDS:
|
||||||
if ( uid && !compare_name (desc[n].mode,
|
if ( uid && !compare_name (desc[n].mode,
|
||||||
desc[n].u.name,
|
desc[n].u.name,
|
||||||
uid->name, uid->len))
|
uid->name, uid->len))
|
||||||
goto found;
|
goto found;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case KEYDB_SEARCH_MODE_SHORT_KID:
|
case KEYDB_SEARCH_MODE_SHORT_KID:
|
||||||
if ((pk||sk) && desc[n].u.kid[1] == aki[1])
|
if ((pk||sk) && desc[n].u.kid[1] == aki[1])
|
||||||
goto found;
|
goto found;
|
||||||
break;
|
break;
|
||||||
@ -1065,19 +1065,19 @@ keyring_search (KEYRING_HANDLE hd, KEYDB_SEARCH_DESC *desc,
|
|||||||
goto found;
|
goto found;
|
||||||
break;
|
break;
|
||||||
case KEYDB_SEARCH_MODE_FPR20:
|
case KEYDB_SEARCH_MODE_FPR20:
|
||||||
case KEYDB_SEARCH_MODE_FPR:
|
case KEYDB_SEARCH_MODE_FPR:
|
||||||
if ((pk||sk) && !memcmp (desc[n].u.fpr, afp, 20))
|
if ((pk||sk) && !memcmp (desc[n].u.fpr, afp, 20))
|
||||||
goto found;
|
goto found;
|
||||||
break;
|
break;
|
||||||
case KEYDB_SEARCH_MODE_FIRST:
|
case KEYDB_SEARCH_MODE_FIRST:
|
||||||
if (pk||sk)
|
if (pk||sk)
|
||||||
goto found;
|
goto found;
|
||||||
break;
|
break;
|
||||||
case KEYDB_SEARCH_MODE_NEXT:
|
case KEYDB_SEARCH_MODE_NEXT:
|
||||||
if (pk||sk)
|
if (pk||sk)
|
||||||
goto found;
|
goto found;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
rc = G10ERR_INV_ARG;
|
rc = G10ERR_INV_ARG;
|
||||||
goto found;
|
goto found;
|
||||||
}
|
}
|
||||||
@ -1089,7 +1089,7 @@ keyring_search (KEYRING_HANDLE hd, KEYDB_SEARCH_DESC *desc,
|
|||||||
meaningful if this function returns with no errors. */
|
meaningful if this function returns with no errors. */
|
||||||
if(descindex)
|
if(descindex)
|
||||||
*descindex=n;
|
*descindex=n;
|
||||||
for (n=any_skip?0:ndesc; n < ndesc; n++)
|
for (n=any_skip?0:ndesc; n < ndesc; n++)
|
||||||
{
|
{
|
||||||
if (desc[n].skipfnc
|
if (desc[n].skipfnc
|
||||||
&& desc[n].skipfnc (desc[n].skipfncvalue, aki, uid))
|
&& desc[n].skipfnc (desc[n].skipfncvalue, aki, uid))
|
||||||
@ -1115,12 +1115,12 @@ keyring_search (KEYRING_HANDLE hd, KEYDB_SEARCH_DESC *desc,
|
|||||||
if (use_offtbl && !kr_offtbl_ready)
|
if (use_offtbl && !kr_offtbl_ready)
|
||||||
{
|
{
|
||||||
KR_NAME kr;
|
KR_NAME kr;
|
||||||
|
|
||||||
/* First set the did_full_scan flag for this keyring (ignore
|
/* First set the did_full_scan flag for this keyring (ignore
|
||||||
secret keyrings) */
|
secret keyrings) */
|
||||||
for (kr=kr_names; kr; kr = kr->next)
|
for (kr=kr_names; kr; kr = kr->next)
|
||||||
{
|
{
|
||||||
if (!kr->secret && hd->resource == kr)
|
if (!kr->secret && hd->resource == kr)
|
||||||
{
|
{
|
||||||
kr->did_full_scan = 1;
|
kr->did_full_scan = 1;
|
||||||
break;
|
break;
|
||||||
@ -1130,14 +1130,14 @@ keyring_search (KEYRING_HANDLE hd, KEYDB_SEARCH_DESC *desc,
|
|||||||
offtbl ready */
|
offtbl ready */
|
||||||
for (kr=kr_names; kr; kr = kr->next)
|
for (kr=kr_names; kr; kr = kr->next)
|
||||||
{
|
{
|
||||||
if (!kr->secret && !kr->did_full_scan)
|
if (!kr->secret && !kr->did_full_scan)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (!kr)
|
if (!kr)
|
||||||
kr_offtbl_ready = 1;
|
kr_offtbl_ready = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
hd->current.error = rc;
|
hd->current.error = rc;
|
||||||
|
|
||||||
free_packet(&pkt);
|
free_packet(&pkt);
|
||||||
@ -1149,7 +1149,7 @@ keyring_search (KEYRING_HANDLE hd, KEYDB_SEARCH_DESC *desc,
|
|||||||
static int
|
static int
|
||||||
create_tmp_file (const char *template,
|
create_tmp_file (const char *template,
|
||||||
char **r_bakfname, char **r_tmpfname, IOBUF *r_fp)
|
char **r_bakfname, char **r_tmpfname, IOBUF *r_fp)
|
||||||
{
|
{
|
||||||
char *bakfname, *tmpfname;
|
char *bakfname, *tmpfname;
|
||||||
mode_t oldmask;
|
mode_t oldmask;
|
||||||
|
|
||||||
@ -1173,7 +1173,7 @@ create_tmp_file (const char *template,
|
|||||||
strcpy (tmpfname,template);
|
strcpy (tmpfname,template);
|
||||||
strcpy (tmpfname+strlen(template)-4, EXTSEP_S "tmp");
|
strcpy (tmpfname+strlen(template)-4, EXTSEP_S "tmp");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ /* file does not end with gpg; hmmm */
|
{ /* file does not end with gpg; hmmm */
|
||||||
bakfname = xmalloc (strlen( template ) + 5);
|
bakfname = xmalloc (strlen( template ) + 5);
|
||||||
strcpy (stpcpy(bakfname, template), EXTSEP_S "bak");
|
strcpy (stpcpy(bakfname, template), EXTSEP_S "bak");
|
||||||
@ -1206,7 +1206,7 @@ create_tmp_file (const char *template,
|
|||||||
xfree (bakfname);
|
xfree (bakfname);
|
||||||
return G10ERR_OPEN_FILE;
|
return G10ERR_OPEN_FILE;
|
||||||
}
|
}
|
||||||
|
|
||||||
*r_bakfname = bakfname;
|
*r_bakfname = bakfname;
|
||||||
*r_tmpfname = tmpfname;
|
*r_tmpfname = tmpfname;
|
||||||
return 0;
|
return 0;
|
||||||
@ -1233,7 +1233,7 @@ rename_tmp_file (const char *bakfname, const char *tmpfname,
|
|||||||
|
|
||||||
/* first make a backup file except for secret keyrings */
|
/* first make a backup file except for secret keyrings */
|
||||||
if (!secret)
|
if (!secret)
|
||||||
{
|
{
|
||||||
#if defined(HAVE_DOSISH_SYSTEM) || defined(__riscos__)
|
#if defined(HAVE_DOSISH_SYSTEM) || defined(__riscos__)
|
||||||
remove (bakfname);
|
remove (bakfname);
|
||||||
#endif
|
#endif
|
||||||
@ -1244,7 +1244,7 @@ rename_tmp_file (const char *bakfname, const char *tmpfname,
|
|||||||
return G10ERR_RENAME_FILE;
|
return G10ERR_RENAME_FILE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* then rename the file */
|
/* then rename the file */
|
||||||
#if defined(HAVE_DOSISH_SYSTEM) || defined(__riscos__)
|
#if defined(HAVE_DOSISH_SYSTEM) || defined(__riscos__)
|
||||||
remove( fname );
|
remove( fname );
|
||||||
@ -1298,10 +1298,10 @@ write_keyblock (IOBUF fp, KBNODE keyblock)
|
|||||||
{
|
{
|
||||||
KBNODE kbctx = NULL, node;
|
KBNODE kbctx = NULL, node;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
while ( (node = walk_kbnode (keyblock, &kbctx, 0)) )
|
while ( (node = walk_kbnode (keyblock, &kbctx, 0)) )
|
||||||
{
|
{
|
||||||
if (node->pkt->pkttype == PKT_RING_TRUST)
|
if (node->pkt->pkttype == PKT_RING_TRUST)
|
||||||
continue; /* we write it later on our own */
|
continue; /* we write it later on our own */
|
||||||
|
|
||||||
if ( (rc = build_packet (fp, node->pkt) ))
|
if ( (rc = build_packet (fp, node->pkt) ))
|
||||||
@ -1310,12 +1310,12 @@ write_keyblock (IOBUF fp, KBNODE keyblock)
|
|||||||
node->pkt->pkttype, g10_errstr(rc) );
|
node->pkt->pkttype, g10_errstr(rc) );
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
if (node->pkt->pkttype == PKT_SIGNATURE)
|
if (node->pkt->pkttype == PKT_SIGNATURE)
|
||||||
{ /* always write a signature cache packet */
|
{ /* always write a signature cache packet */
|
||||||
PKT_signature *sig = node->pkt->pkt.signature;
|
PKT_signature *sig = node->pkt->pkt.signature;
|
||||||
unsigned int cacheval = 0;
|
unsigned int cacheval = 0;
|
||||||
|
|
||||||
if (sig->flags.checked)
|
if (sig->flags.checked)
|
||||||
{
|
{
|
||||||
cacheval |= 1;
|
cacheval |= 1;
|
||||||
if (sig->flags.valid)
|
if (sig->flags.valid)
|
||||||
@ -1333,7 +1333,7 @@ write_keyblock (IOBUF fp, KBNODE keyblock)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Walk over all public keyrings, check the signatures and replace the
|
* Walk over all public keyrings, check the signatures and replace the
|
||||||
* keyring with a new one where the signature cache is then updated.
|
* keyring with a new one where the signature cache is then updated.
|
||||||
* This is only done for the public keyrings.
|
* This is only done for the public keyrings.
|
||||||
@ -1378,7 +1378,7 @@ keyring_rebuild_cache (void *token,int noisy)
|
|||||||
* the original file is closed */
|
* the original file is closed */
|
||||||
tmpfp = NULL;
|
tmpfp = NULL;
|
||||||
}
|
}
|
||||||
rc = lastresname? rename_tmp_file (bakfilename, tmpfilename,
|
rc = lastresname? rename_tmp_file (bakfilename, tmpfilename,
|
||||||
lastresname, 0) : 0;
|
lastresname, 0) : 0;
|
||||||
xfree (tmpfilename); tmpfilename = NULL;
|
xfree (tmpfilename); tmpfilename = NULL;
|
||||||
xfree (bakfilename); bakfilename = NULL;
|
xfree (bakfilename); bakfilename = NULL;
|
||||||
@ -1391,10 +1391,10 @@ keyring_rebuild_cache (void *token,int noisy)
|
|||||||
if (rc)
|
if (rc)
|
||||||
goto leave;
|
goto leave;
|
||||||
}
|
}
|
||||||
|
|
||||||
release_kbnode (keyblock);
|
release_kbnode (keyblock);
|
||||||
rc = keyring_get_keyblock (hd, &keyblock);
|
rc = keyring_get_keyblock (hd, &keyblock);
|
||||||
if (rc)
|
if (rc)
|
||||||
{
|
{
|
||||||
log_error ("keyring_get_keyblock failed: %s\n", g10_errstr(rc));
|
log_error ("keyring_get_keyblock failed: %s\n", g10_errstr(rc));
|
||||||
goto leave;
|
goto leave;
|
||||||
@ -1438,7 +1438,7 @@ keyring_rebuild_cache (void *token,int noisy)
|
|||||||
sigcount++;
|
sigcount++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* write the keyblock to the temporary file */
|
/* write the keyblock to the temporary file */
|
||||||
rc = write_keyblock (tmpfp, keyblock);
|
rc = write_keyblock (tmpfp, keyblock);
|
||||||
if (rc)
|
if (rc)
|
||||||
@ -1448,10 +1448,10 @@ keyring_rebuild_cache (void *token,int noisy)
|
|||||||
log_info(_("%lu keys cached so far (%lu signatures)\n"),
|
log_info(_("%lu keys cached so far (%lu signatures)\n"),
|
||||||
count, sigcount );
|
count, sigcount );
|
||||||
|
|
||||||
} /* end main loop */
|
} /* end main loop */
|
||||||
if (rc == -1)
|
if (rc == -1)
|
||||||
rc = 0;
|
rc = 0;
|
||||||
if (rc)
|
if (rc)
|
||||||
{
|
{
|
||||||
log_error ("keyring_search failed: %s\n", g10_errstr(rc));
|
log_error ("keyring_search failed: %s\n", g10_errstr(rc));
|
||||||
goto leave;
|
goto leave;
|
||||||
@ -1479,8 +1479,8 @@ keyring_rebuild_cache (void *token,int noisy)
|
|||||||
leave:
|
leave:
|
||||||
if (tmpfp)
|
if (tmpfp)
|
||||||
iobuf_cancel (tmpfp);
|
iobuf_cancel (tmpfp);
|
||||||
xfree (tmpfilename);
|
xfree (tmpfilename);
|
||||||
xfree (bakfilename);
|
xfree (bakfilename);
|
||||||
release_kbnode (keyblock);
|
release_kbnode (keyblock);
|
||||||
keyring_lock (hd, 0);
|
keyring_lock (hd, 0);
|
||||||
keyring_release (hd);
|
keyring_release (hd);
|
||||||
@ -1503,13 +1503,13 @@ do_copy (int mode, const char *fname, KBNODE root, int secret,
|
|||||||
char *bakfname = NULL;
|
char *bakfname = NULL;
|
||||||
char *tmpfname = NULL;
|
char *tmpfname = NULL;
|
||||||
|
|
||||||
/* Open the source file. Because we do a rename, we have to check the
|
/* Open the source file. Because we do a rename, we have to check the
|
||||||
permissions of the file */
|
permissions of the file */
|
||||||
if (access (fname, W_OK))
|
if (access (fname, W_OK))
|
||||||
return G10ERR_WRITE_FILE;
|
return G10ERR_WRITE_FILE;
|
||||||
|
|
||||||
fp = iobuf_open (fname);
|
fp = iobuf_open (fname);
|
||||||
if (mode == 1 && !fp && errno == ENOENT) {
|
if (mode == 1 && !fp && errno == ENOENT) {
|
||||||
/* insert mode but file does not exist: create a new file */
|
/* insert mode but file does not exist: create a new file */
|
||||||
KBNODE kbctx, node;
|
KBNODE kbctx, node;
|
||||||
mode_t oldmask;
|
mode_t oldmask;
|
||||||
|
@ -66,7 +66,7 @@ init_one_signal (int sig, RETSIGTYPE (*handler)(int), int check_ign )
|
|||||||
sigemptyset (&nact.sa_mask);
|
sigemptyset (&nact.sa_mask);
|
||||||
nact.sa_flags = 0;
|
nact.sa_flags = 0;
|
||||||
sigaction ( sig, &nact, NULL);
|
sigaction ( sig, &nact, NULL);
|
||||||
#else
|
#else
|
||||||
RETSIGTYPE (*ohandler)(int);
|
RETSIGTYPE (*ohandler)(int);
|
||||||
|
|
||||||
ohandler = signal (sig, handler);
|
ohandler = signal (sig, handler);
|
||||||
@ -122,7 +122,7 @@ got_fatal_signal( int sig )
|
|||||||
|
|
||||||
/* Reset action to default action and raise signal again. */
|
/* Reset action to default action and raise signal again. */
|
||||||
init_one_signal (sig, SIG_DFL, 0);
|
init_one_signal (sig, SIG_DFL, 0);
|
||||||
remove_lockfiles ();
|
dotlock_remove_lockfiles ();
|
||||||
#ifdef __riscos__
|
#ifdef __riscos__
|
||||||
riscos_close_fds ();
|
riscos_close_fds ();
|
||||||
#endif /* __riscos__ */
|
#endif /* __riscos__ */
|
||||||
@ -165,7 +165,7 @@ pause_on_sigusr( int which )
|
|||||||
sigsuspend( &oldmask );
|
sigsuspend( &oldmask );
|
||||||
caught_sigusr1 = 0;
|
caught_sigusr1 = 0;
|
||||||
sigprocmask( SIG_UNBLOCK, &mask, NULL );
|
sigprocmask( SIG_UNBLOCK, &mask, NULL );
|
||||||
#else
|
#else
|
||||||
assert (which == 1);
|
assert (which == 1);
|
||||||
sighold (SIGUSR1);
|
sighold (SIGUSR1);
|
||||||
while (!caught_sigusr1)
|
while (!caught_sigusr1)
|
||||||
|
48
g10/tdbio.c
48
g10/tdbio.c
@ -86,7 +86,7 @@ struct cmp_xdir_struct {
|
|||||||
|
|
||||||
|
|
||||||
static char *db_name;
|
static char *db_name;
|
||||||
static DOTLOCK lockhandle;
|
static dotlock_t lockhandle;
|
||||||
static int is_locked;
|
static int is_locked;
|
||||||
static int db_fd = -1;
|
static int db_fd = -1;
|
||||||
static int in_transaction;
|
static int in_transaction;
|
||||||
@ -248,7 +248,7 @@ put_record_into_cache( ulong recno, const char *data )
|
|||||||
if( !n )
|
if( !n )
|
||||||
n = 1;
|
n = 1;
|
||||||
if( !is_locked ) {
|
if( !is_locked ) {
|
||||||
if( make_dotlock( lockhandle, -1 ) )
|
if (dotlock_take (lockhandle, -1))
|
||||||
log_fatal("can't acquire lock - giving up\n");
|
log_fatal("can't acquire lock - giving up\n");
|
||||||
else
|
else
|
||||||
is_locked = 1;
|
is_locked = 1;
|
||||||
@ -267,7 +267,7 @@ put_record_into_cache( ulong recno, const char *data )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( !opt.lock_once ) {
|
if( !opt.lock_once ) {
|
||||||
if( !release_dotlock( lockhandle ) )
|
if (!dotlock_release (lockhandle))
|
||||||
is_locked = 0;
|
is_locked = 0;
|
||||||
}
|
}
|
||||||
assert( unused );
|
assert( unused );
|
||||||
@ -309,7 +309,7 @@ tdbio_sync()
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if( !is_locked ) {
|
if( !is_locked ) {
|
||||||
if( make_dotlock( lockhandle, -1 ) )
|
if (dotlock_take (lockhandle, -1))
|
||||||
log_fatal("can't acquire lock - giving up\n");
|
log_fatal("can't acquire lock - giving up\n");
|
||||||
else
|
else
|
||||||
is_locked = 1;
|
is_locked = 1;
|
||||||
@ -324,7 +324,7 @@ tdbio_sync()
|
|||||||
}
|
}
|
||||||
cache_is_dirty = 0;
|
cache_is_dirty = 0;
|
||||||
if( did_lock && !opt.lock_once ) {
|
if( did_lock && !opt.lock_once ) {
|
||||||
if( !release_dotlock( lockhandle ) )
|
if (!dotlock_release (lockhandle))
|
||||||
is_locked = 0;
|
is_locked = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -364,7 +364,7 @@ tdbio_end_transaction()
|
|||||||
if( !in_transaction )
|
if( !in_transaction )
|
||||||
log_bug("tdbio: no active transaction\n");
|
log_bug("tdbio: no active transaction\n");
|
||||||
if( !is_locked ) {
|
if( !is_locked ) {
|
||||||
if( make_dotlock( lockhandle, -1 ) )
|
if (dotlock_take (lockhandle, -1))
|
||||||
log_fatal("can't acquire lock - giving up\n");
|
log_fatal("can't acquire lock - giving up\n");
|
||||||
else
|
else
|
||||||
is_locked = 1;
|
is_locked = 1;
|
||||||
@ -374,7 +374,7 @@ tdbio_end_transaction()
|
|||||||
rc = tdbio_sync();
|
rc = tdbio_sync();
|
||||||
unblock_all_signals();
|
unblock_all_signals();
|
||||||
if( !opt.lock_once ) {
|
if( !opt.lock_once ) {
|
||||||
if( !release_dotlock( lockhandle ) )
|
if (!dotlock_release (lockhandle))
|
||||||
is_locked = 0;
|
is_locked = 0;
|
||||||
}
|
}
|
||||||
return rc;
|
return rc;
|
||||||
@ -414,7 +414,7 @@ static void
|
|||||||
cleanup(void)
|
cleanup(void)
|
||||||
{
|
{
|
||||||
if( is_locked ) {
|
if( is_locked ) {
|
||||||
if( !release_dotlock(lockhandle) )
|
if (!dotlock_release (lockhandle))
|
||||||
is_locked = 0;
|
is_locked = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -447,7 +447,7 @@ create_version_record (void)
|
|||||||
{
|
{
|
||||||
TRUSTREC rec;
|
TRUSTREC rec;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
memset( &rec, 0, sizeof rec );
|
memset( &rec, 0, sizeof rec );
|
||||||
rec.r.ver.version = 3;
|
rec.r.ver.version = 3;
|
||||||
rec.r.ver.created = make_timestamp();
|
rec.r.ver.created = make_timestamp();
|
||||||
@ -517,10 +517,10 @@ tdbio_set_dbname( const char *new_dbname, int create )
|
|||||||
db_name = fname;
|
db_name = fname;
|
||||||
#ifdef __riscos__
|
#ifdef __riscos__
|
||||||
if( !lockhandle )
|
if( !lockhandle )
|
||||||
lockhandle = create_dotlock( db_name );
|
lockhandle = dotlock_create (db_name, 0);
|
||||||
if( !lockhandle )
|
if( !lockhandle )
|
||||||
log_fatal( _("can't create lock for `%s'\n"), db_name );
|
log_fatal( _("can't create lock for `%s'\n"), db_name );
|
||||||
if( make_dotlock( lockhandle, -1 ) )
|
if (dotlock_take (lockhandle, -1))
|
||||||
log_fatal( _("can't lock `%s'\n"), db_name );
|
log_fatal( _("can't lock `%s'\n"), db_name );
|
||||||
#endif /* __riscos__ */
|
#endif /* __riscos__ */
|
||||||
oldmask=umask(077);
|
oldmask=umask(077);
|
||||||
@ -540,7 +540,7 @@ tdbio_set_dbname( const char *new_dbname, int create )
|
|||||||
|
|
||||||
#ifndef __riscos__
|
#ifndef __riscos__
|
||||||
if( !lockhandle )
|
if( !lockhandle )
|
||||||
lockhandle = create_dotlock( db_name );
|
lockhandle = dotlock_create (db_name, 0);
|
||||||
if( !lockhandle )
|
if( !lockhandle )
|
||||||
log_fatal( _("can't create lock for `%s'\n"), db_name );
|
log_fatal( _("can't create lock for `%s'\n"), db_name );
|
||||||
#endif /* !__riscos__ */
|
#endif /* !__riscos__ */
|
||||||
@ -583,11 +583,11 @@ open_db()
|
|||||||
assert( db_fd == -1 );
|
assert( db_fd == -1 );
|
||||||
|
|
||||||
if (!lockhandle )
|
if (!lockhandle )
|
||||||
lockhandle = create_dotlock( db_name );
|
lockhandle = dotlock_create (db_name, 0);
|
||||||
if (!lockhandle )
|
if (!lockhandle )
|
||||||
log_fatal( _("can't create lock for `%s'\n"), db_name );
|
log_fatal( _("can't create lock for `%s'\n"), db_name );
|
||||||
#ifdef __riscos__
|
#ifdef __riscos__
|
||||||
if (make_dotlock( lockhandle, -1 ) )
|
if (dotlock_take (lockhandle, -1))
|
||||||
log_fatal( _("can't lock `%s'\n"), db_name );
|
log_fatal( _("can't lock `%s'\n"), db_name );
|
||||||
#endif /* __riscos__ */
|
#endif /* __riscos__ */
|
||||||
db_fd = open (db_name, O_RDWR | MY_O_BINARY );
|
db_fd = open (db_name, O_RDWR | MY_O_BINARY );
|
||||||
@ -613,7 +613,7 @@ open_db()
|
|||||||
{
|
{
|
||||||
migrate_from_v2 ();
|
migrate_from_v2 ();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* read the version record */
|
/* read the version record */
|
||||||
if (tdbio_read_record (0, &rec, RECTYPE_VER ) )
|
if (tdbio_read_record (0, &rec, RECTYPE_VER ) )
|
||||||
log_fatal( _("%s: invalid trustdb\n"), db_name );
|
log_fatal( _("%s: invalid trustdb\n"), db_name );
|
||||||
@ -690,7 +690,7 @@ tdbio_read_model(void)
|
|||||||
{
|
{
|
||||||
TRUSTREC vr;
|
TRUSTREC vr;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
rc = tdbio_read_record( 0, &vr, RECTYPE_VER );
|
rc = tdbio_read_record( 0, &vr, RECTYPE_VER );
|
||||||
if( rc )
|
if( rc )
|
||||||
log_fatal( _("%s: error reading version record: %s\n"),
|
log_fatal( _("%s: error reading version record: %s\n"),
|
||||||
@ -1008,7 +1008,7 @@ drop_from_hashtable( ulong table, byte *key, int keylen, ulong recnum )
|
|||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
lookup_hashtable( ulong table, const byte *key, size_t keylen,
|
lookup_hashtable( ulong table, const byte *key, size_t keylen,
|
||||||
int (*cmpfnc)(const void*, const TRUSTREC *),
|
int (*cmpfnc)(const void*, const TRUSTREC *),
|
||||||
const void *cmpdata, TRUSTREC *rec )
|
const void *cmpdata, TRUSTREC *rec )
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
@ -1534,12 +1534,12 @@ migrate_from_v2 ()
|
|||||||
/* We have some restrictions here. We can't use the version record
|
/* We have some restrictions here. We can't use the version record
|
||||||
* and we can't use any of the old hashtables because we dropped the
|
* and we can't use any of the old hashtables because we dropped the
|
||||||
* code. So we first collect all ownertrusts and then use a second
|
* code. So we first collect all ownertrusts and then use a second
|
||||||
* pass fo find the associated keys. We have to do this all without using
|
* pass fo find the associated keys. We have to do this all without using
|
||||||
* the regular record read functions.
|
* the regular record read functions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* get all the ownertrusts */
|
/* get all the ownertrusts */
|
||||||
if (lseek (db_fd, 0, SEEK_SET ) == -1 )
|
if (lseek (db_fd, 0, SEEK_SET ) == -1 )
|
||||||
log_fatal ("migrate_from_v2: lseek failed: %s\n", strerror (errno));
|
log_fatal ("migrate_from_v2: lseek failed: %s\n", strerror (errno));
|
||||||
for (recno=0;;recno++)
|
for (recno=0;;recno++)
|
||||||
{
|
{
|
||||||
@ -1553,7 +1553,7 @@ migrate_from_v2 ()
|
|||||||
|
|
||||||
if (*oldbuf != 2)
|
if (*oldbuf != 2)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* v2 dir record */
|
/* v2 dir record */
|
||||||
if (ottable_used == ottable_size)
|
if (ottable_used == ottable_size)
|
||||||
{
|
{
|
||||||
@ -1570,7 +1570,7 @@ migrate_from_v2 ()
|
|||||||
log_info ("found %d ownertrust records\n", ottable_used);
|
log_info ("found %d ownertrust records\n", ottable_used);
|
||||||
|
|
||||||
/* Read again and find the fingerprints */
|
/* Read again and find the fingerprints */
|
||||||
if (lseek (db_fd, 0, SEEK_SET ) == -1 )
|
if (lseek (db_fd, 0, SEEK_SET ) == -1 )
|
||||||
log_fatal ("migrate_from_v2: lseek failed: %s\n", strerror (errno));
|
log_fatal ("migrate_from_v2: lseek failed: %s\n", strerror (errno));
|
||||||
for (recno=0;;recno++)
|
for (recno=0;;recno++)
|
||||||
{
|
{
|
||||||
@ -1582,7 +1582,7 @@ migrate_from_v2 ()
|
|||||||
if (n != 40)
|
if (n != 40)
|
||||||
log_fatal ("migrate_from_v2: read error or short read\n");
|
log_fatal ("migrate_from_v2: read error or short read\n");
|
||||||
|
|
||||||
if (*oldbuf != 3)
|
if (*oldbuf != 3)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* v2 key record */
|
/* v2 key record */
|
||||||
@ -1603,7 +1603,7 @@ migrate_from_v2 ()
|
|||||||
if (create_version_record ())
|
if (create_version_record ())
|
||||||
log_fatal ("failed to recreate version record of `%s'\n", db_name);
|
log_fatal ("failed to recreate version record of `%s'\n", db_name);
|
||||||
|
|
||||||
/* access the hash table, so it is store just after the version record,
|
/* access the hash table, so it is store just after the version record,
|
||||||
* this is not needed put a dump is more pretty */
|
* this is not needed put a dump is more pretty */
|
||||||
get_trusthashrec ();
|
get_trusthashrec ();
|
||||||
|
|
||||||
@ -1613,7 +1613,7 @@ migrate_from_v2 ()
|
|||||||
{
|
{
|
||||||
if (!ottable[i].okay)
|
if (!ottable[i].okay)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
memset (&rec, 0, sizeof rec);
|
memset (&rec, 0, sizeof rec);
|
||||||
rec.recnum = tdbio_new_recnum ();
|
rec.recnum = tdbio_new_recnum ();
|
||||||
rec.rectype = RECTYPE_TRUST;
|
rec.rectype = RECTYPE_TRUST;
|
||||||
|
112
include/dotlock.h
Normal file
112
include/dotlock.h
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
/* dotlock.h - dotfile locking declarations
|
||||||
|
* Copyright (C) 2000, 2001, 2006, 2011 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* This file is part of JNLIB, which is a subsystem of GnuPG.
|
||||||
|
*
|
||||||
|
* JNLIB is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of either
|
||||||
|
*
|
||||||
|
* - the GNU Lesser General Public License as published by the Free
|
||||||
|
* Software Foundation; either version 3 of the License, or (at
|
||||||
|
* your option) any later version.
|
||||||
|
*
|
||||||
|
* or
|
||||||
|
*
|
||||||
|
* - the GNU General Public License as published by the Free
|
||||||
|
* Software Foundation; either version 2 of the License, or (at
|
||||||
|
* your option) any later version.
|
||||||
|
*
|
||||||
|
* or both in parallel, as here.
|
||||||
|
*
|
||||||
|
* JNLIB is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copies of the GNU General Public License
|
||||||
|
* and the GNU Lesser General Public License along with this program;
|
||||||
|
* if not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* ALTERNATIVELY, this file may be distributed under the terms of the
|
||||||
|
* following license, in which case the provisions of this license are
|
||||||
|
* required INSTEAD OF the GNU Lesser General License or the GNU
|
||||||
|
* General Public License. If you wish to allow use of your version of
|
||||||
|
* this file only under the terms of the GNU Lesser General License or
|
||||||
|
* the GNU General Public License, and not to allow others to use your
|
||||||
|
* version of this file under the terms of the following license,
|
||||||
|
* indicate your decision by deleting this paragraph and the license
|
||||||
|
* below.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, and the entire permission notice in its entirety,
|
||||||
|
* including the disclaimer of warranties.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote
|
||||||
|
* products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||||
|
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef LIBJNLIB_DOTLOCK_H
|
||||||
|
#define LIBJNLIB_DOTLOCK_H
|
||||||
|
|
||||||
|
/* See dotlock.c for a description. */
|
||||||
|
|
||||||
|
#ifdef DOTLOCK_EXT_SYM_PREFIX
|
||||||
|
# ifndef _DOTLOCK_PREFIX
|
||||||
|
# define _DOTLOCK_PREFIX1(x,y) x ## y
|
||||||
|
# define _DOTLOCK_PREFIX2(x,y) _DOTLOCK_PREFIX1(x,y)
|
||||||
|
# define _DOTLOCK_PREFIX(x) _DOTLOCK_PREFIX2(DOTLOCK_EXT_SYM_PREFIX,x)
|
||||||
|
# endif /*_DOTLOCK_PREFIX*/
|
||||||
|
# define dotlock_disable _DOTLOCK_PREFIX(dotlock_disable)
|
||||||
|
# define dotlock_create _DOTLOCK_PREFIX(dotlock_create)
|
||||||
|
# define dotlock_set_fd _DOTLOCK_PREFIX(dotlock_set_fd)
|
||||||
|
# define dotlock_get_fd _DOTLOCK_PREFIX(dotlock_get_fd)
|
||||||
|
# define dotlock_destroy _DOTLOCK_PREFIX(dotlock_destroy)
|
||||||
|
# define dotlock_take _DOTLOCK_PREFIX(dotlock_take)
|
||||||
|
# define dotlock_release _DOTLOCK_PREFIX(dotlock_release)
|
||||||
|
# define dotlock_remove_lockfiles _DOTLOCK_PREFIX(dotlock_remove_lockfiles)
|
||||||
|
#endif /*DOTLOCK_EXT_SYM_PREFIX*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
struct dotlock_handle;
|
||||||
|
typedef struct dotlock_handle *dotlock_t;
|
||||||
|
|
||||||
|
void dotlock_disable (void);
|
||||||
|
dotlock_t dotlock_create (const char *file_to_lock, unsigned int flags);
|
||||||
|
void dotlock_set_fd (dotlock_t h, int fd);
|
||||||
|
int dotlock_get_fd (dotlock_t h);
|
||||||
|
void dotlock_destroy (dotlock_t h);
|
||||||
|
int dotlock_take (dotlock_t h, long timeout);
|
||||||
|
int dotlock_release (dotlock_t h);
|
||||||
|
void dotlock_remove_lockfiles (void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /*LIBJNLIB_DOTLOCK_H*/
|
@ -124,15 +124,7 @@ const char *strusage( int level );
|
|||||||
|
|
||||||
|
|
||||||
/*-- dotlock.c --*/
|
/*-- dotlock.c --*/
|
||||||
struct dotlock_handle;
|
#include "../include/dotlock.h"
|
||||||
typedef struct dotlock_handle *DOTLOCK;
|
|
||||||
|
|
||||||
void disable_dotlock(void);
|
|
||||||
DOTLOCK create_dotlock( const char *file_to_lock );
|
|
||||||
void destroy_dotlock ( DOTLOCK h );
|
|
||||||
int make_dotlock( DOTLOCK h, long timeout );
|
|
||||||
int release_dotlock( DOTLOCK h );
|
|
||||||
void remove_lockfiles (void);
|
|
||||||
|
|
||||||
/*-- fileutil.c --*/
|
/*-- fileutil.c --*/
|
||||||
char * make_basename(const char *filepath, const char *inputpath);
|
char * make_basename(const char *filepath, const char *inputpath);
|
||||||
@ -217,10 +209,10 @@ int strncasecmp (const char *, const char *b, size_t n);
|
|||||||
/* The definition of the structure is private, we only need it here,
|
/* The definition of the structure is private, we only need it here,
|
||||||
so it can be allocated on the stack. */
|
so it can be allocated on the stack. */
|
||||||
struct private_membuf_s {
|
struct private_membuf_s {
|
||||||
size_t len;
|
size_t len;
|
||||||
size_t size;
|
size_t size;
|
||||||
char *buf;
|
char *buf;
|
||||||
int out_of_core;
|
int out_of_core;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct private_membuf_s membuf_t;
|
typedef struct private_membuf_s membuf_t;
|
||||||
|
1647
util/dotlock.c
1647
util/dotlock.c
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user