Author: noodles
Date: 2003/09/30 20:40:10
Allow a limit on the number of keys returned by read_openpgp_stream.
*
* Copyright 2002 Project Purple
*
*
* Copyright 2002 Project Purple
*
- * $Id: armor.c,v 1.6 2003/06/07 13:45:34 noodles Exp $
+ * $Id: armor.c,v 1.7 2003/09/30 20:40:10 noodles Exp $
dearmor_init(&dearmor_ctx);
dearmor_ctx.getchar_func = getchar_func;
dearmor_ctx.ctx = ctx;
dearmor_init(&dearmor_ctx);
dearmor_ctx.getchar_func = getchar_func;
dearmor_ctx.ctx = ctx;
- read_openpgp_stream(dearmor_getchar_c, &dearmor_ctx, packets);
+ read_openpgp_stream(dearmor_getchar_c, &dearmor_ctx,
+ packets, 0);
dearmor_finish(&dearmor_ctx);
/*
* TODO: Look for armor footer
dearmor_finish(&dearmor_ctx);
/*
* TODO: Look for armor footer
*
* Copyright 2002 Project Purple
*
*
* Copyright 2002 Project Purple
*
- * $Id: keydb_db2.c,v 1.9 2003/06/04 20:57:08 noodles Exp $
+ * $Id: keydb_db2.c,v 1.10 2003/09/30 20:40:10 noodles Exp $
*/
#include <sys/types.h>
*/
#include <sys/types.h>
fetchbuf.buffer = data.data;
fetchbuf.offset = 0;
fetchbuf.size = data.size;
fetchbuf.buffer = data.data;
fetchbuf.offset = 0;
fetchbuf.size = data.size;
- read_openpgp_stream(buffer_fetchchar, &fetchbuf, &packets);
+ read_openpgp_stream(buffer_fetchchar, &fetchbuf, &packets, 0);
parse_keys(packets, publickey);
free_packet_list(packets);
packets = NULL;
parse_keys(packets, publickey);
free_packet_list(packets);
packets = NULL;
*
* Copyright 2002 Project Purple
*
*
* Copyright 2002 Project Purple
*
- * $Id: keydb_db3.c,v 1.19 2003/09/28 16:12:47 noodles Exp $
+ * $Id: keydb_db3.c,v 1.20 2003/09/30 20:40:10 noodles Exp $
fetchbuf.offset = 0;
fetchbuf.size = data.size;
read_openpgp_stream(buffer_fetchchar, &fetchbuf,
fetchbuf.offset = 0;
fetchbuf.size = data.size;
read_openpgp_stream(buffer_fetchchar, &fetchbuf,
parse_keys(packets, publickey);
free_packet_list(packets);
packets = NULL;
parse_keys(packets, publickey);
free_packet_list(packets);
packets = NULL;
*
* Copyright 2002 Project Purple
*
*
* Copyright 2002 Project Purple
*
- * $Id: keydb_file.c,v 1.9 2003/06/05 07:31:59 noodles Exp $
+ * $Id: keydb_file.c,v 1.10 2003/09/30 20:40:10 noodles Exp $
*/
#include <sys/types.h>
*/
#include <sys/types.h>
fd = open(keyfile, O_RDONLY); // | O_SHLOCK);
if (fd > -1) {
fd = open(keyfile, O_RDONLY); // | O_SHLOCK);
if (fd > -1) {
- read_openpgp_stream(file_fetchchar, &fd, &packets);
+ read_openpgp_stream(file_fetchchar, &fd, &packets, 0);
parse_keys(packets, publickey);
free_packet_list(packets);
packets = NULL;
parse_keys(packets, publickey);
free_packet_list(packets);
packets = NULL;
*
* Copyright 2002 Project Purple
*
*
* Copyright 2002 Project Purple
*
- * $Id: keydb_pg.c,v 1.12 2003/06/08 21:11:01 noodles Exp $
+ * $Id: keydb_pg.c,v 1.13 2003/09/30 20:40:11 noodles Exp $
*/
#include <postgresql/libpq-fe.h>
*/
#include <postgresql/libpq-fe.h>
"Can't open large object.");
} else {
read_openpgp_stream(keydb_fetchchar, &fd,
"Can't open large object.");
} else {
read_openpgp_stream(keydb_fetchchar, &fd,
parse_keys(packets, publickey);
lo_close(dbconn, fd);
free_packet_list(packets);
parse_keys(packets, publickey);
lo_close(dbconn, fd);
free_packet_list(packets);
void *ctx = NULL;
fputs("Doing read_openpgp_stream():\n", stderr);
void *ctx = NULL;
fputs("Doing read_openpgp_stream():\n", stderr);
- read_openpgp_stream(getnextchar, ctx, &packets);
+ read_openpgp_stream(getnextchar, ctx, &packets, 0);
*/
fputs("Doing dearmor_openpgp_stream():\n", stderr);
dearmor_openpgp_stream(getnextchar, NULL, &packets);
*/
fputs("Doing dearmor_openpgp_stream():\n", stderr);
dearmor_openpgp_stream(getnextchar, NULL, &packets);
*
* Copyright 2002 Project Purple
*
*
* Copyright 2002 Project Purple
*
- * $Id: onak.c,v 1.16 2003/09/30 17:15:39 noodles Exp $
+ * $Id: onak.c,v 1.17 2003/09/30 20:40:11 noodles Exp $
} else if (!strcmp("add", argv[optind])) {
if (binary) {
result = read_openpgp_stream(stdin_getchar, NULL,
} else if (!strcmp("add", argv[optind])) {
if (binary) {
result = read_openpgp_stream(stdin_getchar, NULL,
logthing(LOGTHING_INFO,
"read_openpgp_stream: %d", result);
} else {
logthing(LOGTHING_INFO,
"read_openpgp_stream: %d", result);
} else {
*
* Copyright 2002 Project Purple
*
*
* Copyright 2002 Project Purple
*
- * $Id: parsekey.c,v 1.12 2003/09/30 17:40:41 noodles Exp $
+ * $Id: parsekey.c,v 1.13 2003/09/30 20:40:11 noodles Exp $
* @getchar_func: The function to get the next character from the stream.
* @ctx: A pointer to the context structure for getchar_func.
* @packets: The outputted list of packets.
* @getchar_func: The function to get the next character from the stream.
* @ctx: A pointer to the context structure for getchar_func.
* @packets: The outputted list of packets.
+ * @maxnum: The maximum number of keys to read. 0 means unlimited.
*
* This function uses getchar_func to read characters from an OpenPGP
* packet stream and reads the packets into a linked list of packets
*
* This function uses getchar_func to read characters from an OpenPGP
* packet stream and reads the packets into a linked list of packets
int read_openpgp_stream(int (*getchar_func)(void *ctx, size_t count,
unsigned char *c),
void *ctx,
int read_openpgp_stream(int (*getchar_func)(void *ctx, size_t count,
unsigned char *c),
void *ctx,
- struct openpgp_packet_list **packets)
+ struct openpgp_packet_list **packets,
+ int maxnum)
{
unsigned char curchar = 0;
unsigned long count = 0;
struct openpgp_packet_list *curpacket = NULL;
int rc = 0;
{
unsigned char curchar = 0;
unsigned long count = 0;
struct openpgp_packet_list *curpacket = NULL;
int rc = 0;
bool inpacket = false;
assert(packets != NULL);
bool inpacket = false;
assert(packets != NULL);
- while (!rc && !getchar_func(ctx, 1, &curchar)) {
+ while (!rc && !getchar_func(ctx, 1, &curchar) &&
+ (maxnum == 0 || keys < maxnum)) {
if (!inpacket && (curchar & 0x80)) {
/*
* New packet. Record the fact we're in a packet and
if (!inpacket && (curchar & 0x80)) {
/*
* New packet. Record the fact we're in a packet and
+ if (curpacket->packet->tag == 6) {
+ keys++;
+ }
curpacket->packet->data =
malloc(curpacket->packet->length *
sizeof(unsigned char));
curpacket->packet->data =
malloc(curpacket->packet->length *
sizeof(unsigned char));
*
* Copyright 2002 Project Purple
*
*
* Copyright 2002 Project Purple
*
- * $Id: parsekey.h,v 1.4 2003/06/04 20:57:12 noodles Exp $
+ * $Id: parsekey.h,v 1.5 2003/09/30 20:40:11 noodles Exp $
*/
#ifndef __PARSEKEY_H__
*/
#ifndef __PARSEKEY_H__
* @getchar_func: The function to get the next character from the stream.
* @ctx: A pointer to the context structure for getchar_func.
* @packets: The outputted list of packets.
* @getchar_func: The function to get the next character from the stream.
* @ctx: A pointer to the context structure for getchar_func.
* @packets: The outputted list of packets.
+ * @maxnum: The maximum number of keys to read. 0 means unlimited.
*
* This function uses getchar_func to read characters from an OpenPGP
* packet stream and reads the packets into a linked list of packets
*
* This function uses getchar_func to read characters from an OpenPGP
* packet stream and reads the packets into a linked list of packets
- * ready for parsing as a public key or whatever.
+ * ready for parsing as a public key or whatever. maxnum allows you to
+ * specify the maximum number of keys to read. Note that if this is used
+ * then only the public key component of the last key will be returned,
+ * none of the other packets of the key will be read.
*/
int read_openpgp_stream(int (*getchar_func)(void *ctx, size_t count,
unsigned char *c),
void *ctx,
*/
int read_openpgp_stream(int (*getchar_func)(void *ctx, size_t count,
unsigned char *c),
void *ctx,
- struct openpgp_packet_list **packets);
+ struct openpgp_packet_list **packets,
+ int maxnum);
/**
* write_openpgp_stream - Reads a stream of OpenPGP packets.
/**
* write_openpgp_stream - Reads a stream of OpenPGP packets.