From 1f980d23af8b818ed8246ec6bf13b9c61b963ec0 Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Tue, 6 Aug 2019 14:59:37 +0200 Subject: [PATCH] kbx: Allow writing using a estream. * kbx/keybox-file.c (_keybox_write_header_blob): New optional arg stream. Change callers. Signed-off-by: Werner Koch --- g10/keydb.c | 2 +- kbx/keybox-file.c | 18 +++++++++++++----- kbx/keybox-update.c | 4 ++-- kbx/keybox.h | 3 ++- sm/keydb.c | 2 +- 5 files changed, 19 insertions(+), 10 deletions(-) diff --git a/g10/keydb.c b/g10/keydb.c index a7691bbe2..d3a2709bc 100644 --- a/g10/keydb.c +++ b/g10/keydb.c @@ -448,7 +448,7 @@ maybe_create_keyring_or_box (char *filename, int is_box, int force_create) rc = gpg_error_from_syserror (); else { - rc = _keybox_write_header_blob (fp, 1); + rc = _keybox_write_header_blob (fp, NULL, 1); fclose (fp); } if (rc) diff --git a/kbx/keybox-file.c b/kbx/keybox-file.c index 046e32123..7a1b43aa7 100644 --- a/kbx/keybox-file.c +++ b/kbx/keybox-file.c @@ -146,9 +146,9 @@ _keybox_write_blob (KEYBOXBLOB blob, FILE *fp) } -/* Write a fresh header type blob. */ -int -_keybox_write_header_blob (FILE *fp, int for_openpgp) +/* Write a fresh header type blob. Either FP or STREAM must be used. */ +gpg_error_t +_keybox_write_header_blob (FILE *fp, estream_t stream, int for_openpgp) { unsigned char image[32]; u32 val; @@ -174,7 +174,15 @@ _keybox_write_header_blob (FILE *fp, int for_openpgp) image[20+2] = (val >> 8); image[20+3] = (val ); - if (fwrite (image, 32, 1, fp) != 1) - return gpg_error_from_syserror (); + if (fp) + { + if (fwrite (image, 32, 1, fp) != 1) + return gpg_error_from_syserror (); + } + else + { + if (es_fwrite (image, 32, 1, stream) != 1) + return gpg_error_from_syserror (); + } return 0; } diff --git a/kbx/keybox-update.c b/kbx/keybox-update.c index e09fefc41..d22da1bf8 100644 --- a/kbx/keybox-update.c +++ b/kbx/keybox-update.c @@ -182,7 +182,7 @@ blob_filecopy (int mode, const char *fname, KEYBOXBLOB blob, if (!newfp ) return gpg_error_from_syserror (); - rc = _keybox_write_header_blob (newfp, for_openpgp); + rc = _keybox_write_header_blob (newfp, NULL, for_openpgp); if (rc) { fclose (newfp); @@ -730,7 +730,7 @@ keybox_compress (KEYBOX_HANDLE hd) } /* The header blob is missing. Insert it. */ - rc = _keybox_write_header_blob (newfp, hd->for_openpgp); + rc = _keybox_write_header_blob (newfp, NULL, hd->for_openpgp); if (rc) break; any_changes = 1; diff --git a/kbx/keybox.h b/kbx/keybox.h index 4d941571e..d614c32d1 100644 --- a/kbx/keybox.h +++ b/kbx/keybox.h @@ -81,7 +81,8 @@ gpg_error_t keybox_lock (KEYBOX_HANDLE hd, int yes, long timeout); /*-- keybox-file.c --*/ /* Fixme: This function does not belong here: Provide a better interface to create a new keybox file. */ -int _keybox_write_header_blob (FILE *fp, int openpgp_flag); +gpg_error_t _keybox_write_header_blob (FILE *fp, estream_t stream, + int openpgp_flag); /*-- keybox-search.c --*/ gpg_error_t keybox_get_keyblock (KEYBOX_HANDLE hd, iobuf_t *r_iobuf, diff --git a/sm/keydb.c b/sm/keydb.c index 53e3cf887..cf643abcd 100644 --- a/sm/keydb.c +++ b/sm/keydb.c @@ -224,7 +224,7 @@ maybe_create_keybox (char *filename, int force, int *r_created) /* Make sure that at least one record is in a new keybox file, so that the detection magic for OpenPGP keyboxes works the next time it is used. */ - rc = _keybox_write_header_blob (fp, 0); + rc = _keybox_write_header_blob (fp, NULL, 0); if (rc) { fclose (fp);