summaryrefslogtreecommitdiffstats
path: root/src/misc1.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2018-09-10 19:03:05 +0200
committerBram Moolenaar <Bram@vim.org>2018-09-10 19:03:05 +0200
commit6b0b83f768cf536b34ce4d3f2de6bf62324229aa (patch)
tree3ad427673ad3b4d45c335f32add20e7ca720371f /src/misc1.c
parente828b7621cf9065a3582be0c4dd1e0e846e335bf (diff)
patch 8.1.0361: remote user not used for completionv8.1.0361
Problem: Remote user not used for completion. (Stucki) Solution: Use $USER too. (Dominique Pelle, closes #3407)
Diffstat (limited to 'src/misc1.c')
-rw-r--r--src/misc1.c69
1 files changed, 51 insertions, 18 deletions
diff --git a/src/misc1.c b/src/misc1.c
index dca599f500..f9055e6e35 100644
--- 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,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