@@ -780,6 +780,8 @@ cygheap_pwdgrp::nss_init_line (const char *line)
780
780
scheme[idx].method = NSS_SCHEME_UNIX;
781
781
else if (NSS_CMP (" desc" ))
782
782
scheme[idx].method = NSS_SCHEME_DESC;
783
+ else if (NSS_CMP (" env" ))
784
+ scheme[idx].method = NSS_SCHEME_ENV;
783
785
else if (NSS_NCMP (" /" ))
784
786
{
785
787
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,
970
972
return ret;
971
973
}
972
974
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
+
973
1006
char *
974
1007
cygheap_pwdgrp::get_home (cyg_ldap *pldap, cygpsid &sid, PCWSTR dom,
975
1008
PCWSTR dnsdomain, PCWSTR name, bool full_qualified)
@@ -1029,6 +1062,9 @@ cygheap_pwdgrp::get_home (cyg_ldap *pldap, cygpsid &sid, PCWSTR dom,
1029
1062
}
1030
1063
}
1031
1064
break ;
1065
+ case NSS_SCHEME_ENV:
1066
+ home = fetch_home_env ();
1067
+ break ;
1032
1068
}
1033
1069
}
1034
1070
return home;
@@ -1060,6 +1096,9 @@ cygheap_pwdgrp::get_home (PUSER_INFO_3 ui, cygpsid &sid, PCWSTR dom,
1060
1096
home = fetch_from_path (NULL , ui, sid, home_scheme[idx].attrib ,
1061
1097
dom, NULL , name, full_qualified);
1062
1098
break ;
1099
+ case NSS_SCHEME_ENV:
1100
+ home = fetch_home_env ();
1101
+ break ;
1063
1102
}
1064
1103
}
1065
1104
return home;
@@ -1079,6 +1118,7 @@ cygheap_pwdgrp::get_shell (cyg_ldap *pldap, cygpsid &sid, PCWSTR dom,
1079
1118
case NSS_SCHEME_FALLBACK:
1080
1119
return NULL ;
1081
1120
case NSS_SCHEME_WINDOWS:
1121
+ case NSS_SCHEME_ENV:
1082
1122
break ;
1083
1123
case NSS_SCHEME_CYGWIN:
1084
1124
if (pldap->fetch_ad_account (sid, false , dnsdomain))
@@ -1143,6 +1183,7 @@ cygheap_pwdgrp::get_shell (PUSER_INFO_3 ui, cygpsid &sid, PCWSTR dom,
1143
1183
case NSS_SCHEME_CYGWIN:
1144
1184
case NSS_SCHEME_UNIX:
1145
1185
case NSS_SCHEME_FREEATTR:
1186
+ case NSS_SCHEME_ENV:
1146
1187
break ;
1147
1188
case NSS_SCHEME_DESC:
1148
1189
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,
1223
1264
sys_wcstombs_alloc (&gecos, HEAP_NOTHEAP, val);
1224
1265
}
1225
1266
break ;
1267
+ case NSS_SCHEME_ENV:
1268
+ break ;
1226
1269
}
1227
1270
}
1228
1271
if (gecos)
@@ -1249,6 +1292,7 @@ cygheap_pwdgrp::get_gecos (PUSER_INFO_3 ui, cygpsid &sid, PCWSTR dom,
1249
1292
case NSS_SCHEME_CYGWIN:
1250
1293
case NSS_SCHEME_UNIX:
1251
1294
case NSS_SCHEME_FREEATTR:
1295
+ case NSS_SCHEME_ENV:
1252
1296
break ;
1253
1297
case NSS_SCHEME_DESC:
1254
1298
gecos = fetch_from_description (ui->usri3_comment , L" gecos=\" " , 7 );
0 commit comments