Skip to content

Commit be5ad3c

Browse files
committed
Merge pull request #8 from dscho/home-env
Allow overriding the home directory via the HOME variable
2 parents 6dfcbb0 + 1275b16 commit be5ad3c

File tree

2 files changed

+46
-1
lines changed

2 files changed

+46
-1
lines changed

winsup/cygwin/cygheap.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,8 @@ class cygheap_pwdgrp
414414
NSS_SCHEME_UNIX,
415415
NSS_SCHEME_DESC,
416416
NSS_SCHEME_PATH,
417-
NSS_SCHEME_FREEATTR
417+
NSS_SCHEME_FREEATTR,
418+
NSS_SCHEME_ENV
418419
};
419420
struct nss_scheme_t {
420421
nss_scheme_method method;

winsup/cygwin/uinfo.cc

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -780,6 +780,8 @@ cygheap_pwdgrp::nss_init_line (const char *line)
780780
scheme[idx].method = NSS_SCHEME_UNIX;
781781
else if (NSS_CMP ("desc"))
782782
scheme[idx].method = NSS_SCHEME_DESC;
783+
else if (NSS_CMP ("env"))
784+
scheme[idx].method = NSS_SCHEME_ENV;
783785
else if (NSS_NCMP ("/"))
784786
{
785787
const char *e = c + strcspn (c, " \t");
@@ -970,6 +972,37 @@ fetch_from_path (cyg_ldap *pldap, PUSER_INFO_3 ui, cygpsid &sid, PCWSTR str,
970972
return ret;
971973
}
972974

975+
static char *
976+
fetch_home_env (void)
977+
{
978+
char *env = getenv("HOME"), *buf = NULL, *home = NULL;
979+
tmp_pathbuf tp;
980+
981+
if (!env)
982+
{
983+
char *drive = getenv("HOMEDRIVE"), *path = getenv("HOMEPATH");
984+
if (drive && path)
985+
{
986+
int drive_len = strlen(drive), path_len = strlen(path);
987+
buf = (char *)malloc(drive_len + path_len + 1);
988+
strcpy(buf, drive);
989+
strcpy(buf + drive_len, path);
990+
}
991+
}
992+
if (!buf && !env)
993+
env = getenv("USERPROFILE");
994+
995+
if (env || buf)
996+
{
997+
cygwin_conv_path (CCP_WIN_A_TO_POSIX | CCP_ABSOLUTE,
998+
env ? env : buf, tp.c_get(), NT_MAX_PATH);
999+
free(buf);
1000+
home = strdup(tp.c_get());
1001+
}
1002+
1003+
return home;
1004+
}
1005+
9731006
char *
9741007
cygheap_pwdgrp::get_home (cyg_ldap *pldap, cygpsid &sid, PCWSTR dom,
9751008
PCWSTR dnsdomain, PCWSTR name, bool full_qualified)
@@ -1029,6 +1062,9 @@ cygheap_pwdgrp::get_home (cyg_ldap *pldap, cygpsid &sid, PCWSTR dom,
10291062
}
10301063
}
10311064
break;
1065+
case NSS_SCHEME_ENV:
1066+
home = fetch_home_env ();
1067+
break;
10321068
}
10331069
}
10341070
return home;
@@ -1060,6 +1096,9 @@ cygheap_pwdgrp::get_home (PUSER_INFO_3 ui, cygpsid &sid, PCWSTR dom,
10601096
home = fetch_from_path (NULL, ui, sid, home_scheme[idx].attrib,
10611097
dom, NULL, name, full_qualified);
10621098
break;
1099+
case NSS_SCHEME_ENV:
1100+
home = fetch_home_env ();
1101+
break;
10631102
}
10641103
}
10651104
return home;
@@ -1079,6 +1118,7 @@ cygheap_pwdgrp::get_shell (cyg_ldap *pldap, cygpsid &sid, PCWSTR dom,
10791118
case NSS_SCHEME_FALLBACK:
10801119
return NULL;
10811120
case NSS_SCHEME_WINDOWS:
1121+
case NSS_SCHEME_ENV:
10821122
break;
10831123
case NSS_SCHEME_CYGWIN:
10841124
if (pldap->fetch_ad_account (sid, false, dnsdomain))
@@ -1143,6 +1183,7 @@ cygheap_pwdgrp::get_shell (PUSER_INFO_3 ui, cygpsid &sid, PCWSTR dom,
11431183
case NSS_SCHEME_CYGWIN:
11441184
case NSS_SCHEME_UNIX:
11451185
case NSS_SCHEME_FREEATTR:
1186+
case NSS_SCHEME_ENV:
11461187
break;
11471188
case NSS_SCHEME_DESC:
11481189
shell = fetch_from_description (ui->usri3_comment, L"shell=\"", 7);
@@ -1223,6 +1264,8 @@ cygheap_pwdgrp::get_gecos (cyg_ldap *pldap, cygpsid &sid, PCWSTR dom,
12231264
sys_wcstombs_alloc (&gecos, HEAP_NOTHEAP, val);
12241265
}
12251266
break;
1267+
case NSS_SCHEME_ENV:
1268+
break;
12261269
}
12271270
}
12281271
if (gecos)
@@ -1249,6 +1292,7 @@ cygheap_pwdgrp::get_gecos (PUSER_INFO_3 ui, cygpsid &sid, PCWSTR dom,
12491292
case NSS_SCHEME_CYGWIN:
12501293
case NSS_SCHEME_UNIX:
12511294
case NSS_SCHEME_FREEATTR:
1295+
case NSS_SCHEME_ENV:
12521296
break;
12531297
case NSS_SCHEME_DESC:
12541298
gecos = fetch_from_description (ui->usri3_comment, L"gecos=\"", 7);

0 commit comments

Comments
 (0)