Browse Source

Simplify

There are functions to identify spaces and letters...
It's in ctypes...
master
David Lanzendörfer 12 months ago
parent
commit
6f899ab197
1 changed files with 100 additions and 144 deletions
  1. +100
    -144
      src/reader.c

+ 100
- 144
src/reader.c View File

@ -113,6 +113,7 @@ __RCSID("$NetBSD$");
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#ifdef HAVE_TERMIOS_H
#include <termios.h>
@ -151,7 +152,7 @@ __RCSID("$NetBSD$");
#define MAX(a,b) (((a)>(b))?(a):(b))
#endif
inline unsigned char A(unsigned char c)
inline char A(char c)
{
#if defined(NETPGP_EBCDIC)
__e2a_l(&c,1);
@ -316,8 +317,8 @@ typedef struct {
uint8_t unarmoured[NETPGP_BUFSIZ];
size_t unarmoredc;
/* pushed back data (stored backwards) */
uint8_t *pushback;
unsigned pushbackc;
uint8_t *pushback;
unsigned pushbackc;
/* armoured block headers */
pgp_headers_t headers;
} dearmour_t;
@ -326,11 +327,10 @@ static void
push_back(dearmour_t *dearmour, const uint8_t *buf,
unsigned length)
{
unsigned n;
unsigned n;
if (dearmour->pushback) {
(void) fprintf(stderr, "push_back: already pushed back\n");
} else if ((dearmour->pushback = calloc(1, length)) == NULL) {
} else if ((dearmour->pushback = malloc(length)) == NULL) {
(void) fprintf(stderr, "push_back: bad alloc\n");
} else {
for (n = 0; n < length; ++n) {
@ -453,9 +453,7 @@ read_char(pgp_stream_t *stream, dearmour_t *dearmour,
pgp_cbdata_t *cbinfo,
unsigned skip)
{
//printf("%s\n",__FUNCTION__);
uint8_t c;
do {
if (dearmour->pushbackc) {
if (!dearmour->pushback) {
@ -483,9 +481,9 @@ eat_whitespace(pgp_stream_t *stream, int first,
pgp_cbdata_t *cbinfo,
unsigned skip)
{
int c = first;
int c = first;
while (c == ' ' || c == '\t') {
while (isspace(c)) {
c = read_char(stream, dearmour, errors, readinfo, cbinfo, skip);
}
return c;
@ -498,11 +496,11 @@ read_and_eat_whitespace(pgp_stream_t *stream, dearmour_t *dearmour,
pgp_cbdata_t *cbinfo,
unsigned skip)
{
int c;
int c;
do {
c = read_char(stream, dearmour, errors, readinfo, cbinfo, skip);
} while (c == ' ' || c == '\t');
} while (isspace(c));
return c;
}
@ -526,8 +524,7 @@ unarmoured_read_char(pgp_stream_t *stream, dearmour_t *dearmour,
pgp_cbdata_t *cbinfo,
unsigned skip)
{
//printf("%s\n",__FUNCTION__);
int c;
int c;
do {
c = read_char(stream, dearmour, errors, readinfo, cbinfo, 0);
@ -768,14 +765,12 @@ parse_headers(pgp_stream_t *stream, dearmour_t *dearmour, pgp_error_t **errors,
int c;
if ((c = read_char(stream, dearmour, errors, readinfo, cbinfo, 1)) < 0) {
PGP_ERROR_1(errors, PGP_E_R_BAD_FORMAT,
"%s", "Unexpected EOF");
PGP_ERROR_1(errors, PGP_E_R_BAD_FORMAT, "%s", "Unexpected EOF");
ret = -1;
break;
}
if (c == '\n') {
char *s;
char *s;
if (nbuf == 0) {
break;
}
@ -800,10 +795,7 @@ parse_headers(pgp_stream_t *stream, dearmour_t *dearmour, pgp_error_t **errors,
} else {
if (first &&
!(dearmour->allow_headers_without_gap || dearmour->allow_no_gap)) {
PGP_ERROR_1(errors,
PGP_E_R_BAD_FORMAT,
"%s", "No colon in"
" armour header (2)");
PGP_ERROR_1(errors, PGP_E_R_BAD_FORMAT, "%s", "No colon in armour header (2)");
/*
* then we have a nasty
* armoured block with no
@ -857,30 +849,29 @@ read4(pgp_stream_t *stream, dearmour_t *dearmour, pgp_error_t **errors,
pgp_reader_t *readinfo, pgp_cbdata_t *cbinfo,
int *pc, unsigned *pn, uint32_t *pl)
{
//printf("%s\n",__FUNCTION__);
int n = 0, c = 0;
uint32_t l = 0;
int n = 0, c = 0;
uint32_t l = 0;
for (n = 0; n < 4; ++n) {
c = read_char(stream, dearmour, errors, readinfo, cbinfo, 1);
if (A(c) < 0) {
if (c < 0) {
dearmour->eof64 = 1;
return -1;
}
if (c == A('-') || c == A('=')) {
if (c == '-' || c == '=') {
break;
}
l <<= 6;
if (A(c) >= A('A') && A(c) <= A('Z')) {
l += (uint32_t)(c - A('A'));
} else if (A(c) >= A('a') && A(c) <= A('z')) {
l += (uint32_t)(A(c) - A('a')) + 26;
} else if (A(c) >= A('0') && A(c) <= A('9')) {
l += (uint32_t)(A(c) - A('0')) + 52;
} else if (A(c) == A('+')) {
l += 62;
} else if (A(c) == A('/')) {
l += 63;
if (isupper(c)) {
l += (uint32_t)(A(c)-0x41);
} else if (islower(c)) {
l += (uint32_t)(A(c)-0x47);
} else if (isdigit(c)) {
l += (uint32_t)(A(c)+0x04);
} else if (c == '+') {
l += (uint32_t)0x3e;
} else if (c == '/') {
l += (uint32_t)0x3f;
} else {
--n;
l >>= 6;
@ -897,8 +888,7 @@ read4(pgp_stream_t *stream, dearmour_t *dearmour, pgp_error_t **errors,
unsigned
pgp_crc24(unsigned checksum, uint8_t c)
{
unsigned i;
unsigned i;
checksum ^= c << 16;
for (i = 0; i < 8; i++) {
checksum <<= 1;
@ -912,11 +902,11 @@ static int
decode64(pgp_stream_t *stream, dearmour_t *dearmour, pgp_error_t **errors,
pgp_reader_t *readinfo, pgp_cbdata_t *cbinfo)
{
unsigned n;
int n2;
uint32_t l;
int c;
int ret;
unsigned n;
int n2;
uint32_t l;
int c;
int ret;
if (dearmour->buffered) {
(void) fprintf(stderr, "decode64: bad dearmour->buffered\n");
@ -925,14 +915,12 @@ decode64(pgp_stream_t *stream, dearmour_t *dearmour, pgp_error_t **errors,
ret = read4(stream, dearmour, errors, readinfo, cbinfo, &c, &n, &l);
if (ret < 0) {
PGP_ERROR_1(errors, PGP_E_R_BAD_FORMAT, "%s",
"Badly formed base64");
PGP_ERROR_1(errors, PGP_E_R_BAD_FORMAT, "%s", "Badly formed base64");
return 0;
}
if (n == 3) {
if (c != '=') {
PGP_ERROR_1(errors, PGP_E_R_BAD_FORMAT,
"%s", "Badly terminated base64 (2)");
PGP_ERROR_1(errors, PGP_E_R_BAD_FORMAT, "%s", "Badly terminated base64 (2)");
return 0;
}
dearmour->buffered = 2;
@ -940,8 +928,7 @@ decode64(pgp_stream_t *stream, dearmour_t *dearmour, pgp_error_t **errors,
l >>= 2;
} else if (n == 2) {
if (c != '=') {
PGP_ERROR_1(errors, PGP_E_R_BAD_FORMAT,
"%s", "Badly terminated base64 (3)");
PGP_ERROR_1(errors, PGP_E_R_BAD_FORMAT, "%s", "Badly terminated base64 (3)");
return 0;
}
dearmour->buffered = 1;
@ -949,21 +936,18 @@ decode64(pgp_stream_t *stream, dearmour_t *dearmour, pgp_error_t **errors,
l >>= 4;
c = read_char(stream, dearmour, errors, readinfo, cbinfo, 0);
if (c != '=') {
PGP_ERROR_1(errors, PGP_E_R_BAD_FORMAT,
"%s", "Badly terminated base64");
PGP_ERROR_1(errors, PGP_E_R_BAD_FORMAT, "%s", "Badly terminated base64");
return 0;
}
} else if (n == 0) {
if (!dearmour->prev_nl || c != '=') {
PGP_ERROR_1(errors, PGP_E_R_BAD_FORMAT,
"%s", "Badly terminated base64 (4)");
PGP_ERROR_1(errors, PGP_E_R_BAD_FORMAT, "%s", "Badly terminated base64 (4)");
return 0;
}
dearmour->buffered = 0;
} else {
if (n != 4) {
(void) fprintf(stderr,
"decode64: bad n (!= 4)\n");
(void) fprintf(stderr, "decode64: bad n (!= 4)\n");
return 0;
}
dearmour->buffered = 3;
@ -979,51 +963,41 @@ decode64(pgp_stream_t *stream, dearmour_t *dearmour, pgp_error_t **errors,
(void) fprintf(stderr, "decode64: bad c (=)\n");
return 0;
}
c = read_and_eat_whitespace(stream, dearmour, errors, readinfo, cbinfo,
1);
c = read_and_eat_whitespace(stream, dearmour, errors, readinfo, cbinfo, 1);
if (c != '\n') {
PGP_ERROR_1(errors, PGP_E_R_BAD_FORMAT,
"%s", "No newline at base64 end");
PGP_ERROR_1(errors, PGP_E_R_BAD_FORMAT, "%s", "No newline at base64 end");
return 0;
}
c = read_char(stream, dearmour, errors, readinfo, cbinfo, 0);
if (c != '=') {
PGP_ERROR_1(errors, PGP_E_R_BAD_FORMAT,
"%s", "No checksum at base64 end");
PGP_ERROR_1(errors, PGP_E_R_BAD_FORMAT, "%s", "No checksum at base64 end");
return 0;
}
}
if (c == '=') {
/* now we are at the checksum */
ret = read4(stream, dearmour, errors, readinfo, cbinfo, &c, &n,
&dearmour->read_checksum);
ret = read4(stream, dearmour, errors, readinfo, cbinfo, &c, &n, &dearmour->read_checksum);
if (ret < 0 || n != 4) {
PGP_ERROR_1(errors, PGP_E_R_BAD_FORMAT,
"%s", "Error in checksum");
PGP_ERROR_1(errors, PGP_E_R_BAD_FORMAT, "%s", "Error in checksum");
return 0;
}
c = read_char(stream, dearmour, errors, readinfo, cbinfo, 1);
if (dearmour->allow_trailing_whitespace)
c = eat_whitespace(stream, c, dearmour, errors, readinfo, cbinfo,
1);
c = eat_whitespace(stream, c, dearmour, errors, readinfo, cbinfo, 1);
if (c != '\n') {
PGP_ERROR_1(errors, PGP_E_R_BAD_FORMAT,
"%s", "Badly terminated checksum");
PGP_ERROR_1(errors, PGP_E_R_BAD_FORMAT, "%s", "Badly terminated checksum");
return 0;
}
c = read_char(stream, dearmour, errors, readinfo, cbinfo, 0);
if (c != '-') {
PGP_ERROR_1(errors, PGP_E_R_BAD_FORMAT,
"%s", "Bad base64 trailer (2)");
PGP_ERROR_1(errors, PGP_E_R_BAD_FORMAT, "%s", "Bad base64 trailer (2)");
return 0;
}
}
if (c == '-') {
for (n = 0; n < 4; ++n)
if (read_char(stream, dearmour, errors, readinfo, cbinfo,
0) != '-') {
PGP_ERROR_1(errors, PGP_E_R_BAD_FORMAT, "%s",
"Bad base64 trailer");
if (read_char(stream, dearmour, errors, readinfo, cbinfo, 0) != '-') {
PGP_ERROR_1(errors, PGP_E_R_BAD_FORMAT, "%s", "Bad base64 trailer");
return 0;
}
dearmour->eof64 = 1;
@ -1040,12 +1014,10 @@ decode64(pgp_stream_t *stream, dearmour_t *dearmour, pgp_error_t **errors,
}
for (n2 = dearmour->buffered - 1; n2 >= 0; --n2)
dearmour->checksum = pgp_crc24((unsigned)dearmour->checksum,
dearmour->buffer[n2]);
dearmour->checksum = pgp_crc24((unsigned)dearmour->checksum, dearmour->buffer[n2]);
if (dearmour->eof64 && dearmour->read_checksum != dearmour->checksum) {
PGP_ERROR_1(errors, PGP_E_R_BAD_FORMAT, "%s",
"Checksum mismatch");
PGP_ERROR_1(errors, PGP_E_R_BAD_FORMAT, "%s", "Checksum mismatch");
return 0;
}
return 1;
@ -1071,17 +1043,18 @@ armoured_data_reader(pgp_stream_t *stream, void *dest_, size_t length, pgp_error
{
pgp_packet_t content;
dearmour_t *dearmour;
unsigned first;
uint8_t *dest = dest_;
char buf[1024];
int saved;
int ret;
unsigned first;
uint8_t *dest = dest_;
char buf[1024];
int saved;
int ret;
dearmour = pgp_reader_get_arg(readinfo);
dearmour->pushback=NULL;
saved = (int)length;
if (dearmour->eof64 && !dearmour->buffered) {
if (dearmour->state != OUTSIDE_BLOCK &&
dearmour->state != AT_TRAILER_NAME) {
if (dearmour->state != OUTSIDE_BLOCK && dearmour->state != AT_TRAILER_NAME) {
(void) fprintf(stderr, "armoured_data_reader: bad dearmour state\n");
return 0;
}
@ -1101,8 +1074,7 @@ armoured_data_reader(pgp_stream_t *stream, void *dest_, size_t length, pgp_error
* it is just an EOF (and not a BLOCK_END)
*/
while (!dearmour->seen_nl) {
if ((c = unarmoured_read_char(stream, dearmour, errors,
readinfo, cbinfo, 1)) < 0) {
if ((c = unarmoured_read_char(stream, dearmour, errors, readinfo, cbinfo, 1)) < 0) {
return 0;
}
}
@ -1115,8 +1087,7 @@ armoured_data_reader(pgp_stream_t *stream, void *dest_, size_t length, pgp_error
flush(dearmour, cbinfo);
/* Find and consume the 5 leading '-' */
for (count = 0; count < 5; ++count) {
if ((c = unarmoured_read_char(stream, dearmour, errors,
readinfo, cbinfo, 0)) < 0) {
if ((c = unarmoured_read_char(stream, dearmour, errors, readinfo, cbinfo, 0)) < 0) {
return 0;
}
if (c != '-') {
@ -1126,8 +1097,7 @@ armoured_data_reader(pgp_stream_t *stream, void *dest_, size_t length, pgp_error
/* Now find the block type */
for (n = 0; n < sizeof(buf) - 1;) {
if ((c = unarmoured_read_char(stream, dearmour, errors,
readinfo, cbinfo, 0)) < 0) {
if ((c = unarmoured_read_char(stream, dearmour, errors, readinfo, cbinfo, 0)) < 0) {
return 0;
}
if (c == '-') {
@ -1139,7 +1109,6 @@ armoured_data_reader(pgp_stream_t *stream, void *dest_, size_t length, pgp_error
break;
got_minus:
printf("%s: tag got_minus\n",__FUNCTION__);
buf[n] = '\0';
/* Consume trailing '-' */
@ -1154,8 +1123,7 @@ printf("%s: tag got_minus\n",__FUNCTION__);
}
/* Consume final NL */
if ((c = unarmoured_read_char(stream, dearmour, errors, readinfo,
cbinfo, 1)) < 0) {
if ((c = unarmoured_read_char(stream, dearmour, errors, readinfo, cbinfo, 1)) < 0) {
return 0;
}
if (dearmour->allow_trailing_whitespace) {
@ -1218,8 +1186,7 @@ printf("%s: tag got_minus\n",__FUNCTION__);
return 0;
}
if (first) {
dearmour->state =
AT_TRAILER_NAME;
dearmour->state = AT_TRAILER_NAME;
goto reloop;
}
return -1;
@ -1250,12 +1217,10 @@ printf("%s: tag got_minus\n",__FUNCTION__);
buf[n++] = c;
}
/* then I guess this wasn't a proper trailer */
PGP_ERROR_1(errors, PGP_E_R_BAD_FORMAT, "%s",
"Bad ASCII armour trailer");
PGP_ERROR_1(errors, PGP_E_R_BAD_FORMAT, "%s", "Bad ASCII armour trailer");
break;
got_minus2:
printf("%s: tag got_minus2\n",__FUNCTION__);
buf[n] = '\0';
if (!set_lastseen_headerline(dearmour, buf, errors)) {
@ -1269,9 +1234,7 @@ printf("%s: tag got_minus2\n",__FUNCTION__);
}
if (c != '-') {
/* wasn't a trailer after all */
PGP_ERROR_1(errors, PGP_E_R_BAD_FORMAT,
"%s",
"Bad ASCII armour trailer (2)");
PGP_ERROR_1(errors, PGP_E_R_BAD_FORMAT, "%s", "Bad ASCII armour trailer (2)");
}
}
@ -1309,7 +1272,6 @@ printf("%s: tag got_minus2\n",__FUNCTION__);
break;
}
reloop:
printf("%s: tag reloop\n",__FUNCTION__);
continue;
}
@ -1347,8 +1309,7 @@ pgp_reader_push_dearmour(pgp_stream_t *parse_info)
*/
{
dearmour_t *dearmour;
if ((dearmour = calloc(1, sizeof(*dearmour))) == NULL) {
if ((dearmour = malloc(sizeof(*dearmour))) == NULL) {
(void) fprintf(stderr, "pgp_reader_push_dearmour: bad alloc\n");
} else {
dearmour->seen_nl = 1;
@ -1359,9 +1320,7 @@ pgp_reader_push_dearmour(pgp_stream_t *parse_info)
*/
dearmour->expect_sig = 0;
dearmour->got_sig = 0;
pgp_reader_push(parse_info, armoured_data_reader,
armoured_data_destroyer, dearmour);
pgp_reader_push(parse_info, armoured_data_reader, armoured_data_destroyer, dearmour);
}
}
@ -1400,7 +1359,6 @@ encrypted_data_reader(pgp_stream_t *stream, void *dest,
pgp_reader_t *readinfo,
pgp_cbdata_t *cbinfo)
{
printf("%s\n",__FUNCTION__);
encrypted_t *encrypted;
char *cdest;
int saved;
@ -1583,7 +1541,6 @@ se_ip_data_reader(pgp_stream_t *stream, void *dest_,
pgp_reader_t *readinfo,
pgp_cbdata_t *cbinfo)
{
printf("%s\n",__FUNCTION__);
decrypt_se_ip_t *se_ip;
pgp_region_t decrypted_region;
unsigned n = 0;
@ -1787,8 +1744,7 @@ fd_reader(pgp_stream_t *stream, void *dest, size_t length, pgp_error_t **errors,
return 0;
}
if (n < 0) {
PGP_SYSTEM_ERROR_1(errors, PGP_E_R_READ_FAILED, "read",
"file descriptor %d", reader->fd);
PGP_SYSTEM_ERROR_1(errors, PGP_E_R_READ_FAILED, "read", "file descriptor %d", reader->fd);
return -1;
}
return n;
@ -1809,8 +1765,7 @@ void
pgp_reader_set_fd(pgp_stream_t *stream, int fd)
{
mmap_reader_t *reader;
if ((reader = calloc(1, sizeof(*reader))) == NULL) {
if ((reader = malloc(sizeof(*reader))) == NULL) {
(void) fprintf(stderr, "pgp_reader_set_fd: bad alloc\n");
} else {
reader->fd = fd;
@ -1830,7 +1785,6 @@ static int
mem_reader(pgp_stream_t *stream, void *dest, size_t length, pgp_error_t **errors,
pgp_reader_t *readinfo, pgp_cbdata_t *cbinfo)
{
//printf("%s\n",__FUNCTION__);
reader_mem_t *reader = pgp_reader_get_arg(readinfo);
unsigned n;
@ -1935,17 +1889,13 @@ pgp_setup_memory_read(pgp_io_t *io,
pgp_stream_t **stream,
pgp_memory_t *mem,
void *vp,
pgp_cb_ret_t callback(const pgp_packet_t *,
pgp_cbdata_t *),
pgp_cb_ret_t callback(const pgp_packet_t *, pgp_cbdata_t *),
unsigned accumulate)
{
printf("%s\n",__FUNCTION__);
*stream = pgp_new(sizeof(**stream));
(*stream)->io = (*stream)->cbinfo.io = io;
pgp_set_callback(*stream, callback, vp);
pgp_reader_set_memory(*stream,
pgp_mem_data(mem),
pgp_mem_len(mem));
pgp_reader_set_memory(*stream, pgp_mem_data(mem), pgp_mem_len(mem));
if (accumulate) {
(*stream)->readinfo.accumulate = 1;
}
@ -2067,6 +2017,13 @@ pgp_teardown_file_append(pgp_output_t *output, int fd)
\note It is the caller's responsiblity to free parse_info and to close fd
\sa pgp_teardown_file_read()
*/
#ifdef O_BINARY
#define MMAP_BIN_FLAGS (O_RDONLY | O_BINARY)
#else
#define MMAP_BIN_FLAGS O_RDONLY
#endif
int
pgp_setup_file_read(pgp_io_t *io,
pgp_stream_t **stream,
@ -2075,16 +2032,16 @@ pgp_setup_file_read(pgp_io_t *io,
pgp_cb_ret_t callback(const pgp_packet_t *, pgp_cbdata_t *),
unsigned accumulate)
{
struct stat st;
int fd;
#ifdef O_BINARY
fd = open(filename, O_RDONLY | O_BINARY);
#else
fd = open(filename, O_RDONLY);
#endif
fd = open(filename, MMAP_BIN_FLAGS);
if (fd < 0) {
(void) fprintf(io->errs, "%s: can't open \"%s\"\n", __FUNCTION__, filename);
return fd;
}
fstat(fd, &st);
printf("%s: Opened file %s, fd=%d, size=%d\n", __FUNCTION__, filename, fd, (uint64_t)st.st_size);
*stream = pgp_new(sizeof(**stream));
(*stream)->io = (*stream)->cbinfo.io = io;
pgp_set_callback(*stream, callback, vp);
@ -2293,7 +2250,6 @@ hash_reader(pgp_stream_t *stream, void *dest,
pgp_reader_t *readinfo,
pgp_cbdata_t *cbinfo)
{
printf("%s\n",__FUNCTION__);
pgp_hash_t *hash = pgp_reader_get_arg(readinfo);
int r;
@ -2361,34 +2317,34 @@ mmap_destroyer(pgp_reader_t *readinfo)
free(pgp_reader_get_arg(readinfo));
}
#ifdef MAP_FILE
#define MMAP_MAP_FILE_FLAGS (MAP_PRIVATE | MAP_FILE)
#else
#define MMAP_MAP_FILE_FLAGS (MAP_PRIVATE)
#endif
/* set up the file to use mmap-ed memory if available, file IO otherwise */
void
pgp_reader_set_mmap(pgp_stream_t *stream, int fd)
{
mmap_reader_t *mem;
struct stat st;
if (fstat(fd, &st) != 0) {
(void) fprintf(stderr, "pgp_reader_set_mmap: can't fstat\n");
} else if ((mem = calloc(1, sizeof(*mem))) == NULL) {
(void) fprintf(stderr, "pgp_reader_set_mmap: bad alloc\n");
(void) printf("pgp_reader_set_mmap: can't fstat\n");
} else if ((mem = malloc(sizeof(mmap_reader_t))) == NULL) {
(void) printf("pgp_reader_set_mmap: bad alloc\n");
} else {
printf("fd=%d\n",fd);
printf("File size: %d\n",(uint64_t)st.st_size);
mem->size = (uint64_t)st.st_size;
mem->offset = 0;
mem->fd = fd;
mem->mem = mmap(NULL, (size_t)st.st_size, PROT_READ,
#ifdef MAP_FILE
MAP_PRIVATE | MAP_FILE,
#else
MAP_PRIVATE,
#endif
fd, 0);
mem->mem = mmap(NULL, (size_t)st.st_size, PROT_READ, MMAP_MAP_FILE_FLAGS, fd, 0);
if (mem->mem == MAP_FAILED) {
pgp_reader_set(stream, fd_reader, reader_fd_destroyer,
mem);
printf("Error setting reader\n");
pgp_reader_set(stream, fd_reader, reader_fd_destroyer, mem);
} else {
pgp_reader_set(stream, mmap_reader, mmap_destroyer,
mem);
pgp_reader_set(stream, mmap_reader, mmap_destroyer, mem);
}
}
}

Loading…
Cancel
Save