From 012e7106dea75316d536747a655024743be0a5d4 Mon Sep 17 00:00:00 2001 From: Tiago Cunha Date: Mon, 2 Nov 2009 21:42:27 +0000 Subject: [PATCH] Sync OpenBSD patchset 479: When matching the session names with -t, look for exact matches first before trying partial matches. Avoids problems where two ambiguous matches are present before an exact match (eg foo1, foo2, foo would give an error on trying -tfoo), reported by Natacha Port? natbsd at instinctive dot eu. --- cmd.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/cmd.c b/cmd.c index 6f68fe03..0b8e46d6 100644 --- a/cmd.c +++ b/cmd.c @@ -1,4 +1,4 @@ -/* $Id: cmd.c,v 1.126 2009-10-28 23:12:38 tcunha Exp $ */ +/* $Id: cmd.c,v 1.127 2009-11-02 21:42:27 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -487,19 +487,25 @@ cmd_lookup_session(const char *name, int *ambiguous) *ambiguous = 0; /* - * Look for matches. Session names must be unique so an exact match - * can't be ambigious and can just be returned. + * Look for matches. First look for exact matches - session names must + * be unique so an exact match can't be ambigious and can just be + * returned. + */ + for (i = 0; i < ARRAY_LENGTH(&sessions); i++) { + if ((s = ARRAY_ITEM(&sessions, i)) == NULL) + continue; + if (strcmp(name, s->name) == 0) + return (s); + } + + /* + * Otherwise look for partial matches, returning early if it is found to + * be ambiguous. */ sfound = NULL; for (i = 0; i < ARRAY_LENGTH(&sessions); i++) { if ((s = ARRAY_ITEM(&sessions, i)) == NULL) continue; - - /* Check for an exact match and return it if found. */ - if (strcmp(name, s->name) == 0) - return (s); - - /* Then check for pattern matches. */ if (strncmp(name, s->name, strlen(name)) == 0 || fnmatch(name, s->name, 0) == 0) { if (sfound != NULL) { @@ -509,7 +515,6 @@ cmd_lookup_session(const char *name, int *ambiguous) sfound = s; } } - return (sfound); }