changeset 14698:d2cfca5b178e v8.1.0361

patch 8.1.0361: remote user not used for completion commit https://github.com/vim/vim/commit/6b0b83f768cf536b34ce4d3f2de6bf62324229aa Author: Bram Moolenaar <Bram@vim.org> Date: Mon Sep 10 19:03:05 2018 +0200 patch 8.1.0361: remote user not used for completion Problem: Remote user not used for completion. (Stucki) Solution: Use $USER too. (Dominique Pelle, closes https://github.com/vim/vim/issues/3407)
author Christian Brabandt <cb@256bit.org>
date Mon, 10 Sep 2018 19:15:05 +0200
parents 3169382f089a
children 2d2a36710dad
files src/misc1.c src/version.c
diffstat 2 files changed, 55 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/src/misc1.c
+++ b/src/misc1.c
@@ -4717,6 +4717,25 @@ get_env_name(
 }
 
 /*
+ * Add a user name to the list of users in ga_users.
+ * Do nothing if user name is NULL or empty.
+ */
+    static void
+add_user(char_u *user, int need_copy)
+{
+    char_u	*user_copy = (user != NULL && need_copy)
+						    ? vim_strsave(user) : user;
+
+    if (user_copy == NULL || *user_copy == NUL || ga_grow(&ga_users, 1) == FAIL)
+    {
+	if (need_copy)
+	    vim_free(user);
+	return;
+    }
+    ((char_u **)(ga_users.ga_data))[ga_users.ga_len++] = user_copy;
+}
+
+/*
  * Find all user names for user completion.
  * Done only once and then cached.
  */
@@ -4733,26 +4752,15 @@ init_users(void)
 
 # if defined(HAVE_GETPWENT) && defined(HAVE_PWD_H)
     {
-	char_u*		user;
 	struct passwd*	pw;
 
 	setpwent();
 	while ((pw = getpwent()) != NULL)
-	    /* pw->pw_name shouldn't be NULL but just in case... */
-	    if (pw->pw_name != NULL)
-	    {
-		if (ga_grow(&ga_users, 1) == FAIL)
-		    break;
-		user = vim_strsave((char_u*)pw->pw_name);
-		if (user == NULL)
-		    break;
-		((char_u **)(ga_users.ga_data))[ga_users.ga_len++] = user;
-	    }
+	    add_user((char_u *)pw->pw_name, TRUE);
 	endpwent();
     }
 # elif defined(WIN3264)
     {
-	char_u*		user;
 	DWORD		nusers = 0, ntotal = 0, i;
 	PUSER_INFO_0	uinfo;
 
@@ -4760,19 +4768,44 @@ init_users(void)
 				       &nusers, &ntotal, NULL) == NERR_Success)
 	{
 	    for (i = 0; i < nusers; i++)
-	    {
-		if (ga_grow(&ga_users, 1) == FAIL)
-		    break;
-		user = utf16_to_enc(uinfo[i].usri0_name, NULL);
-		if (user == NULL)
-		    break;
-		((char_u **)(ga_users.ga_data))[ga_users.ga_len++] = user;
-	    }
+		add_user(utf16_to_enc(uinfo[i].usri0_name, NULL), FALSE);
 
 	    NetApiBufferFree(uinfo);
 	}
     }
 # endif
+# if defined(HAVE_GETPWNAM)
+    {
+	char_u	*user_env = mch_getenv((char_u *)"USER");
+
+	// The $USER environment variable may be a valid remote user name (NIS,
+	// LDAP) not already listed by getpwent(), as getpwent() only lists
+	// local user names.  If $USER is not already listed, check whether it
+	// is a valid remote user name using getpwnam() and if it is, add it to
+	// the list of user names.
+
+	if (user_env != NULL && *user_env != NUL)
+	{
+	    int	i;
+
+	    for (i = 0; i < ga_users.ga_len; i++)
+	    {
+		char_u	*local_user = ((char_u **)ga_users.ga_data)[i];
+
+		if (STRCMP(local_user, user_env) == 0)
+		    break;
+	    }
+
+	    if (i == ga_users.ga_len)
+	    {
+		struct passwd	*pw = getpwnam((char *)user_env);
+
+		if (pw != NULL)
+		    add_user((char_u *)pw->pw_name, TRUE);
+	    }
+	}
+    }
+# endif
 }
 
 /*
--- a/src/version.c
+++ b/src/version.c
@@ -795,6 +795,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    361,
+/**/
     360,
 /**/
     359,