[PATCH v7 0/4] Support deriving the current user's home directory via HOME

Johannes Schindelin johannes.schindelin@gmx.de
Mon May 22 11:12:29 GMT 2023


NOTE! This iteration presents patches 1 & 2 only for completeness' sake
and for backporting, as they have been applied to Cygwin's main branch
already.

This patch 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).

Changes since v6:

- Fixed a typo in the last commit's message.

- Support UNC paths as `HOME` values, too. (Tested, works beautifully, I
  can now share my WSL home directory with Cygwin.)

Changes since v5:

- Replaced the third patch by a patch that imitates AzureAD account
  handling also for IIS APPPPOOL ones.

- Added a fourth patch to fix a bug in the first patch (which
  unfortunately was already applied in the buggy form) where _very
  early_ calls to `internal_pwsid ()` would result in completely bogus
  home directory values.

Changes since v4:

- Squashed in Corinna's documentation fixes (read: patch 1 should not be
  applied to Cygwin's main branch, it's presented here for backporting
  purposes).

- Fixed the commit message of the second patch that mistakenly claimed
  that Microsoft accounts would be associated with `/home/SYSTEM`.

- Completely overhauled the commit message of the third patch to motivate
  much better why this fix is needed.

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 (4):
  Allow deriving the current user's home directory via the HOME variable
  Respect `db_home` setting even for SYSTEM/Microsoft accounts
  uinfo: special-case IIS APPPOOL accounts
  Do not rely on `getenv ("HOME")`'s path conversion

 winsup/cygwin/local_includes/cygheap.h |   3 +-
 winsup/cygwin/uinfo.cc                 | 170 +++++++++++++++++++++++--
 winsup/doc/ntsec.xml                   |  20 ++-
 3 files changed, 181 insertions(+), 12 deletions(-)

Range-diff:
1:  e26cae9439 = 1:  e26cae9439 Allow deriving the current user's home directory via the HOME variable
2:  085d4dd8b6 = 2:  085d4dd8b6 Respect `db_home` setting even for SYSTEM/Microsoft accounts
3:  9b79624368 = 3:  9b79624368 uinfo: special-case IIS APPPOOL accounts
4:  8ac1548b92 ! 4:  002d94a244 Do not rely on `getenv ("HOME")`'s path conversion
    @@ Commit message
         look at the environment variable `HOME` and use it, if set.

         When all of this happens, though, the `pinfo_init ()` function has had no
    -    change to run yet (and therefore, `environ_init ()`). At this stage,
    +    chance to run yet (and therefore, `environ_init ()`). At this stage,
         therefore, `getenv ()`'s `findenv_func ()` call still finds `getearly ()`
         and we get the _verbatim_ value of `HOME`. That is, the Windows form.
         But we need the "POSIX" form.
    @@ Commit message
         Let's detect when the `HOME` value is still in Windows format in
         `fetch_home_env ()`, and convert it in that case.

    +    For good measure, interpret this "Windows format" not only to include
    +    absolute paths with drive prefixes, but also UNC paths.
    +
         Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>

      ## winsup/cygwin/uinfo.cc ##
    @@ winsup/cygwin/uinfo.cc: fetch_home_env (void)
     +    {
     +      /* In the very early code path of `user_info::initialize ()`, the value
     +         of the environment variable `HOME` is still in its Windows form. */
    -+      if (isdrive (home))
    ++      if (isdrive (home) || home[0] == '\\')
     +	return (char *) cygwin_create_path (CCP_WIN_A_TO_POSIX, home);
     +      return strdup (home);
     +    }

base-commit: a9a17f5fe51498b182d4a11ac48207b8c7ffe8ec
Published-As: https://github.com/dscho/msys2-runtime/releases/tag/home-env-cygwin-v7
Fetch-It-Via: git fetch https://github.com/dscho/msys2-runtime home-env-cygwin-v7

--
2.41.0.rc0.windows.1



More information about the Cygwin-patches mailing list