return uids;
}
+
+/**
+ * keysubkeys - Takes a key and returns an array of its subkey keyids.
+ * @key: The key to get the subkeys of.
+ *
+ * keysubkeys takes a public key structure and returns an array of the
+ * subkey keyids for that key.
+ */
+uint64_t *keysubkeys(struct openpgp_publickey *key)
+{
+ struct openpgp_signedpacket_list *cursubkey = NULL;
+ uint64_t *subkeys = NULL;
+ int count = 0;
+
+ if (key != NULL && key->subkeys != NULL) {
+ subkeys = malloc((spsize(key->subkeys) + 1) *
+ sizeof (uint64_t));
+ cursubkey = key->subkeys;
+ while (cursubkey != NULL) {
+ subkeys[count++] = get_packetid(cursubkey->packet);
+ cursubkey = cursubkey -> next;
+ }
+ subkeys[count] = NULL;
+ }
+
+ return subkeys;
+}
*/
char **keyuids(struct openpgp_publickey *key, char **primary);
+/**
+ * keysubkeys - Takes a key and returns an array of its subkey keyids.
+ * @key: The key to get the subkeys of.
+ *
+ * keysubkeys takes a public key structure and returns an array of the
+ * subkey keyids for that key.
+ */
+uint64_t *keysubkeys(struct openpgp_publickey *key);
+
#endif
DBT data;
uint64_t keyid = 0;
uint32_t shortkeyid = 0;
+ uint64_t *subkeyids = NULL;
char **uids = NULL;
char *primary = NULL;
unsigned char worddb_data[12];
}
}
+ if (!deadlock) {
+ subkeyids = keysubkeys(publickey);
+ i = 0;
+ while (subkeyids != NULL && subkeyids[i] != 0) {
+ shortkeyid = subkeyids[i++] & 0xFFFFFFFF;
+
+ memset(&key, 0, sizeof(key));
+ memset(&data, 0, sizeof(data));
+ key.data = &shortkeyid;
+ key.size = sizeof(shortkeyid);
+ data.data = &keyid;
+ data.size = sizeof(keyid);
+
+ ret = id32db->put(id32db,
+ txn,
+ &key,
+ &data,
+ 0);
+ if (ret != 0) {
+ logthing(LOGTHING_ERROR,
+ "Problem storing short keyid: %s",
+ db_strerror(ret));
+ if (ret == DB_LOCK_DEADLOCK) {
+ deadlock = true;
+ }
+ }
+ }
+ if (subkeyids != NULL) {
+ free(subkeyids);
+ subkeyids = NULL;
+ }
+ }
+
return deadlock ? -1 : 0 ;
}
DBT key, data;
DBC *cursor = NULL;
uint32_t shortkeyid = 0;
+ uint64_t *subkeyids = NULL;
int ret = 0;
int i;
char **uids = NULL;
deadlock = true;
}
}
+
+ subkeyids = keysubkeys(publickey);
+ i = 0;
+ while (subkeyids != NULL && subkeyids[i] != 0) {
+ shortkeyid = subkeyids[i++] & 0xFFFFFFFF;
+
+ memset(&key, 0, sizeof(key));
+ memset(&data, 0, sizeof(data));
+ key.data = &shortkeyid;
+ key.size = sizeof(shortkeyid);
+ data.data = &keyid;
+ data.size = sizeof(keyid);
+
+ ret = cursor->c_get(cursor,
+ &key,
+ &data,
+ DB_GET_BOTH);
+
+ if (ret == 0) {
+ ret = cursor->c_del(cursor, 0);
+ if (ret != 0) {
+ logthing(LOGTHING_ERROR,
+ "Problem deleting short"
+ " keyid: %s",
+ db_strerror(ret));
+ }
+ }
+
+ if (ret != 0) {
+ logthing(LOGTHING_ERROR,
+ "Problem deleting short keyid: %s",
+ db_strerror(ret));
+ if (ret == DB_LOCK_DEADLOCK) {
+ deadlock = true;
+ }
+ }
+ }
+ if (subkeyids != NULL) {
+ free(subkeyids);
+ subkeyids = NULL;
+ }
+
ret = cursor->c_close(cursor);
cursor = NULL;
}