]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 8.1.0361: remote user not used for completion v8.1.0361
authorBram Moolenaar <Bram@vim.org>
Mon, 10 Sep 2018 17:03:05 +0000 (19:03 +0200)
committerBram Moolenaar <Bram@vim.org>
Mon, 10 Sep 2018 17:03:05 +0000 (19:03 +0200)
Problem:    Remote user not used for completion. (Stucki)
Solution:   Use $USER too. (Dominique Pelle, closes #3407)

src/misc1.c
src/version.c

index dca599f500532321720c88208190c6c8478715f9..f9055e6e35f347284ebd50c7269f1d5c12196c0f 100644 (file)
@@ -4716,6 +4716,25 @@ get_env_name(
 # endif
 }
 
+/*
+ * 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,16 +4768,41 @@ init_users(void)
                                       &nusers, &ntotal, NULL) == NERR_Success)
        {
            for (i = 0; i < nusers; i++)
+               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++)
            {
-               if (ga_grow(&ga_users, 1) == FAIL)
-                   break;
-               user = utf16_to_enc(uinfo[i].usri0_name, NULL);
-               if (user == NULL)
+               char_u  *local_user = ((char_u **)ga_users.ga_data)[i];
+
+               if (STRCMP(local_user, user_env) == 0)
                    break;
-               ((char_u **)(ga_users.ga_data))[ga_users.ga_len++] = user;
            }
 
-           NetApiBufferFree(uinfo);
+           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
index 9ba63af29e8abe5b5b4fb355db7224f06e8dbc68..b3768a8fc298f670c4990741757282849b2a0ec2 100644 (file)
@@ -794,6 +794,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    361,
 /**/
     360,
 /**/