[PATCH v4 0/3] Support deriving the current user's home directory via HOME
Johannes Schindelin
johannes.schindelin@gmx.de
Tue Mar 28 08:17:07 GMT 2023
This patch mini-series supports Git for Windows' default strategy to
determine the current user's home directory by looking at the
environment variable HOME, falling back to HOMEDRIVE and HOMEPATH, and
if these variables are also unset, to USERPROFILE.
This strategy is a quick method to determine the home directory,
certainly quicker than looking at LDAP, even more so when a domain
controller is unreachable and causes long hangs in Cygwin's startup.
This strategy also allows users to override the home directory easily
(e.g. in case that their real home directory is a network share that is
not all that well handled by some commands such as cmd.exe's cd
command).
Sorry for sending out v4 sooooo late...!
Changes since v3:
- Fixed the bug in v2 where `getenv("HOME")` would convert the value to
a Unix-y path and the `fetch_home_env()` function would then try to
convert it _again_.
- Disentangled the logic in `fetch_home_env()` instead of doing
everything in one big, honking, unreadable `if` condition.
- Commented the code in `fetch_home_env()`.
Changes since v2:
- Using `getenv()` and `cygwin_create_path()` instead of the
`GetEnvironmentVariableW()`/`cygwin_conv_path()` dance
- Adjusted the documentation to drive home that this only affects the
_current_ user's home directory
- Using the `PUSER_INFO_3` variant of `get_home()`
- Adjusted the commit messages
- Added another patch, to support "ad-hoc cloud accounts"
Johannes Schindelin (3):
Allow deriving the current user's home directory via the HOME variable
Respect `db_home` setting even for SYSTEM/Microsoft accounts
Respect `db_home: env` even when no uid can be determined
winsup/cygwin/local_includes/cygheap.h | 3 +-
winsup/cygwin/uinfo.cc | 70 ++++++++++++++++++++++++--
winsup/doc/ntsec.xml | 22 ++++++++
3 files changed, 91 insertions(+), 4 deletions(-)
Range-diff:
1: 6f8fe89d9d ! 1: 7a074997ea Allow deriving the current user's home directory via the HOME variable
@@ winsup/cygwin/uinfo.cc: fetch_from_path (cyg_ldap *pldap, PUSER_INFO_3 ui, cygps
+static char *
+fetch_home_env (void)
+{
-+ tmp_pathbuf tp;
-+ char *p, *q;
-+ const char *home, *home_drive, *home_path;
++ /* If `HOME` is set, prefer it */
++ const char *home = getenv ("HOME");
++ if (home)
++ return strdup (home);
++
++ /* If `HOME` is unset, fall back to `HOMEDRIVE``HOMEPATH`
++ (without a directory separator, as `HOMEPATH` starts with one). */
++ const char *home_drive = getenv ("HOMEDRIVE");
++ if (home_drive)
++ {
++ const char *home_path = getenv ("HOMEPATH");
++ if (home_path)
++ {
++ tmp_pathbuf tp;
++ char *p = tp.c_get (), *q;
+
-+ if ((home = getenv ("HOME"))
-+ || ((home_drive = getenv ("HOMEDRIVE"))
-+ && (home_path = getenv ("HOMEPATH"))
+ // concatenate HOMEDRIVE and HOMEPATH
-+ && (home = p = tp.c_get ())
-+ && (q = stpncpy (p, home_drive, NT_MAX_PATH))
-+ && strlcpy (q, home_path, NT_MAX_PATH - (q - p)))
-+ || (home = getenv ("USERPROFILE")))
++ q = stpncpy (p, home_drive, NT_MAX_PATH);
++ strlcpy (q, home_path, NT_MAX_PATH - (q - p));
++ return (char *) cygwin_create_path (CCP_WIN_A_TO_POSIX, p);
++ }
++ }
++
++ /* If neither `HOME` nor `HOMEDRIVE``HOMEPATH` are set, fall back
++ to `USERPROFILE`; In corporate setups, this might point to a
++ disconnected network share, hence this is the last fall back. */
++ home = getenv ("USERPROFILE");
++ if (home)
+ return (char *) cygwin_create_path (CCP_WIN_A_TO_POSIX, home);
+
+ return NULL;
2: 1b4ee89aa7 = 2: a70c77dc8f Respect `db_home` setting even for SYSTEM/Microsoft accounts
3: 4d90319e44 ! 3: 4cd6ae7307 Respect `db_home: env` even when no uid can be determined
@@ winsup/cygwin/uinfo.cc: fetch_from_path (cyg_ldap *pldap, PUSER_INFO_3 ui, cygps
+ break;
w = wcpncpy (w, dom, we - w);
if (w < we)
- *w++ = cygheap->pg.nss_separator ()[0];
+ *w++ = NSS_SEPARATOR_CHAR;
@@ winsup/cygwin/uinfo.cc: fetch_from_path (cyg_ldap *pldap, PUSER_INFO_3 ui, cygpsid &sid, PCWSTR str,
w = wcpncpy (w, name, we - w);
break;
base-commit: a9a17f5fe51498b182d4a11ac48207b8c7ffe8ec
Published-As: https://github.com/dscho/msys2-runtime/releases/tag/home-env-cygwin-v4
Fetch-It-Via: git fetch https://github.com/dscho/msys2-runtime home-env-cygwin-v4
--
2.40.0.windows.1
More information about the Cygwin-patches
mailing list