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