summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2014-10-28 11:42:44 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2014-10-28 11:42:44 (GMT)
commit30b3bae9255edf5b7fd9917ead602c67c25b7bca (patch)
tree4b77746dfabdb25b7cd3f15852c330c607766473
parentf638baa7b26cb01687d4155daaa9173ddea01a4a (diff)
downloadtcl-bug_dcc03414f5.zip
tcl-bug_dcc03414f5.tar.gz
tcl-bug_dcc03414f5.tar.bz2
Revert bug-fix for [2413550], in order to be able to investigate whether it caused [dcc03414f5] or not. bug_dcc03414f5
It turned out that "com3" is ok but not "com3:", thanks, branch closed
-rw-r--r--win/tclWinChan.c103
-rw-r--r--win/tclWinInt.h2
-rw-r--r--win/tclWinSerial.c25
3 files changed, 13 insertions, 117 deletions
diff --git a/win/tclWinChan.c b/win/tclWinChan.c
index 48acacb..c548b4c 100644
--- a/win/tclWinChan.c
+++ b/win/tclWinChan.c
@@ -95,7 +95,7 @@ static void FileThreadActionProc(ClientData instanceData,
static int FileTruncateProc(ClientData instanceData,
Tcl_WideInt length);
static DWORD FileGetType(HANDLE handle);
-static int NativeIsComPort(CONST TCHAR *nativeName);
+
/*
* This structure describes the channel type structure for file based IO.
*/
@@ -889,33 +889,6 @@ TclpOpenFileChannel(
}
/*
- * [2413550] Avoid double-open of serial ports on Windows
- * Special handling for Windows serial ports by a "name-hint"
- * to directly open it with the OVERLAPPED flag set.
- */
-
- if( NativeIsComPort(nativeName) ) {
-
- handle = TclWinSerialOpen(INVALID_HANDLE_VALUE, nativeName, accessMode);
- if (handle == INVALID_HANDLE_VALUE) {
- TclWinConvertError(GetLastError());
- if (interp != (Tcl_Interp *) NULL) {
- Tcl_AppendResult(interp, "couldn't open serial \"",
- TclGetString(pathPtr), "\": ",
- Tcl_PosixError(interp), NULL);
- }
- return NULL;
- }
-
- /*
- * For natively named Windows serial ports we are done.
- */
- channel = TclWinOpenSerialChannel(handle, channelName,
- channelPermissions);
-
- return channel;
- }
- /*
* If the file is being created, get the file attributes from the
* permissions argument, else use the existing file attributes.
*/
@@ -966,15 +939,11 @@ TclpOpenFileChannel(
switch (FileGetType(handle)) {
case FILE_TYPE_SERIAL:
/*
- * Natively named serial ports "com1-9", "\\\\.\\comXX" are
- * already done with the code above.
- * Here we handle all other serial port names.
- *
* Reopen channel for OVERLAPPED operation. Normally this shouldn't
* fail, because the channel exists.
*/
- handle = TclWinSerialOpen(handle, nativeName, accessMode);
+ handle = TclWinSerialReopen(handle, nativeName, accessMode);
if (handle == INVALID_HANDLE_VALUE) {
TclWinConvertError(GetLastError());
if (interp != (Tcl_Interp *) NULL) {
@@ -1514,74 +1483,6 @@ FileGetType(
return type;
}
- /*
- *----------------------------------------------------------------------
- *
- * NativeIsComPort --
- *
- * Determines if a path refers to a Windows serial port.
- * A simple and efficient solution is to use a "name hint" to detect
- * COM ports by their filename instead of resorting to a syscall
- * to detect serialness after the fact.
- * The following patterns cover common serial port names:
- * COM[1-9]:?
- * //./COM[0-9]+
- * \\.\COM[0-9]+
- *
- * Results:
- * 1 = serial port, 0 = not.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-NativeIsComPort(
- const TCHAR *nativePath) /* Path of file to access, native encoding. */
-{
- const WCHAR *p = (const WCHAR *) nativePath;
- int i, len = wcslen(p);
-
- /*
- * 1. Look for com[1-9]:?
- */
-
- if ( (len >= 4) && (len <= 5)
- && (_wcsnicmp(p, L"com", 3) == 0) ) {
- /*
- * The 4th character must be a digit 1..9 optionally followed by a ":"
- */
-
- if ( (p[3] < L'1') || (p[3] > L'9') ) {
- return 0;
- }
- if ( (len == 5) && (p[4] != L':') ) {
- return 0;
- }
- return 1;
- }
-
- /*
- * 2. Look for //./com[0-9]+ or \\.\com[0-9]+
- */
-
- if ( (len >= 8) && (
- (_wcsnicmp(p, L"//./com", 7) == 0)
- || (_wcsnicmp(p, L"\\\\.\\com", 7) == 0) ) )
- {
- /*
- * Charaters 8..end must be a digits 0..9
- */
-
- for ( i=7; i<len; i++ ) {
- if ( (p[i] < '0') || (p[i] > '9') ) {
- return 0;
- }
- }
- return 1;
- }
- return 0;
-}
-
/*
* Local Variables:
* mode: c
diff --git a/win/tclWinInt.h b/win/tclWinInt.h
index 9df424f..c7066bb 100644
--- a/win/tclWinInt.h
+++ b/win/tclWinInt.h
@@ -66,7 +66,7 @@ MODULE_SCOPE Tcl_Channel TclWinOpenFileChannel(HANDLE handle, char *channelName,
int permissions, int appendMode);
MODULE_SCOPE Tcl_Channel TclWinOpenSerialChannel(HANDLE handle,
char *channelName, int permissions);
-MODULE_SCOPE HANDLE TclWinSerialOpen(HANDLE handle, const TCHAR *name,
+MODULE_SCOPE HANDLE TclWinSerialReopen(HANDLE handle, const TCHAR *name,
DWORD access);
MODULE_SCOPE int TclWinSymLinkCopyDirectory(const TCHAR *LinkOriginal,
const TCHAR *LinkCopy);
diff --git a/win/tclWinSerial.c b/win/tclWinSerial.c
index 6487fe4..b9c9a9f 100644
--- a/win/tclWinSerial.c
+++ b/win/tclWinSerial.c
@@ -1410,22 +1410,23 @@ SerialWriterThread(
/*
*----------------------------------------------------------------------
*
- * TclWinSerialOpen --
+ * TclWinSerialReopen --
*
- * Opens or Reopens the serial port with the OVERLAPPED FLAG set
+ * Reopens the serial port with the OVERLAPPED FLAG set
*
* Results:
- * Returns the new handle, or INVALID_HANDLE_VALUE.
- * If an existing channel is specified it is closed and reopened.
+ * Returns the new handle, or INVALID_HANDLE_VALUE. Normally there
+ * shouldn't be any error, because the same channel has previously been
+ * succeesfully opened.
*
* Side effects:
- * May close/reopen the original handle
+ * May close the original handle
*
*----------------------------------------------------------------------
*/
HANDLE
-TclWinSerialOpen(
+TclWinSerialReopen(
HANDLE handle,
const TCHAR *name,
DWORD access)
@@ -1433,22 +1434,16 @@ TclWinSerialOpen(
SerialInit();
/*
- * If an open channel is specified, close it
- */
-
- if ( handle != INVALID_HANDLE_VALUE && CloseHandle(handle) == FALSE) {
- return INVALID_HANDLE_VALUE;
- }
-
- /*
* Multithreaded I/O needs the overlapped flag set otherwise
* ClearCommError blocks under Windows NT/2000 until serial output is
* finished
*/
+ if (CloseHandle(handle) == FALSE) {
+ return INVALID_HANDLE_VALUE;
+ }
handle = CreateFile(name, access, 0, 0, OPEN_EXISTING,
FILE_FLAG_OVERLAPPED, 0);
-
return handle;
}