mirror of
git://git.gnupg.org/gnupg.git
synced 2025-04-17 15:44:34 +02:00
kbx: Unify blob reading functions.
* kbx/keybox-file.c (_keybox_read_blob): Remove. (_keybox_read_blob2): Rename to .... (_keybox_read_blob): this. Make arg options. Change all callers. * kbx/keybox-search.c (keybox_search): Factor fopen call out to ... (open_file): new. (keybox_seek): Als use open_file. Signed-off-by: Werner Koch <wk@gnupg.org>
This commit is contained in:
parent
5556eca5ac
commit
0039d7107b
@ -177,8 +177,7 @@ void _keybox_destroy_openpgp_info (keybox_openpgp_info_t info);
|
|||||||
|
|
||||||
|
|
||||||
/*-- keybox-file.c --*/
|
/*-- keybox-file.c --*/
|
||||||
int _keybox_read_blob (KEYBOXBLOB *r_blob, FILE *fp);
|
int _keybox_read_blob (KEYBOXBLOB *r_blob, FILE *fp, int *skipped_deleted);
|
||||||
int _keybox_read_blob2 (KEYBOXBLOB *r_blob, FILE *fp, int *skipped_deleted);
|
|
||||||
int _keybox_write_blob (KEYBOXBLOB blob, FILE *fp);
|
int _keybox_write_blob (KEYBOXBLOB blob, FILE *fp);
|
||||||
|
|
||||||
/*-- keybox-search.c --*/
|
/*-- keybox-search.c --*/
|
||||||
|
@ -581,7 +581,7 @@ _keybox_dump_file (const char *filename, int stats_only, FILE *outfp)
|
|||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
rc = _keybox_read_blob (&blob, fp);
|
rc = _keybox_read_blob (&blob, fp, NULL);
|
||||||
if (gpg_err_code (rc) == GPG_ERR_TOO_LARGE
|
if (gpg_err_code (rc) == GPG_ERR_TOO_LARGE
|
||||||
&& gpg_err_source (rc) == GPG_ERR_SOURCE_KEYBOX)
|
&& gpg_err_source (rc) == GPG_ERR_SOURCE_KEYBOX)
|
||||||
{
|
{
|
||||||
@ -704,7 +704,7 @@ _keybox_dump_find_dups (const char *filename, int print_them, FILE *outfp)
|
|||||||
}
|
}
|
||||||
dupitems_count = 0;
|
dupitems_count = 0;
|
||||||
|
|
||||||
while ( !(rc = _keybox_read_blob (&blob, fp)) )
|
while ( !(rc = _keybox_read_blob (&blob, fp, NULL)) )
|
||||||
{
|
{
|
||||||
unsigned char digest[20];
|
unsigned char digest[20];
|
||||||
|
|
||||||
@ -778,7 +778,7 @@ _keybox_dump_cut_records (const char *filename, unsigned long from,
|
|||||||
if (!(fp = open_file (&filename, stderr)))
|
if (!(fp = open_file (&filename, stderr)))
|
||||||
return gpg_error_from_syserror ();
|
return gpg_error_from_syserror ();
|
||||||
|
|
||||||
while ( !(rc = _keybox_read_blob (&blob, fp)) )
|
while ( !(rc = _keybox_read_blob (&blob, fp, NULL)) )
|
||||||
{
|
{
|
||||||
if (recno > to)
|
if (recno > to)
|
||||||
break; /* Ready. */
|
break; /* Ready. */
|
||||||
|
@ -45,10 +45,10 @@ ftello (FILE *stream)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Read a block at the current position and return it in r_blob.
|
/* Read a block at the current position and return it in R_BLOB.
|
||||||
r_blob may be NULL to simply skip the current block. */
|
R_BLOB may be NULL to simply skip the current block. */
|
||||||
int
|
int
|
||||||
_keybox_read_blob2 (KEYBOXBLOB *r_blob, FILE *fp, int *skipped_deleted)
|
_keybox_read_blob (KEYBOXBLOB *r_blob, FILE *fp, int *skipped_deleted)
|
||||||
{
|
{
|
||||||
unsigned char *image;
|
unsigned char *image;
|
||||||
size_t imagelen = 0;
|
size_t imagelen = 0;
|
||||||
@ -56,6 +56,7 @@ _keybox_read_blob2 (KEYBOXBLOB *r_blob, FILE *fp, int *skipped_deleted)
|
|||||||
int rc;
|
int rc;
|
||||||
off_t off;
|
off_t off;
|
||||||
|
|
||||||
|
if (skipped_deleted)
|
||||||
*skipped_deleted = 0;
|
*skipped_deleted = 0;
|
||||||
again:
|
again:
|
||||||
if (r_blob)
|
if (r_blob)
|
||||||
@ -86,6 +87,7 @@ _keybox_read_blob2 (KEYBOXBLOB *r_blob, FILE *fp, int *skipped_deleted)
|
|||||||
/* Special treatment for empty blobs. */
|
/* Special treatment for empty blobs. */
|
||||||
if (fseek (fp, imagelen-5, SEEK_CUR))
|
if (fseek (fp, imagelen-5, SEEK_CUR))
|
||||||
return gpg_error_from_syserror ();
|
return gpg_error_from_syserror ();
|
||||||
|
if (skipped_deleted)
|
||||||
*skipped_deleted = 1;
|
*skipped_deleted = 1;
|
||||||
goto again;
|
goto again;
|
||||||
}
|
}
|
||||||
@ -99,6 +101,14 @@ _keybox_read_blob2 (KEYBOXBLOB *r_blob, FILE *fp, int *skipped_deleted)
|
|||||||
return gpg_error (GPG_ERR_TOO_LARGE);
|
return gpg_error (GPG_ERR_TOO_LARGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!r_blob)
|
||||||
|
{
|
||||||
|
/* This blob shall be skipped. */
|
||||||
|
if (fseek (fp, imagelen-5, SEEK_CUR))
|
||||||
|
return gpg_error_from_syserror ();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
image = xtrymalloc (imagelen);
|
image = xtrymalloc (imagelen);
|
||||||
if (!image)
|
if (!image)
|
||||||
return gpg_error_from_syserror ();
|
return gpg_error_from_syserror ();
|
||||||
@ -111,19 +121,12 @@ _keybox_read_blob2 (KEYBOXBLOB *r_blob, FILE *fp, int *skipped_deleted)
|
|||||||
return tmperr;
|
return tmperr;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = r_blob? _keybox_new_blob (r_blob, image, imagelen, off) : 0;
|
rc = _keybox_new_blob (r_blob, image, imagelen, off);
|
||||||
if (rc || !r_blob)
|
if (rc)
|
||||||
xfree (image);
|
xfree (image);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
|
||||||
_keybox_read_blob (KEYBOXBLOB *r_blob, FILE *fp)
|
|
||||||
{
|
|
||||||
int dummy;
|
|
||||||
return _keybox_read_blob2 (r_blob, fp, &dummy);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Write the block to the current file position */
|
/* Write the block to the current file position */
|
||||||
int
|
int
|
||||||
|
@ -725,6 +725,23 @@ release_sn_array (struct sn_array_s *array, size_t size)
|
|||||||
xfree (array);
|
xfree (array);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Helper to open the file. */
|
||||||
|
static gpg_error_t
|
||||||
|
open_file (KEYBOX_HANDLE hd)
|
||||||
|
{
|
||||||
|
|
||||||
|
hd->fp = fopen (hd->kb->fname, "rb");
|
||||||
|
if (!hd->fp)
|
||||||
|
{
|
||||||
|
hd->error = gpg_error_from_syserror ();
|
||||||
|
return hd->error;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
@ -822,12 +839,11 @@ keybox_search (KEYBOX_HANDLE hd, KEYBOX_SEARCH_DESC *desc, size_t ndesc,
|
|||||||
|
|
||||||
if (!hd->fp)
|
if (!hd->fp)
|
||||||
{
|
{
|
||||||
hd->fp = fopen (hd->kb->fname, "rb");
|
rc = open_file (hd);
|
||||||
if (!hd->fp)
|
if (rc)
|
||||||
{
|
{
|
||||||
hd->error = gpg_error_from_syserror ();
|
|
||||||
xfree (sn_array);
|
xfree (sn_array);
|
||||||
return hd->error;
|
return rc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -899,7 +915,7 @@ keybox_search (KEYBOX_HANDLE hd, KEYBOX_SEARCH_DESC *desc, size_t ndesc,
|
|||||||
int blobtype;
|
int blobtype;
|
||||||
|
|
||||||
_keybox_release_blob (blob); blob = NULL;
|
_keybox_release_blob (blob); blob = NULL;
|
||||||
rc = _keybox_read_blob (&blob, hd->fp);
|
rc = _keybox_read_blob (&blob, hd->fp, NULL);
|
||||||
if (gpg_err_code (rc) == GPG_ERR_TOO_LARGE
|
if (gpg_err_code (rc) == GPG_ERR_TOO_LARGE
|
||||||
&& gpg_err_source (rc) == GPG_ERR_SOURCE_KEYBOX)
|
&& gpg_err_source (rc) == GPG_ERR_SOURCE_KEYBOX)
|
||||||
{
|
{
|
||||||
@ -1192,24 +1208,23 @@ keybox_offset (KEYBOX_HANDLE hd)
|
|||||||
gpg_error_t
|
gpg_error_t
|
||||||
keybox_seek (KEYBOX_HANDLE hd, off_t offset)
|
keybox_seek (KEYBOX_HANDLE hd, off_t offset)
|
||||||
{
|
{
|
||||||
int err;
|
gpg_error_t err;
|
||||||
|
|
||||||
if (hd->error)
|
if (hd->error)
|
||||||
return hd->error; /* still in error state */
|
return hd->error; /* still in error state */
|
||||||
|
|
||||||
if (! hd->fp)
|
if (! hd->fp)
|
||||||
{
|
{
|
||||||
if (offset == 0)
|
if (!offset)
|
||||||
|
{
|
||||||
/* No need to open the file. An unopened file is effectively at
|
/* No need to open the file. An unopened file is effectively at
|
||||||
offset 0. */
|
offset 0. */
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
hd->fp = fopen (hd->kb->fname, "rb");
|
|
||||||
if (!hd->fp)
|
|
||||||
{
|
|
||||||
hd->error = gpg_error_from_syserror ();
|
|
||||||
return hd->error;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err = open_file (hd);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = fseeko (hd->fp, offset, SEEK_SET);
|
err = fseeko (hd->fp, offset, SEEK_SET);
|
||||||
|
@ -288,7 +288,7 @@ blob_filecopy (int mode, const char *fname, KEYBOXBLOB blob,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Skip this blob. */
|
/* Skip this blob. */
|
||||||
rc = _keybox_read_blob (NULL, fp);
|
rc = _keybox_read_blob (NULL, fp, NULL);
|
||||||
if (rc)
|
if (rc)
|
||||||
{
|
{
|
||||||
fclose (fp);
|
fclose (fp);
|
||||||
@ -665,7 +665,7 @@ keybox_compress (KEYBOX_HANDLE hd)
|
|||||||
|
|
||||||
/* A quick test to see if we need to compress the file at all. We
|
/* A quick test to see if we need to compress the file at all. We
|
||||||
schedule a compress run after 3 hours. */
|
schedule a compress run after 3 hours. */
|
||||||
if ( !_keybox_read_blob (&blob, fp) )
|
if ( !_keybox_read_blob (&blob, fp, NULL) )
|
||||||
{
|
{
|
||||||
const unsigned char *buffer;
|
const unsigned char *buffer;
|
||||||
size_t length;
|
size_t length;
|
||||||
@ -703,7 +703,7 @@ keybox_compress (KEYBOX_HANDLE hd)
|
|||||||
cut_time = time(NULL) - 86400;
|
cut_time = time(NULL) - 86400;
|
||||||
first_blob = 1;
|
first_blob = 1;
|
||||||
skipped_deleted = 0;
|
skipped_deleted = 0;
|
||||||
for (rc=0; !(read_rc = _keybox_read_blob2 (&blob, fp, &skipped_deleted));
|
for (rc=0; !(read_rc = _keybox_read_blob (&blob, fp, &skipped_deleted));
|
||||||
_keybox_release_blob (blob), blob = NULL )
|
_keybox_release_blob (blob), blob = NULL )
|
||||||
{
|
{
|
||||||
unsigned int blobflags;
|
unsigned int blobflags;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user