compare_packet is potentially useful elsewhere, but rather than a
true/false comparison provide -1/0/1 for less than/equal/greater
than, as memcmp does.
* @a: The first packet to compare.
* @b: The second packet to compare.
*
* @a: The first packet to compare.
* @b: The second packet to compare.
*
- * Takes 2 packets and returns true if they are the same and false
- * otherwise.
+ * Takes 2 packets and returns 0 if they are the same, -1 if a is
+ * less than b, or 1 if a is greater than b.
-bool compare_packets(struct openpgp_packet *a, struct openpgp_packet *b)
+int compare_packets(struct openpgp_packet *a, struct openpgp_packet *b)
- return (a->tag == b->tag && a->length == b->length &&
- !memcmp(a->data, b->data, b->length));
+ int ret, len;
+
+ if (a->tag > b->tag) {
+ ret = 1;
+ } else if (b->tag > a->tag) {
+ ret = -1;
+ } else {
+ len = (a->length < b->length) ? a->length : b->length;
+ ret = memcmp(a->data, b->data, len);
+ if (ret == 0 && a->length != b->length) {
+ ret = (a->length < b->length) ? -1 : 1;
+ }
+ }
+
+ return ret;
bool found = false;
while (!found && packet_list != NULL) {
bool found = false;
while (!found && packet_list != NULL) {
- if (compare_packets(packet_list->packet, packet)) {
+ if (compare_packets(packet_list->packet, packet) == 0) {
found = true;
}
packet_list = packet_list -> next;
found = true;
}
packet_list = packet_list -> next;
struct openpgp_signedpacket_list *found = NULL;
while (found == NULL && packet_list != NULL) {
struct openpgp_signedpacket_list *found = NULL;
while (found == NULL && packet_list != NULL) {
- if (compare_packets(packet_list->packet, packet)) {
+ if (compare_packets(packet_list->packet, packet) == 0) {
found = packet_list;
}
packet_list = packet_list -> next;
found = packet_list;
}
packet_list = packet_list -> next;
bool found = false;
for (cur = *packet_list; !found && (cur != NULL); cur = cur->next) {
bool found = false;
for (cur = *packet_list; !found && (cur != NULL); cur = cur->next) {
- if (compare_packets(cur->packet, packet)) {
+ if (compare_packets(cur->packet, packet) == 0) {
found = true;
if (prev == NULL) {
*packet_list = cur->next;
found = true;
if (prev == NULL) {
*packet_list = cur->next;
struct openpgp_packet_list *curpacket = NULL;
struct openpgp_packet_list *nextpacket = NULL;
struct openpgp_packet_list *curpacket = NULL;
struct openpgp_packet_list *nextpacket = NULL;
- log_assert(compare_packets(old->packet, new->packet));
+ log_assert(compare_packets(old->packet, new->packet) == 0);
curpacket = new->sigs;
while (curpacket != NULL) {
curpacket = new->sigs;
while (curpacket != NULL) {
+/**
+ * compare_packets - Check to see if 2 OpenPGP packets are the same.
+ * @a: The first packet to compare.
+ * @b: The second packet to compare.
+ *
+ * Takes 2 packets and returns 0 if they are the same, -1 if a is
+ * less than b, or 1 if a is greater than b.
+ */
+int compare_packets(struct openpgp_packet *a, struct openpgp_packet *b);
+
/**
* merge_keys - Takes 2 public keys and merges them.
* @a: The old key. The merged key is returned in this structure.
/**
* merge_keys - Takes 2 public keys and merges them.
* @a: The old key. The merged key is returned in this structure.