summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorfvogel <fvogelnew1@free.fr>2018-05-23 21:08:01 (GMT)
committerfvogel <fvogelnew1@free.fr>2018-05-23 21:08:01 (GMT)
commit36a1a69178cf1667f7ddd31ee00274f9e7709139 (patch)
tree058d2725222ca797a0b299bc0242ec6cff8db0c5
parentdffe6bc7f17cc047da64213a097fe2f9b3a58865 (diff)
downloadtcl-36a1a69178cf1667f7ddd31ee00274f9e7709139.zip
tcl-36a1a69178cf1667f7ddd31ee00274f9e7709139.tar.gz
tcl-36a1a69178cf1667f7ddd31ee00274f9e7709139.tar.bz2
Add support for ~domain\user style user names, with new test test filesystem-1.30.3. Warning: does not yet work.
-rw-r--r--tests/fileSystem.test3
-rw-r--r--win/tclWinFile.c18
2 files changed, 18 insertions, 3 deletions
diff --git a/tests/fileSystem.test b/tests/fileSystem.test
index f778112..277fcd3 100644
--- a/tests/fileSystem.test
+++ b/tests/fileSystem.test
@@ -270,6 +270,9 @@ test filesystem-1.30.1 {normalisation of existing user} -body {
test filesystem-1.30.2 {normalisation of nonexistent user specified as user@domain} -body {
file normalize ~nonexistentuser@nonexistentdomain
} -returnCodes error -result {user "nonexistentuser@nonexistentdomain" doesn't exist}
+test filesystem-1.30.3 {normalisation of nonexistent user specified as domain\user} -body {
+ file normalize ~nonexistentdomain\\nonexistentuser
+} -returnCodes error -result {user "nonexistentdomain\nonexistentuser" doesn't exist}
test filesystem-1.31 {link normalisation: link near filesystem root} {testsetplatform} {
testsetplatform unix
file normalize /foo/../bar
diff --git a/win/tclWinFile.c b/win/tclWinFile.c
index beab147..b8fb046 100644
--- a/win/tclWinFile.c
+++ b/win/tclWinFile.c
@@ -1441,11 +1441,13 @@ TclpGetUserHome(
Tcl_DString ds;
int nameLen = -1;
int badDomain = 0;
- char *domain;
+ char *domain, *user;
+ const char *nameStart;
WCHAR *wName, *wHomeDir, *wDomain, **wDomainPtr = &wDomain;
WCHAR buf[MAX_PATH];
LPCWSTR wServername = NULL;
+ nameStart = name;
Tcl_DStringInit(bufferPtr);
wDomain = NULL;
domain = strchr(name, '@');
@@ -1455,10 +1457,20 @@ TclpGetUserHome(
badDomain = NetGetDCName(NULL, wName, (LPBYTE *) wDomainPtr);
Tcl_DStringFree(&ds);
nameLen = domain - name;
+ } else {
+ user = strchr(name, '\\');
+ if (user != NULL) {
+ Tcl_DStringInit(&ds);
+ wName = Tcl_UtfToUniCharDString(name, user - name, &ds);
+ badDomain = NetGetDCName(NULL, wName, (LPBYTE *) wDomainPtr);
+ Tcl_DStringFree(&ds);
+ nameStart = user + 1;
+ nameLen = name + strlen(name) - 1 - user;
+ }
}
if (badDomain == 0) {
Tcl_DStringInit(&ds);
- wName = Tcl_UtfToUniCharDString(name, nameLen, &ds);
+ wName = Tcl_UtfToUniCharDString(nameStart, nameLen, &ds);
NetGetDCName(NULL, wDomain, (LPBYTE *) &wServername);
if (NetUserGetInfo(wServername, wName, 1, (LPBYTE *) uiPtrPtr) == 0) {
wHomeDir = uiPtr->usri1_home_dir;
@@ -1477,7 +1489,7 @@ TclpGetUserHome(
}
Tcl_UniCharToUtfDString(buf, size-1, bufferPtr);
Tcl_DStringAppend(bufferPtr, "/", -1);
- Tcl_DStringAppend(bufferPtr, name, -1);
+ Tcl_DStringAppend(bufferPtr, nameStart, nameLen);
}
result = Tcl_DStringValue(bufferPtr);
NetApiBufferFree((void *) uiPtr);