From: <no...@so...> - 2001-04-28 02:21:58
|
Bugs item #419685, was updated on 2001-04-27 19:12 You can respond by visiting: http://sourceforge.net/tracker/?func=detail&atid=110894&aid=419685&group_id=10894 Category: Channel Types Group: 8.3.3 Status: Open Resolution: None Priority: 5 Submitted By: Michael Kraus (mmg_kraus) >Assigned to: Andreas Kupries (andreas_kupries) >Summary: Problem with [file channels] if std channels not available Initial Comment: This occurs whenever Tcl could not initialize the standard channels (e.g. when it's running as a Windows NT service). Without any other open channels, [file channels] returns an empty list, which is correct. As soon as the first channel (e.g. a socket) is opened, it is registered as stdin, the next one as stdout, the third one as stderr. [file channels] returns {stdin stdout stderr}. Any additional open channel is returned with its Tcl name, e.g. sock123. The problem is that I don't know how to prevent the first three sockets to be registered as the standard channels, and that [file channels sock*] does not return the list of all open sockets. (As a workaround, I create three dummy channels that do nothing.) The man page for TclGetStdChannel sort of talks about that behavior, but only if "one of the standard channels is set to NULL, either by calling Tcl_SetStdChannel with a null channel argument, or by calling Tcl_Close on the channel". Since I'm doing pure Tcl here, it's hard to figure out what happens internally. Is this really the desired behavior of Tcl? Looking at tclIO.c, I find that in Tcl_GetStdChannel() the statement "tsdPtr->stdinInitialized = 1" is done unconditionally, even when the preceeding "tsdPtr- >stdinChannel = TclpGetDefaultStdChannel(TCL_STDIN)" returns NULL. This is the reason why, at the end of Tcl_CreateChannel(), the first programatically created channel is automatically registered as stdin, the next as stdout etc., even though these standard channels weren't really initialized (because they couldn't be obtained). This conflicts with the documentation, since neither Tcl_SetStdChannel() was called with NULL, nor was Tcl_Close() called. Proposed fix: In TclGetStdChannel(), do the "tsdPtr- >stdinInitialized = 1" only when TclpGetDefaultStdChannel(TCL_STDIN) returned != NULL (and similar for stdout and stderr). That is, move those lines down a bit into the already existing if() statements. Is this the right solution (or is there not even a problem ;-)? Diff for tclIO.c: 332d331 < tsdPtr->stdinInitialized = 1; 343a343 > tsdPtr->stdinInitialized = 1; 353d352 < tsdPtr->stdoutInitialized = 1; 354a354 > tsdPtr->stdoutInitialized = 1; 364d363 < tsdPtr->stderrInitialized = 1; 365a365 > tsdPtr->stderrInitialized = 1; ---------------------------------------------------------------------- You can respond by visiting: http://sourceforge.net/tracker/?func=detail&atid=110894&aid=419685&group_id=10894 |