From 62078c1601192c2594b954a122ac44a0c319c9bd Mon Sep 17 00:00:00 2001
From: Jonathan McDowell <noodles@earth.li>
Date: Mon, 31 May 2004 23:47:07 +0000
Subject: [PATCH] cscvs to tla changeset 27 Author: noodles Date: 2002/11/11
 14:15:54 Pull out some common fetch/putchar functions into charfuncs.c

---
 Makefile     | 22 +++++++-------
 add.c        | 25 +++-------------
 charfuncs.c  | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 charfuncs.h  | 57 ++++++++++++++++++++++++++++++++++++
 keydb_db2.c  | 39 ++-----------------------
 keydb_db3.c  | 60 ++++----------------------------------
 keydb_file.c | 21 ++------------
 7 files changed, 164 insertions(+), 141 deletions(-)
 create mode 100644 charfuncs.c
 create mode 100644 charfuncs.h

diff --git a/Makefile b/Makefile
index 4eb0ad7..2d6cfee 100644
--- a/Makefile
+++ b/Makefile
@@ -11,10 +11,10 @@ LIBS = -L/usr/local/lib -ldb3
 
 PROGS = add lookup gpgwww onak
 OBJS = armor.o parsekey.o keydb_$(DBTYPE).o merge.o keyid.o md5.o sha.o \
-	getcgi.o keyindex.o mem.o stats.o ll.o hash.o onak-conf.o
+	getcgi.o keyindex.o mem.o stats.o ll.o hash.o onak-conf.o charfuncs.o
 SRCS = armor.c parsekey.c merge.c keyid.c md5.c sha.c main.c getcgi.c stats.c \
 	keyindex.c mem.c lookup.c add.c keydb_$(DBTYPE).c ll.c hash.c \
-	gpgwww.c onak-conf.c
+	gpgwww.c onak-conf.c charfuncs.c
 
 all: $(PROGS) testparse maxpath
 
@@ -28,22 +28,22 @@ gpgwww: gpgwww.o $(OBJS)
 	$(CC) -o gpgwww gpgwww.o $(OBJS) $(LIBS)
 
 lookup: lookup.o getcgi.o keyindex.o keydb_$(DBTYPE).o keyid.o sha.o \
-		parsekey.o mem.o armor.o ll.o hash.o onak-conf.o
+		parsekey.o mem.o armor.o ll.o hash.o onak-conf.o charfuncs.o
 	$(CC) -o lookup lookup.o getcgi.o keyindex.o keydb_$(DBTYPE).o keyid.o \
-		sha.o parsekey.o mem.o armor.o ll.o hash.o onak-conf.o $(LIBS)
+		sha.o parsekey.o mem.o armor.o ll.o hash.o onak-conf.o \
+		charfuncs.o $(LIBS)
 
 add: add.o getcgi.o armor.o parsekey.o keydb_$(DBTYPE).o keyid.o sha.o mem.o \
-		keyindex.o ll.o hash.o merge.o onak-conf.o
+		keyindex.o ll.o hash.o merge.o onak-conf.o charfuncs.o
 	$(CC) -o add add.o getcgi.o armor.o parsekey.o keydb_$(DBTYPE).o \
 		keyid.o sha.o mem.o keyindex.o ll.o hash.o merge.o onak-conf.o \
-		$(LIBS)
+		charfuncs.o $(LIBS)
 
-onak: onak.o merge.o keyid.o sha.o armor.o parsekey.o ll.o \
+onak: onak.o merge.o keyid.o sha.o armor.o parsekey.o ll.o charfuncs.o \
 		keydb_$(DBTYPE).o mem.o keyindex.o hash.o getcgi.o onak-conf.o
-	$(CC) $(LDFLAGS) -o onak onak.o merge.o keyid.o sha.o armor.o parsekey.o \
-		keydb_$(DBTYPE).o mem.o keyindex.o ll.o hash.o getcgi.o \
-		onak-conf.o $(LIBS)
-
+	$(CC) $(LDFLAGS) -o onak onak.o merge.o keyid.o sha.o armor.o \
+		parsekey.o keydb_$(DBTYPE).o mem.o keyindex.o ll.o hash.o \
+		getcgi.o charfuncs.o onak-conf.o $(LIBS)
 
 clean:
 	rm -f $(PROGS) $(OBJS) Makefile.bak testparse maxpath *.core core \
diff --git a/add.c b/add.c
index 95f2189..80afadd 100644
--- a/add.c
+++ b/add.c
@@ -12,37 +12,19 @@
 #include <string.h>
 
 #include "armor.h"
+#include "charfuncs.h"
 #include "getcgi.h"
 #include "keydb.h"
 #include "keystructs.h"
 #include "parsekey.h"
 #include "merge.h"
 
-struct cgi_get_ctx {
-	char *buffer;
-	int offset;
-};
-
-
-int cgi_getchar(void *ctx, size_t count, unsigned char *c)
-{
-	struct cgi_get_ctx *buf = NULL;
-
-	buf = (struct cgi_get_ctx *) ctx;
-
-	while (count-- > 0 && *c != 0) {
-		*c = buf->buffer[buf->offset++];
-	}
-
-	return (*c == 0);
-}
-
 int main(int argc, char *argv[])
 {
 	struct openpgp_packet_list *packets = NULL;
 	struct openpgp_publickey *keys = NULL;
 	char **params = NULL;
-	struct cgi_get_ctx ctx;
+	struct buffer_ctx ctx;
 	int i;
 
 	memset(&ctx, 0, sizeof(ctx));
@@ -51,6 +33,7 @@ int main(int argc, char *argv[])
 	for (i = 0; params != NULL && params[i] != NULL; i += 2) {
 		if (!strcmp(params[i], "keytext")) {
 			ctx.buffer = params[i+1];
+			ctx.size = strlen(ctx.buffer);
 		} else {
 			free(params[i+1]);
 		}
@@ -67,7 +50,7 @@ int main(int argc, char *argv[])
 	if (ctx.buffer == NULL) {
 		puts("Error: No keytext to add supplied.");
 	} else {
-		dearmor_openpgp_stream(cgi_getchar,
+		dearmor_openpgp_stream(buffer_fetchchar,
 					&ctx,
 					&packets);
 		if (packets != NULL) {
diff --git a/charfuncs.c b/charfuncs.c
new file mode 100644
index 0000000..de68b66
--- /dev/null
+++ b/charfuncs.c
@@ -0,0 +1,81 @@
+/*
+ * charfuncs.c - Routines for dealing with character streams.
+ *
+ * Jonathan McDowell <noodles@earth.li>
+ *
+ * Copyright 2002 Project Purple
+ */
+
+#include <sys/types.h>
+#include <sys/uio.h>
+#include <unistd.h>
+
+#include "charfuncs.h"
+
+/**
+ *	buffer_fetchchar - Fetches a char from a buffer.
+ *	@ctx: Our buffer context structure.
+ *	@count: The number of characters to get from the buffer.
+ *	@c: Where to put the characters retrieved.
+ */
+int buffer_fetchchar(void *ctx, size_t count, unsigned char *c)
+{
+	struct buffer_ctx *buf = NULL;
+	int i;
+	
+	buf = (struct buffer_ctx *) ctx;
+	for (i = 0; i < count; i++) {
+		c[i] = buf->buffer[buf->offset++];
+	}
+
+	return (((buf->offset) == (buf->size)) ? 1 : 0);
+}
+
+/**
+ *	buffer_putchar - Puts a char to a buffer.
+ *	@ctx: Our buffer context structure.
+ *	@count: The number of characters to put into the buffer.
+ *	@c: The characters to add to the buffer.
+ *
+ *	Adds characters to the buffer references by the buffer context. If we
+ *	fill it then we double the size of the current buffer and then add the
+ *	rest.
+ */
+int buffer_putchar(void *ctx, size_t count, unsigned char *c)
+{
+	struct buffer_ctx *buf = NULL;
+	size_t newsize = 0;
+	int i;
+	
+	buf = (struct buffer_ctx *) ctx;
+
+	for (newsize = buf->size; newsize < (buf->offset + count);
+			newsize *= 2) ;
+
+	if (newsize != buf->size) {
+		buf->buffer = realloc(buf->buffer, newsize);
+		buf->size = newsize;
+	}
+	
+	for (i = 0; i < count; i++) {
+		buf->buffer[buf->offset++] = c[i];
+	}
+
+	return 1;
+}
+
+/**
+ *	file_fetchchar - Fetches a char from a file.
+ */
+int file_fetchchar(void *fd, size_t count, unsigned char *c)
+{
+	return !(read( *(int *) fd, c, count));
+}
+
+/**
+ *	file_putchar - Puts a char to a file.
+ */
+int file_putchar(void *fd, size_t count, unsigned char *c)
+{
+	return !(write( *(int *) fd, c, count));
+}
diff --git a/charfuncs.h b/charfuncs.h
new file mode 100644
index 0000000..f394e15
--- /dev/null
+++ b/charfuncs.h
@@ -0,0 +1,57 @@
+/*
+ * charfuncs.h - Routines for dealing with character streams.
+ *
+ * Jonathan McDowell <noodles@earth.li>
+ *
+ * Copyright 2002 Project Purple
+ */
+
+#ifndef __CHARFUNCS_H__
+#define __CHARFUNCS_H__
+
+#include <stdlib.h>
+
+/**
+ *	buffer_ctx - Shared with CGI buffer stuff...
+ *	@buffer: The data buffer.
+ *	@offset: Our current position in the buffer.
+ *	@size: The size of the data buffer.
+ */
+struct buffer_ctx {
+	char *buffer;
+	int offset;
+	int size;
+};
+
+/**
+ *	buffer_fetchchar - Fetches a char from a buffer.
+ *	@ctx: Our buffer context structure.
+ *	@count: The number of characters to get from the buffer.
+ *	@c: Where to put the characters retrieved.
+ */
+int buffer_fetchchar(void *ctx, size_t count, unsigned char *c);
+
+/**
+ *	buffer_putchar - Puts a char to a buffer.
+ *	@ctx: Our buffer context structure.
+ *	@count: The number of characters to put into the buffer.
+ *	@c: The characters to add to the buffer.
+ *
+ *	Adds characters to the buffer references by the buffer context. If we
+ *	fill it then we double the size of the current buffer and then add the
+ *	rest.
+ */
+int buffer_putchar(void *ctx, size_t count, unsigned char *c);
+
+/**
+ *	file_fetchchar - Fetches a char from a file.
+ */
+int file_fetchchar(void *fd, size_t count, unsigned char *c);
+
+/**
+ *	file_putchar - Puts a char to a file.
+ */
+int file_putchar(void *fd, size_t count, unsigned char *c);
+
+
+#endif /* __CHARFUNCS_H__ */
diff --git a/keydb_db2.c b/keydb_db2.c
index 3d66c5a..a30b62c 100644
--- a/keydb_db2.c
+++ b/keydb_db2.c
@@ -16,6 +16,7 @@
 #include <string.h>
 #include <unistd.h>
 
+#include "charfuncs.h"
 #include "keydb.h"
 #include "keyid.h"
 #include "keyindex.h"
@@ -41,40 +42,6 @@ static DB **db2_keydbfiles = NULL;
  */
 static DB_ENV db2_env;
 
-/*
- * Shared with CGI buffer stuff...
- */
-struct db2_get_ctx {
-	char *buffer;
-	int offset;
-	int size;
-};
-
-/**
- *	keydb_fetchchar - Fetches a char from a buffer.
- */
-int keydb_fetchchar(void *ctx, int count, unsigned char *c)
-{
-	struct db2_get_ctx *buf = NULL;
-	int i;
-	
-	buf = (struct db2_get_ctx *) ctx;
-	for (i = 0; i < count; i++) {
-		c[i] = buf->buffer[buf->offset++];
-	}
-
-	return (((buf->offset) == (buf->size)) ? 1 : 0);
-}
-
-/**
- *	keydb_putchar - Puts a char to a file.
- */
-static int keydb_putchar(void *fd, unsigned char c)
-{
-//	return !(lo_write(dbconn, *(int *) fd, &c, sizeof(c)));
-	return 1;
-}
-
 DB *keydb(DBT *key)
 {
 	/*
@@ -196,7 +163,7 @@ int fetch_key(uint64_t keyid, struct openpgp_publickey **publickey,
 	int ret;
 	DBT key, data;
 	char id[KEYDB_KEYID_BYTES];
-	struct db2_get_ctx fetchbuf;
+	struct buffer_ctx fetchbuf;
 
 	memset(&key, 0, sizeof(key));
 	memset(&data, 0, sizeof(data));
@@ -214,7 +181,7 @@ int fetch_key(uint64_t keyid, struct openpgp_publickey **publickey,
 		fetchbuf.buffer = data.data;
 		fetchbuf.offset = 0;
 		fetchbuf.size = data.size;
-		read_openpgp_stream(keydb_fetchchar, &fetchbuf, &packets);
+		read_openpgp_stream(buffer_fetchchar, &fetchbuf, &packets);
 		parse_keys(packets, publickey);
 	}
 
diff --git a/keydb_db3.c b/keydb_db3.c
index 263397a..5224b52 100644
--- a/keydb_db3.c
+++ b/keydb_db3.c
@@ -18,6 +18,7 @@
 
 #include <db.h>
 
+#include "charfuncs.h"
 #include "keydb.h"
 #include "keyid.h"
 #include "keyindex.h"
@@ -36,57 +37,6 @@ static DB *dbconn = NULL;
  */
 static DB *worddb = NULL;
 
-/**
- *	db3_get_ctx - Shared with CGI buffer stuff...
- */
-struct db3_get_ctx {
-	char *buffer;
-	int offset;
-	int size;
-};
-
-/**
- *	keydb_fetchchar - Fetches a char from a file.
- */
-static int keydb_fetchchar(void *ctx, size_t count, unsigned char *c)
-{
-	struct db3_get_ctx *buf = NULL;
-	int i;
-	
-	buf = (struct db3_get_ctx *) ctx;
-	for (i = 0; i < count; i++) {
-		c[i] = buf->buffer[buf->offset++];
-	}
-
-	return (((buf->offset) == (buf->size)) ? 1 : 0);
-}
-
-/**
- *	keydb_putchar - Puts a char to a file.
- */
-static int keydb_putchar(void *ctx, size_t count, unsigned char *c)
-{
-	struct db3_get_ctx *buf = NULL;
-	size_t newsize = 0;
-	int i;
-	
-	buf = (struct db3_get_ctx *) ctx;
-
-	for (newsize = buf->size; newsize < (buf->offset + count);
-			newsize *= 2) ;
-
-	if (newsize != buf->size) {
-		buf->buffer = realloc(buf->buffer, newsize);
-		buf->size = newsize;
-	}
-	
-	for (i = 0; i < count; i++) {
-		buf->buffer[buf->offset++] = c[i];
-	}
-
-	return 1;
-}
-
 /**
  *	makewordlist - Takes a string and splits it into a set of unique words.
  *	@wordlist: The current word list.
@@ -242,7 +192,7 @@ int fetch_key(uint64_t keyid, struct openpgp_publickey **publickey,
 	DBT key, data;
 	int ret = 0;
 	int numkeys = 0;
-	struct db3_get_ctx fetchbuf;
+	struct buffer_ctx fetchbuf;
 
 	memset(&key, 0, sizeof(key));
 	memset(&data, 0, sizeof(data));
@@ -264,7 +214,7 @@ int fetch_key(uint64_t keyid, struct openpgp_publickey **publickey,
 		fetchbuf.buffer = data.data;
 		fetchbuf.offset = 0;
 		fetchbuf.size = data.size;
-		read_openpgp_stream(keydb_fetchchar, &fetchbuf,
+		read_openpgp_stream(buffer_fetchchar, &fetchbuf,
 				&packets);
 		parse_keys(packets, publickey);
 		numkeys++;
@@ -347,7 +297,7 @@ int store_key(struct openpgp_publickey *publickey, bool intrans, bool update)
 	struct     openpgp_publickey *next = NULL;
 	int        ret = 0;
 	int        i = 0;
-	struct     db3_get_ctx storebuf;
+	struct     buffer_ctx storebuf;
 	DBT        key;
 	DBT        data;
 	uint64_t   keyid = 0;
@@ -383,7 +333,7 @@ int store_key(struct openpgp_publickey *publickey, bool intrans, bool update)
 	storebuf.size = 8192;
 	storebuf.buffer = malloc(8192);
 	
-	write_openpgp_stream(keydb_putchar, &storebuf, packets);
+	write_openpgp_stream(buffer_putchar, &storebuf, packets);
 
 	/*
 	 * Now we have the key data store it in the DB; the keyid is the key.
diff --git a/keydb_file.c b/keydb_file.c
index 243e59e..ba8dc2e 100644
--- a/keydb_file.c
+++ b/keydb_file.c
@@ -15,6 +15,7 @@
 #include <string.h>
 #include <unistd.h>
 
+#include "charfuncs.h"
 #include "keydb.h"
 #include "keyid.h"
 #include "keystructs.h"
@@ -23,22 +24,6 @@
 #include "onak-conf.h"
 #include "parsekey.h"
 
-/**
- *	keydb_fetchchar - Fetches a char from a file.
- */
-static int keydb_fetchchar(void *fd, size_t count, unsigned char *c)
-{
-	return !(read( *(int *) fd, c, count));
-}
-
-/**
- *	keydb_putchar - Puts a char to a file.
- */
-static int keydb_putchar(void *fd, size_t count, unsigned char *c)
-{
-	return !(write( *(int *) fd, c, count));
-}
-
 /**
  *	initdb - Initialize the key database.
  *
@@ -101,7 +86,7 @@ int fetch_key(uint64_t keyid, struct openpgp_publickey **publickey,
 	fd = open(keyfile, O_RDONLY); // | O_SHLOCK);
 
 	if (fd > -1) {
-		read_openpgp_stream(keydb_fetchchar, &fd, &packets);
+		read_openpgp_stream(file_fetchchar, &fd, &packets);
 		parse_keys(packets, publickey);
 		close(fd);
 	}
@@ -138,7 +123,7 @@ int store_key(struct openpgp_publickey *publickey, bool intrans, bool update)
 		flatten_publickey(publickey, &packets, &list_end);
 		publickey -> next = next;
 		
-		write_openpgp_stream(keydb_putchar, &fd, packets);
+		write_openpgp_stream(file_putchar, &fd, packets);
 		close(fd);
 	}
 
-- 
2.39.5