(uint8_t) ((hash >> 16) & 0xFF), hash, word);
}
-static void subkeypath(char *buffer, size_t length, uint64_t subkey,
- uint64_t keyid)
+static void subkeypath(char *buffer, size_t length, uint64_t subkey)
{
snprintf(buffer, length, "%s/subkeys/%02X/%02X/%08X/%016" PRIX64,
config.db_dir,
(uint8_t) ((subkey >> 24) & 0xFF),
(uint8_t) ((subkey >> 16) & 0xFF),
(uint32_t) (subkey & 0xFFFFFFFF),
- keyid);
+ subkey);
+}
+
+static void subkeydir(char *buffer, size_t length, uint64_t subkey)
+{
+ snprintf(buffer, length, "%s/subkeys/%02X/%02X/%08X",
+ config.db_dir,
+ (uint8_t) ((subkey >> 24) & 0xFF),
+ (uint8_t) ((subkey >> 16) & 0xFF),
+ (uint32_t) (subkey & 0xFFFFFFFF));
}
static void skshashpath(char *buffer, size_t length,
hash->hash[12], hash->hash[13], hash->hash[14],
hash->hash[15]);
}
-static void subkeydir(char *buffer, size_t length, uint64_t subkey)
-{
- snprintf(buffer, length, "%s/subkeys/%02X/%02X/%08X",
- config.db_dir,
- (uint8_t) ((subkey >> 24) & 0xFF),
- (uint8_t) ((subkey >> 16) & 0xFF),
- (uint32_t) (subkey & 0xFFFFFFFF));
-}
/*****************************************************************************/
keyid = fs_getfullkeyid(dbctx, keyid);
keypath(buffer, sizeof(buffer), keyid);
- if ((fd = open(buffer, O_RDONLY)) != -1) {
+ fd = open(buffer, O_RDONLY);
+ if (fd == -1 && errno == ENOENT) {
+ subkeypath(buffer, sizeof(buffer), keyid);
+ fd = open(buffer, O_RDONLY);
+ }
+
+ if (fd != -1) {
/* File is present, load it in... */
read_openpgp_stream(file_fetchchar, &fd, &packets, 0);
parse_keys(packets, publickey);
uint64_t keyid;
struct ll *wordlist = NULL, *wl = NULL;
struct skshash hash;
- uint64_t *subkeyids = NULL;
+ struct openpgp_fingerprint *subkeyids = NULL;
uint32_t hashid;
int i = 0;
subkeyids = keysubkeys(publickey);
i = 0;
- while (subkeyids != NULL && subkeyids[i] != 0) {
- prove_path_to(subkeyids[i], "subkeys");
+ while (subkeyids != NULL && subkeyids[i].length != 0) {
+ keyid = fingerprint2keyid(&subkeyids[i]);
+
+ prove_path_to(keyid, "subkeys");
- subkeydir(wbuffer, sizeof(wbuffer), subkeyids[i]);
+ subkeydir(wbuffer, sizeof(wbuffer), keyid);
mkdir(wbuffer, 0777);
- subkeypath(wbuffer, sizeof(wbuffer), subkeyids[i],
- keyid);
+ subkeypath(wbuffer, sizeof(wbuffer), keyid);
link(buffer, wbuffer);
i++;
struct openpgp_publickey *pk = NULL;
struct skshash hash;
struct ll *wordlist = NULL, *wl = NULL;
- uint64_t *subkeyids = NULL;
+ struct openpgp_fingerprint *subkeyids = NULL;
+ uint64_t subkeyid;
int i = 0;
if ((keyid >> 32) == 0)
subkeyids = keysubkeys(pk);
i = 0;
- while (subkeyids != NULL && subkeyids[i] != 0) {
- prove_path_to(subkeyids[i], "subkeys");
+ while (subkeyids != NULL && subkeyids[i].length != 0) {
+ subkeyid = fingerprint2keyid(&subkeyids[i]);
+ prove_path_to(subkeyid, "subkeys");
- subkeypath(buffer, sizeof(buffer), subkeyids[i],
- keyid);
+ subkeypath(buffer, sizeof(buffer), subkeyid);
unlink(buffer);
i++;
d = opendir(buffer);
logthing(LOGTHING_DEBUG, "Scanning for word %s in dir %s", word,
buffer);
- if (d)
+ if (d) {
do {
de = readdir(d);
if (de && de->d_name[0] != '.') {
}
}
} while (de);
- closedir(d);
+ closedir(d);
+ }
return keys;
}
mkdir(config.db_dir, 0777);
privctx->lockfile_fd = open(buffer, O_RDWR | O_CREAT, 0600);
}
- chdir(config.db_dir);
- if (privctx->lockfile_fd == -1)
- privctx->lockfile_fd = open(buffer,
- (privctx->lockfile_readonly) ?
- O_RDONLY : O_RDWR);
+ if (chdir(config.db_dir) == -1) {
+ /* Shouldn't happen after the above */
+ logthing(LOGTHING_CRITICAL,
+ "Couldn't change to database directory: %s",
+ strerror(errno));
+ free(dbctx->priv);
+ free(dbctx);
+ return NULL;
+ }
+ privctx->lockfile_fd = open(buffer,
+ (privctx->lockfile_readonly) ?
+ O_RDONLY : O_RDWR);
if (privctx->lockfile_fd == -1)
privctx->lockfile_fd = open(buffer, O_RDWR | O_CREAT, 0600);
if (privctx->lockfile_fd == -1) {