[PATCH] Make "ssh" try different configuration filenames

Philipp Marek philipp.marek at linbit.com
Mon Aug 29 21:03:55 AEST 2016


To provide a bit more backwards-compatible (which is nice for eg. NFS-
shared /home directories) try a few version-number based names.

Eg., for "OpenSSH_7.3" the strings that are tried after "~/.ssh/config"
are "_7.3", "_7", and "".
---
 ssh.c | 37 ++++++++++++++++++++++++++++++-------
 1 file changed, 30 insertions(+), 7 deletions(-)

diff --git a/ssh.c b/ssh.c
index 03a23fb..25359fe 100644
--- a/ssh.c
+++ b/ssh.c
@@ -464,7 +464,8 @@ static void
 process_config_files(const char *host_arg, struct passwd *pw, int post_canon)
 {
 	char buf[PATH_MAX];
-	int r;
+	char *version_postfix;
+	int r, len;
 
 	if (config != NULL) {
 		if (strcasecmp(config, "none") != 0 &&
@@ -473,12 +474,34 @@ process_config_files(const char *host_arg, struct passwd *pw, int post_canon)
 			fatal("Can't open user config file %.100s: "
 			    "%.100s", config, strerror(errno));
 	} else {
-		r = snprintf(buf, sizeof buf, "%s/%s", pw->pw_dir,
-		    _PATH_SSH_USER_CONFFILE);
-		if (r > 0 && (size_t)r < sizeof(buf))
-			(void)read_config_file(buf, pw, host, host_arg,
-			    &options, SSHCONF_CHECKPERM | SSHCONF_USERCONF |
-			    (post_canon ? SSHCONF_POSTCANON : 0));
+		version_postfix = strchr(SSH_VERSION, '_');
+		if (!version_postfix)
+			version_postfix = "";
+
+		/* Find the best fitting config file,
+		 * Ie. try "_7.3", "_7", and "". */
+		len = strlen(version_postfix);
+		while (1) {
+			r = snprintf(buf, sizeof buf, "%s/%s%.*s", pw->pw_dir,
+					_PATH_SSH_USER_CONFFILE,
+					len, version_postfix);
+			if (r > 0 && (size_t)r < sizeof(buf))
+				if (read_config_file(buf, pw, host, host_arg,
+							&options, SSHCONF_CHECKPERM | SSHCONF_USERCONF |
+							(post_canon ? SSHCONF_POSTCANON : 0)))
+					break;
+
+			/* Nothing to look at */
+			if (!len)
+				break;
+
+			/* Try a smaller fit; skip last digits, then non-digits. */
+			len--;
+			while (len &&  isdigit(version_postfix[len-1]))
+				len--;
+			while (len && !isdigit(version_postfix[len-1]))
+				len--;
+		}
 
 		/* Read systemwide configuration file after user config. */
 		(void)read_config_file(_PATH_HOST_CONFIG_FILE, pw,
-- 
2.9.3



More information about the openssh-unix-dev mailing list