Version 11 of gets

Updated 2003-03-21 17:52:25

gets - Read a single line from a channel http://www.tcl.tk/man/tcl8.4/TclCmd/gets.htm

  gets channelId
  gets channelId variable

Reads a single line from the specified channel. In the first form the characters of the line (with the exception of the end-of-line character) are returned as the result of the command. In the second form the characters of the line are written into the variable and the length of the line is returned instead.

When applied to a blocking channel the command will block until a line is complete or EOF was encountered. If the command is applied to a non-blocking channel and unable to read a complete line the first form of the command will return an empty string. The second form will return a -1 and refrain from setting the variable.

Do not use this command when Working with binary data. It will try to recognize end-of-line characters no matter what, even inside of packets.

If you're using gets in a loop, and want to stop when you reach the end of the file, use the following structure:

  while {[gets $filestream line] >= 0} {
    # do what you like here
  }

From the Tcl'ers chat on Oct 24, 2001:

dgp: I reported long ago that tclhttpd was vulnerable to a DoS due to gets slurping up data until it sees a newline. I guess that weakness in gets has never been addressed.

bbh: is it a weakness in gets or a weakness in an app using gets instead of read ?

dgp: Well, Brent Welch replied and said that the solution he would have to implement would be effectively writing his own safe gets in terms of read.

From the Tcl'ers Wiki Sep 20, 2002:

GPS: This bug with gets could be solved I suspect by adding a -maxchars flag to gets. For example:

 set res [gets -maxchars 100 $chan data]

If more than 100 chars are read then gets should return -1 or something like that. This would only be for the usage of gets with the optional variable argument.


Theo Verelst This goes back to Unix file access unwritten it seems rules or ideas, at least that is as far as I can trace it, where you'd either assume everything fits in a line, or gets broken up into pieces of known length, which runs you into two problems: you don't know what to do when you read a line which is exactly the length of the buffer, and second, you don't know what happens when a file server or socket has a buffer size distinct of what you assume or set.


Tcl syntax help - Arts and crafts of Tcl-Tk programming - Category Command from Tcl