Mercurial > vim
comparison src/misc1.c @ 12265:03e4be2e3d53 v8.0.1012
patch 8.0.1012: MS-Windows: problem with $HOME when is was set internally
commit https://github.com/vim/vim/commit/48340b62e812dc9280f621a2eb6db76d43555c66
Author: Bram Moolenaar <Bram@vim.org>
Date: Tue Aug 29 22:08:53 2017 +0200
patch 8.0.1012: MS-Windows: problem with $HOME when is was set internally
Problem: MS-Windows: Problem with $HOME when is was set internally.
Solution: Only use the $HOME default internally. (Yasuhiro Matsumoto, closes
#2013)
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Tue, 29 Aug 2017 22:15:05 +0200 |
parents | 0066a7e178bc |
children | d2373927d76d |
comparison
equal
deleted
inserted
replaced
12264:4ebb86735ae5 | 12265:03e4be2e3d53 |
---|---|
3748 var = mch_getenv((char_u *)"SYS$LOGIN"); | 3748 var = mch_getenv((char_u *)"SYS$LOGIN"); |
3749 #else | 3749 #else |
3750 var = mch_getenv((char_u *)"HOME"); | 3750 var = mch_getenv((char_u *)"HOME"); |
3751 #endif | 3751 #endif |
3752 | 3752 |
3753 if (var != NULL && *var == NUL) /* empty is same as not set */ | |
3754 var = NULL; | |
3755 | |
3756 #ifdef WIN3264 | 3753 #ifdef WIN3264 |
3754 /* | |
3755 * Typically, $HOME is not defined on Windows, unless the user has | |
3756 * specifically defined it for Vim's sake. However, on Windows NT | |
3757 * platforms, $HOMEDRIVE and $HOMEPATH are automatically defined for | |
3758 * each user. Try constructing $HOME from these. | |
3759 */ | |
3760 if (var == NULL || *var == NULL) | |
3761 { | |
3762 char_u *homedrive, *homepath; | |
3763 | |
3764 homedrive = mch_getenv((char_u *)"HOMEDRIVE"); | |
3765 homepath = mch_getenv((char_u *)"HOMEPATH"); | |
3766 if (homepath == NULL || *homepath == NUL) | |
3767 homepath = (char_u *)"\\"; | |
3768 if (homedrive != NULL | |
3769 && STRLEN(homedrive) + STRLEN(homepath) < MAXPATHL) | |
3770 { | |
3771 sprintf((char *)NameBuff, "%s%s", homedrive, homepath); | |
3772 if (NameBuff[0] != NUL) | |
3773 var = NameBuff; | |
3774 } | |
3775 } | |
3776 | |
3777 if (var == NULL) | |
3778 var = mch_getenv((char_u *)"USERPROFILE"); | |
3779 | |
3757 /* | 3780 /* |
3758 * Weird but true: $HOME may contain an indirect reference to another | 3781 * Weird but true: $HOME may contain an indirect reference to another |
3759 * variable, esp. "%USERPROFILE%". Happens when $USERPROFILE isn't set | 3782 * variable, esp. "%USERPROFILE%". Happens when $USERPROFILE isn't set |
3760 * when $HOME is being set. | 3783 * when $HOME is being set. |
3761 */ | 3784 */ |
3772 if (exp != NULL && *exp != NUL | 3795 if (exp != NULL && *exp != NUL |
3773 && STRLEN(exp) + STRLEN(p) < MAXPATHL) | 3796 && STRLEN(exp) + STRLEN(p) < MAXPATHL) |
3774 { | 3797 { |
3775 vim_snprintf((char *)NameBuff, MAXPATHL, "%s%s", exp, p + 1); | 3798 vim_snprintf((char *)NameBuff, MAXPATHL, "%s%s", exp, p + 1); |
3776 var = NameBuff; | 3799 var = NameBuff; |
3777 /* Also set $HOME, it's needed for _viminfo. */ | 3800 } |
3778 vim_setenv((char_u *)"HOME", NameBuff); | 3801 } |
3779 } | 3802 } |
3780 } | 3803 |
3781 } | 3804 if (var != NULL && *var == NUL) /* empty is same as not set */ |
3782 | 3805 var = NULL; |
3783 /* | 3806 |
3784 * Typically, $HOME is not defined on Windows, unless the user has | 3807 # ifdef FEAT_MBYTE |
3785 * specifically defined it for Vim's sake. However, on Windows NT | |
3786 * platforms, $HOMEDRIVE and $HOMEPATH are automatically defined for | |
3787 * each user. Try constructing $HOME from these. | |
3788 */ | |
3789 if (var == NULL) | |
3790 { | |
3791 char_u *homedrive, *homepath; | |
3792 | |
3793 homedrive = mch_getenv((char_u *)"HOMEDRIVE"); | |
3794 homepath = mch_getenv((char_u *)"HOMEPATH"); | |
3795 if (homepath == NULL || *homepath == NUL) | |
3796 homepath = (char_u *)"\\"; | |
3797 if (homedrive != NULL | |
3798 && STRLEN(homedrive) + STRLEN(homepath) < MAXPATHL) | |
3799 { | |
3800 sprintf((char *)NameBuff, "%s%s", homedrive, homepath); | |
3801 if (NameBuff[0] != NUL) | |
3802 { | |
3803 var = NameBuff; | |
3804 /* Also set $HOME, it's needed for _viminfo. */ | |
3805 vim_setenv((char_u *)"HOME", NameBuff); | |
3806 } | |
3807 } | |
3808 } | |
3809 | |
3810 # if defined(FEAT_MBYTE) | |
3811 if (enc_utf8 && var != NULL) | 3808 if (enc_utf8 && var != NULL) |
3812 { | 3809 { |
3813 int len; | 3810 int len; |
3814 char_u *pp = NULL; | 3811 char_u *pp = NULL; |
3815 | 3812 |
3821 homedir = pp; | 3818 homedir = pp; |
3822 return; | 3819 return; |
3823 } | 3820 } |
3824 } | 3821 } |
3825 # endif | 3822 # endif |
3826 #endif | 3823 |
3827 | |
3828 #if defined(MSWIN) | |
3829 /* | 3824 /* |
3830 * Default home dir is C:/ | 3825 * Default home dir is C:/ |
3831 * Best assumption we can make in such a situation. | 3826 * Best assumption we can make in such a situation. |
3832 */ | 3827 */ |
3833 if (var == NULL) | 3828 if (var == NULL) |
3834 var = (char_u *)"C:/"; | 3829 var = (char_u *)"C:/"; |
3835 #endif | 3830 #endif |
3831 | |
3836 if (var != NULL) | 3832 if (var != NULL) |
3837 { | 3833 { |
3838 #ifdef UNIX | 3834 #ifdef UNIX |
3839 /* | 3835 /* |
3840 * Change to the directory and get the actual path. This resolves | 3836 * Change to the directory and get the actual path. This resolves |
4659 | 4655 |
4660 #ifdef VMS | 4656 #ifdef VMS |
4661 homedir_env_orig = homedir_env = mch_getenv((char_u *)"SYS$LOGIN"); | 4657 homedir_env_orig = homedir_env = mch_getenv((char_u *)"SYS$LOGIN"); |
4662 #else | 4658 #else |
4663 homedir_env_orig = homedir_env = mch_getenv((char_u *)"HOME"); | 4659 homedir_env_orig = homedir_env = mch_getenv((char_u *)"HOME"); |
4660 #endif | |
4661 #ifdef WIN3264 | |
4662 if (homedir_env == NULL) | |
4663 homedir_env_orig = homedir_env = mch_getenv((char_u *)"USERPROFILE"); | |
4664 #endif | 4664 #endif |
4665 /* Empty is the same as not set. */ | 4665 /* Empty is the same as not set. */ |
4666 if (homedir_env != NULL && *homedir_env == NUL) | 4666 if (homedir_env != NULL && *homedir_env == NUL) |
4667 homedir_env = NULL; | 4667 homedir_env = NULL; |
4668 | 4668 |