[RFC][PATCH v2] Support a list of sockets on SSH_AUTH_SOCK
Fabiano Fidêncio
fidencio at redhat.com
Sat Sep 26 11:41:38 AEST 2015
The idea behind this change is to add support for different "ssh-agents"
being able to run at the same time. It does not change the current
behaviour of the ssh-agent (which will set SSH_AUTH_SOCK just for
itself). Neither does it change the behaviour of SSH_AGENT_PID (which
still supports only one pid).
The new implementation will go through the list of sockets (which are
separated by a colon (:)), and will return the very first functional
one. An example of the new supported syntax is:
SSH_AUTH_SOCK=/run/user/1000/spice/ssh:/tmp/ssh-hHomdONwQus6/agent.6907
The idea has been discussed a little in this e-mail thread:
http://lists.mindrot.org/pipermail/openssh-unix-dev/2015-September/034381.html
Signed-off-by: Fabiano Fidêncio <fidencio at redhat.com>
---
Changes since v1:
- Fix a typo in the commit (SSH_AUTH_SOCKET -> SSH_AUTH_SOCK)
---
authfd.c | 40 ++++++++++++++++++++++++++++------------
1 file changed, 28 insertions(+), 12 deletions(-)
diff --git a/authfd.c b/authfd.c
index 12bf125..20fcba2 100644
--- a/authfd.c
+++ b/authfd.c
@@ -83,21 +83,12 @@ decode_reply(u_char type)
return SSH_ERR_INVALID_FORMAT;
}
-/* Returns the number of the authentication fd, or -1 if there is none. */
-int
-ssh_get_authentication_socket(int *fdp)
+static int
+get_authentication_socket(const char *authsocket, int *fdp)
{
- const char *authsocket;
int sock, oerrno;
struct sockaddr_un sunaddr;
- if (fdp != NULL)
- *fdp = -1;
-
- authsocket = getenv(SSH_AUTHSOCKET_ENV_NAME);
- if (!authsocket)
- return SSH_ERR_AGENT_NOT_PRESENT;
-
memset(&sunaddr, 0, sizeof(sunaddr));
sunaddr.sun_family = AF_UNIX;
strlcpy(sunaddr.sun_path, authsocket, sizeof(sunaddr.sun_path));
@@ -117,7 +108,32 @@ ssh_get_authentication_socket(int *fdp)
*fdp = sock;
else
close(sock);
- return 0;
+ return SSH_ERR_SUCCESS;
+}
+
+/* Returns the number of the authentication fd, or -1 if there is none. */
+int
+ssh_get_authentication_socket(int *fdp)
+{
+ const char *authsocketlist;
+ const char *authsocket;
+ int rc;
+
+ if (fdp != NULL)
+ *fdp = -1;
+
+ authsocketlist = getenv(SSH_AUTHSOCKET_ENV_NAME);
+ if (!authsocketlist)
+ return SSH_ERR_AGENT_NOT_PRESENT;
+
+ authsocket = strtok((char *)authsocketlist, ":");
+
+ do {
+ rc = get_authentication_socket(authsocket, fdp);
+ authsocket = strtok(NULL, ":");
+ } while (rc != SSH_ERR_SUCCESS && authsocket != NULL);
+
+ return rc;
}
/* Communicate with agent: send request and read reply */
--
2.4.3
More information about the openssh-unix-dev
mailing list