core: New interface gpgme_data_new_from_estream.
* src/gpgme.h.in (gpgme_data_new_from_estream): New. * src/data-estream.c: New. * src/data.h (gpgme_data): New union member e_stream. -- The estream functions (gpgrt_fopen et al.) are any waypart of the required libgpg-error library and thus it makes sense to provide this convenience interface. Signed-off-by: Werner Koch <wk@gnupg.org>
This commit is contained in:
parent
98a75a16cc
commit
f42cd70f18
3
NEWS
3
NEWS
@ -7,8 +7,11 @@ Noteworthy changes in version 1.11.2 (unreleased)
|
|||||||
* Added context flag "auto-key-locate" to control the
|
* Added context flag "auto-key-locate" to control the
|
||||||
behavior of GPGME_KEYLIST_MODE_LOCATE.
|
behavior of GPGME_KEYLIST_MODE_LOCATE.
|
||||||
|
|
||||||
|
* New data function to create a data object from an estream.
|
||||||
|
|
||||||
* Interface changes relative to the 1.11.1 release:
|
* Interface changes relative to the 1.11.1 release:
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
gpgme_data_new_from_estream NEW.
|
||||||
gpgme_decrypt_result_t EXTENDED: New field legacy_cipher_nomdc.
|
gpgme_decrypt_result_t EXTENDED: New field legacy_cipher_nomdc.
|
||||||
gpgme_set_ctx_flag EXTENDED: New flag 'ignore-mdc-error'.
|
gpgme_set_ctx_flag EXTENDED: New flag 'ignore-mdc-error'.
|
||||||
GPGME_AUDITLOG_DEFAULT NEW.
|
GPGME_AUDITLOG_DEFAULT NEW.
|
||||||
|
@ -1909,6 +1909,25 @@ data object was successfully created, and @code{GPG_ERR_ENOMEM} if not
|
|||||||
enough memory is available.
|
enough memory is available.
|
||||||
@end deftypefun
|
@end deftypefun
|
||||||
|
|
||||||
|
@deftypefun gpgme_error_t gpgme_data_new_from_estream (@w{gpgme_data_t *@var{dh}}, @w{gpgrt_stream_t @var{stream}})
|
||||||
|
The function @code{gpgme_data_new_from_estream} creates a new
|
||||||
|
@code{gpgme_data_t} object and uses the gpgrt stream @var{stream} to read
|
||||||
|
from (if used as an input data object) and write to (if used as an
|
||||||
|
output data object).
|
||||||
|
|
||||||
|
When using the data object as an input buffer, the function might read
|
||||||
|
a bit more from the stream than is actually needed by the crypto
|
||||||
|
engine in the desired operation because of internal buffering.
|
||||||
|
|
||||||
|
Note that GPGME assumes that the stream is in blocking mode. Errors
|
||||||
|
during I/O operations, except for EINTR, are usually fatal for crypto
|
||||||
|
operations.
|
||||||
|
|
||||||
|
The function returns the error code @code{GPG_ERR_NO_ERROR} if the
|
||||||
|
data object was successfully created, and @code{GPG_ERR_ENOMEM} if not
|
||||||
|
enough memory is available.
|
||||||
|
@end deftypefun
|
||||||
|
|
||||||
|
|
||||||
@node Callback Based Data Buffers
|
@node Callback Based Data Buffers
|
||||||
@subsection Callback Based Data Buffers
|
@subsection Callback Based Data Buffers
|
||||||
|
@ -70,6 +70,7 @@ main_sources = \
|
|||||||
parsetlv.c parsetlv.h \
|
parsetlv.c parsetlv.h \
|
||||||
mbox-util.c mbox-util.h \
|
mbox-util.c mbox-util.h \
|
||||||
data.h data.c data-fd.c data-stream.c data-mem.c data-user.c \
|
data.h data.c data-fd.c data-stream.c data-mem.c data-user.c \
|
||||||
|
data-estream.c \
|
||||||
data-compat.c data-identify.c \
|
data-compat.c data-identify.c \
|
||||||
signers.c sig-notation.c \
|
signers.c sig-notation.c \
|
||||||
wait.c wait-global.c wait-private.c wait-user.c wait.h \
|
wait.c wait-global.c wait-private.c wait-user.c wait.h \
|
||||||
|
99
src/data-estream.c
Normal file
99
src/data-estream.c
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
/* data-stream.c - A stream based data object.
|
||||||
|
* Copyright (C) 2002, 2004, 2018 g10 Code GmbH
|
||||||
|
*
|
||||||
|
* This file is part of GPGME.
|
||||||
|
*
|
||||||
|
* GPGME is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU Lesser General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2.1 of
|
||||||
|
* the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GPGME 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
|
* SPDX-License-Identifier: LGPL-2.1+
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if HAVE_CONFIG_H
|
||||||
|
#include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
# include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "debug.h"
|
||||||
|
#include "data.h"
|
||||||
|
|
||||||
|
|
||||||
|
static gpgme_ssize_t
|
||||||
|
stream_es_read (gpgme_data_t dh, void *buffer, size_t size)
|
||||||
|
{
|
||||||
|
size_t amt = gpgrt_fread (buffer, 1, size, dh->data.e_stream);
|
||||||
|
if (amt > 0)
|
||||||
|
return amt;
|
||||||
|
return gpgrt_ferror (dh->data.e_stream) ? -1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static gpgme_ssize_t
|
||||||
|
stream_es_write (gpgme_data_t dh, const void *buffer, size_t size)
|
||||||
|
{
|
||||||
|
size_t amt = gpgrt_fwrite (buffer, 1, size, dh->data.e_stream);
|
||||||
|
if (amt > 0)
|
||||||
|
return amt;
|
||||||
|
return gpgrt_ferror (dh->data.e_stream) ? -1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static gpgme_off_t
|
||||||
|
stream_es_seek (gpgme_data_t dh, gpgme_off_t offset, int whence)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
|
||||||
|
err = gpgrt_fseeko (dh->data.e_stream, offset, whence);
|
||||||
|
if (err)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return gpgrt_ftello (dh->data.e_stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
stream_es_get_fd (gpgme_data_t dh)
|
||||||
|
{
|
||||||
|
gpgrt_fflush (dh->data.e_stream);
|
||||||
|
return gpgrt_fileno (dh->data.e_stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static struct _gpgme_data_cbs stream_es_cbs =
|
||||||
|
{
|
||||||
|
stream_es_read,
|
||||||
|
stream_es_write,
|
||||||
|
stream_es_seek,
|
||||||
|
NULL,
|
||||||
|
stream_es_get_fd
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
gpgme_error_t
|
||||||
|
gpgme_data_new_from_estream (gpgme_data_t *r_dh, gpgrt_stream_t stream)
|
||||||
|
{
|
||||||
|
gpgme_error_t err;
|
||||||
|
TRACE_BEG1 (DEBUG_DATA, "gpgme_data_new_from_estream", r_dh, "estream=%p",
|
||||||
|
stream);
|
||||||
|
|
||||||
|
err = _gpgme_data_new (r_dh, &stream_es_cbs);
|
||||||
|
if (err)
|
||||||
|
return TRACE_ERR (err);
|
||||||
|
|
||||||
|
(*r_dh)->data.e_stream = stream;
|
||||||
|
return TRACE_SUC1 ("dh=%p", *r_dh);
|
||||||
|
}
|
@ -100,6 +100,9 @@ struct gpgme_data
|
|||||||
/* For gpgme_data_new_from_stream. */
|
/* For gpgme_data_new_from_stream. */
|
||||||
FILE *stream;
|
FILE *stream;
|
||||||
|
|
||||||
|
/* For gpgme_data_new_from_estream. */
|
||||||
|
gpgrt_stream_t e_stream;
|
||||||
|
|
||||||
/* For gpgme_data_new_from_cbs. */
|
/* For gpgme_data_new_from_cbs. */
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
|
@ -1180,6 +1180,8 @@ gpgme_error_t gpgme_data_new_from_cbs (gpgme_data_t *dh,
|
|||||||
gpgme_error_t gpgme_data_new_from_fd (gpgme_data_t *dh, int fd);
|
gpgme_error_t gpgme_data_new_from_fd (gpgme_data_t *dh, int fd);
|
||||||
|
|
||||||
gpgme_error_t gpgme_data_new_from_stream (gpgme_data_t *dh, FILE *stream);
|
gpgme_error_t gpgme_data_new_from_stream (gpgme_data_t *dh, FILE *stream);
|
||||||
|
gpgme_error_t gpgme_data_new_from_estream (gpgme_data_t *r_dh,
|
||||||
|
gpgrt_stream_t stream);
|
||||||
|
|
||||||
/* Return the encoding attribute of the data buffer DH */
|
/* Return the encoding attribute of the data buffer DH */
|
||||||
gpgme_data_encoding_t gpgme_data_get_encoding (gpgme_data_t dh);
|
gpgme_data_encoding_t gpgme_data_get_encoding (gpgme_data_t dh);
|
||||||
|
Loading…
Reference in New Issue
Block a user