Add a couple of helper functions to check whether one of the default
names of SSH keys (as documented in ssh-keygen(1)) exists, and use them
to specify a key for the libssh2 transport if none was passed.
---
src/rpc/virnetclient.c | 61 +++++++++++++++++++++++++++++++++++++-------------
1 file changed, 46 insertions(+), 15 deletions(-)
diff --git a/src/rpc/virnetclient.c b/src/rpc/virnetclient.c
index 361dc1a..713b8d5 100644
--- a/src/rpc/virnetclient.c
+++ b/src/rpc/virnetclient.c
@@ -335,6 +335,51 @@ static virNetClientPtr virNetClientNew(virNetSocketPtr sock,
return NULL;
}
+/*
+ * Check whether the specified SSH key exists.
+ *
+ * Return -1 on error, 0 if it does not exist, and 1 if it does exist.
+ */
+static int
+virNetClientCheckKeyExists(const char *homedir,
+ const char *name,
+ char **retPath)
+{
+ char *path;
+
+ if (virAsprintf(&path, "%s/.ssh/%s", homedir, name) < 0)
+ return -1;
+
+ if (!(virFileExists(path))) {
+ VIR_FREE(path);
+ return 0;
+ }
+
+ *retPath = path;
+ return 1;
+}
+
+/*
+ * Detect the default SSH key, if existing.
+ *
+ * Return -1 on error, 0 if it does not exist, and 1 if it does exist.
+ */
+static int
+virNetClientFindDefaultSshKey(const char *homedir, char **retPath)
+{
+ size_t i;
+
+ const char *keys[] = { "identity", "id_dsa",
"id_ecdsa", "id_ed25519", "id_rsa" };
+
+ for (i = 0; i < ARRAY_CARDINALITY(keys); ++i) {
+ int ret = virNetClientCheckKeyExists(homedir, keys[i], retPath);
+ if (ret != 0)
+ return ret;
+ }
+
+ return 0;
+}
+
virNetClientPtr virNetClientNewUNIX(const char *path,
bool spawnDaemon,
@@ -426,22 +471,8 @@ virNetClientPtr virNetClientNewLibSSH2(const char *host,
if (homedir) {
if (!privkeyPath) {
- /* RSA */
- virBufferAsprintf(&buf, "%s/.ssh/id_rsa", homedir);
- if (!(privkey = virBufferContentAndReset(&buf)))
+ if (virNetClientFindDefaultSshKey(homedir, &privkey) < 0)
goto no_memory;
-
- if (!(virFileExists(privkey)))
- VIR_FREE(privkey);
- /* DSA */
- if (!privkey) {
- virBufferAsprintf(&buf, "%s/.ssh/id_dsa", homedir);
- if (!(privkey = virBufferContentAndReset(&buf)))
- goto no_memory;
-
- if (!(virFileExists(privkey)))
- VIR_FREE(privkey);
- }
} else {
if (VIR_STRDUP(privkey, privkeyPath) < 0)
goto cleanup;
--
2.7.4