From: Jonathan McDowell <noodles@earth.li>
Date: Mon, 31 May 2004 23:48:25 +0000 (+0000)
Subject: cscvs to tla changeset 133
X-Git-Url: https://git.sommitrealweird.co.uk/onak.git/commitdiff_plain/b3e534f945ae56605bc5309e7c5af020c797a69b?ds=inline;hp=ec10586ae774074490665d5baeef8488861904ee

cscvs to tla changeset 133
Author: noodles
Date: 2004/05/27 21:58:18
Change getphoto over to returning the JPEG data rather than the OpenPGP packet.
---

diff --git a/lookup.c b/lookup.c
index 5d638ea..123ec5f 100644
--- a/lookup.c
+++ b/lookup.c
@@ -5,7 +5,7 @@
  *
  * Copyright 2002 Project Purple
  *
- * $Id: lookup.c,v 1.15 2004/05/27 01:25:37 noodles Exp $
+ * $Id: lookup.c,v 1.16 2004/05/27 21:58:18 noodles Exp $
  */
 
 #include <inttypes.h>
@@ -160,7 +160,7 @@ int main(int argc, char *argv[])
 		initdb(true);
 		switch (op) {
 		case OP_GET:
-			logthing(LOGTHING_NOTICE, "Getting keyid %llX",
+			logthing(LOGTHING_NOTICE, "Getting keyid 0x%llX",
 					keyid);
 			if (fetch_key(keyid, &publickey, false)) {
 				puts("<pre>");
@@ -172,6 +172,8 @@ int main(int argc, char *argv[])
 						packets);
 				puts("</pre>");
 			} else {
+				logthing(LOGTHING_NOTICE,
+					"Failed to fetch key.");
 				puts("Key not found");
 			}
 			break;
@@ -185,12 +187,13 @@ int main(int argc, char *argv[])
 			break;
 		case OP_PHOTO:
 			if (fetch_key(keyid, &publickey, false)) {
-				struct openpgp_packet *photo = NULL;
-				photo = getphoto(publickey, 0);
-				if (photo != NULL) {
-					fwrite(photo->data+19,
+				unsigned char *photo = NULL;
+				size_t         length = 0;
+
+				if (getphoto(publickey, 0, &photo, &length)) {
+					fwrite(photo,
 							1,
-							(photo->length - 19),
+							length,
 							stdout);
 				}
 				free_publickey(publickey);
diff --git a/onak.c b/onak.c
index 3a4c4e8..2a0376e 100644
--- a/onak.c
+++ b/onak.c
@@ -7,7 +7,7 @@
  * 
  * Copyright 2002 Project Purple
  *
- * $Id: onak.c,v 1.20 2004/05/27 01:25:37 noodles Exp $
+ * $Id: onak.c,v 1.21 2004/05/27 21:58:18 noodles Exp $
  */
 
 #include <stdio.h>
@@ -179,16 +179,14 @@ int main(int argc, char *argv[])
 				puts("Can't get a key on uid text."
 					" You must supply a keyid.");
 			} else if (fetch_key(keyid, &keys, false)) {
-				struct openpgp_packet *photo = NULL;
-				FILE *photof = NULL;
-				photo = getphoto(keys, 0);
-				if (photo != NULL) {
-					photof = fopen("keyphoto.jpg", "w");
-					fwrite(photo->data+19,
-							1,
-							(photo->length - 19),
-							photof);
-					fclose(photof);
+				unsigned char *photo = NULL;
+				size_t         length = 0;
+
+				if (getphoto(keys, 0, &photo, &length)) {
+					fwrite(photo,
+						1,
+						length,
+						stdout);
 				}
 				free_publickey(keys);
 				keys = NULL;
diff --git a/photoid.c b/photoid.c
index 4416e3e..8da62ce 100644
--- a/photoid.c
+++ b/photoid.c
@@ -5,7 +5,7 @@
  *
  * Copyright 2004 Project Purple
  *
- * $Id: photoid.c,v 1.1 2004/05/27 01:25:37 noodles Exp $
+ * $Id: photoid.c,v 1.2 2004/05/27 21:58:18 noodles Exp $
  */
 
 #include <assert.h>
@@ -17,30 +17,62 @@
 #include "keyid.h"
 #include "keyindex.h"
 #include "keystructs.h"
+#include "log.h"
+#include "photoid.h"
 
 /**
  * 	getphoto - returns an OpenPGP packet containing a photo id.
  * 	@key: The key to return the photo id from.
  * 	@index: The index of the photo to return.
+ * 	@photo: The photo data.
+ * 	@length: The length of the photo data.
  *
- * 	This function returns the OpenPGP packet containing a photo id from a
- * 	supplied key. index specifies which photo id should be returned. If
- * 	there's no such photo id NULL is returned.
+ * 	This function returns the photo data contained in a supplied key.
+ * 	index specifies which photo id should be returned. If there's no such
+ * 	photo id NULL is returned. The returned data pointer refers to the key
+ * 	data supplied rather than a copy of it.
  */
-struct openpgp_packet *getphoto(struct openpgp_publickey *key, int index)
+int getphoto(struct openpgp_publickey *key, int index, unsigned char **photo,
+		size_t *length)
 {
 	struct openpgp_signedpacket_list *curuid = NULL;
-	struct openpgp_packet            *photo = NULL;
 	int                               i = 0;
+	int                               j = 0;
 
 	assert(key != NULL);
+	assert(photo != NULL);
+	assert(length != NULL);
 
+	*photo = NULL;
+	
 	curuid = key->uids;
 	i = 0;
-	while (photo == NULL && curuid != NULL && i <= index) {
+	while (*photo == NULL && curuid != NULL && i <= index) {
 		if (curuid->packet->tag == 17) {
 			if (i == index) {
-				photo = curuid->packet;
+				j = 0;
+				*length = curuid->packet->data[j++];
+				if (*length < 192) {
+					/* length is correct */
+				} else if (*length < 255) {
+					*length -= 192;
+					*length <<= 8;
+					*length += curuid->packet->data[j++];
+					*length +=  192;
+				} else {
+					*length = curuid->packet->data[j++];
+					*length <<= 8;
+					*length += curuid->packet->data[j++];
+					*length <<= 8;
+					*length += curuid->packet->data[j++];
+					*length <<= 8;
+					*length += curuid->packet->data[j++];
+				}
+				logthing(LOGTHING_DEBUG, "Got photo, size %d",
+						*length);
+				j++;
+				*length -= 17;
+				*photo = &(curuid->packet->data[j+16]);
 			} else {
 				i++;
 			}
@@ -48,5 +80,5 @@ struct openpgp_packet *getphoto(struct openpgp_publickey *key, int index)
 		curuid = curuid->next;
 	}
 
-	return photo;
+	return (*photo != NULL);
 }
diff --git a/photoid.h b/photoid.h
index 03bbf32..49b685e 100644
--- a/photoid.h
+++ b/photoid.h
@@ -5,7 +5,7 @@
  *
  * Copyright 2004 Project Purple
  *
- * $Id: photoid.h,v 1.1 2004/05/27 01:25:37 noodles Exp $
+ * $Id: photoid.h,v 1.2 2004/05/27 21:58:18 noodles Exp $
  */
 
 #ifndef __PHOTOID_H__
@@ -17,11 +17,15 @@
  * 	getphoto - returns an OpenPGP packet containing a photo id.
  * 	@key: The key to return the photo id from.
  * 	@index: The index of the photo to return.
+ * 	@photo: The photo data.
+ * 	@length: The length of the photo data.
  *
- * 	This function returns the OpenPGP packet containing a photo id from a
- * 	supplied key. index specifies which photo id should be returned. If
- * 	there's no such photo id NULL is returned.
+ * 	This function returns the photo data contained in a supplied key.
+ * 	index specifies which photo id should be returned. If there's no such
+ * 	photo id NULL is returned. The returned data pointer refers to the key
+ * 	data supplied rather than a copy of it.
  */
-struct openpgp_packet *getphoto(struct openpgp_publickey *key, int index);
+int getphoto(struct openpgp_publickey *key, int index, unsigned char **photo,
+		size_t *length);
 
 #endif /* __PHOTOID_H__ */