Provided by: tcl8.6-doc_8.6.1-4ubuntu1_all bug

NAME

       Tcl_OpenFileChannel,    Tcl_OpenCommandChannel,    Tcl_MakeFileChannel,    Tcl_GetChannel,
       Tcl_GetChannelNames,  Tcl_GetChannelNamesEx,  Tcl_RegisterChannel,  Tcl_UnregisterChannel,
       Tcl_DetachChannel, Tcl_IsStandardChannel, Tcl_Close, Tcl_ReadChars, Tcl_Read, Tcl_GetsObj,
       Tcl_Gets,  Tcl_WriteObj,  Tcl_WriteChars,  Tcl_Write,   Tcl_Flush,   Tcl_Seek,   Tcl_Tell,
       Tcl_TruncateChannel,       Tcl_GetChannelOption,       Tcl_SetChannelOption,      Tcl_Eof,
       Tcl_InputBlocked,   Tcl_InputBuffered,   Tcl_OutputBuffered,   Tcl_Ungets,    Tcl_ReadRaw,
       Tcl_WriteRaw - buffered I/O facilities using channels

SYNOPSIS

       #include <tcl.h>

       Tcl_Channel
       Tcl_OpenFileChannel(interp, fileName, mode, permissions)

       Tcl_Channel
       Tcl_OpenCommandChannel(interp, argc, argv, flags)

       Tcl_Channel
       Tcl_MakeFileChannel(handle, readOrWrite)

       Tcl_Channel
       Tcl_GetChannel(interp, channelName, modePtr)

       int
       Tcl_GetChannelNames(interp)

       int
       Tcl_GetChannelNamesEx(interp, pattern)

       void
       Tcl_RegisterChannel(interp, channel)

       int
       Tcl_UnregisterChannel(interp, channel)

       int
       Tcl_DetachChannel(interp, channel)

       int
       Tcl_IsStandardChannel(channel)

       int
       Tcl_Close(interp, channel)

       int
       Tcl_ReadChars(channel, readObjPtr, charsToRead, appendFlag)

       int
       Tcl_Read(channel, readBuf, bytesToRead)

       int
       Tcl_GetsObj(channel, lineObjPtr)

       int
       Tcl_Gets(channel, lineRead)

       int
       Tcl_Ungets(channel, input, inputLen, addAtEnd)

       int
       Tcl_WriteObj(channel, writeObjPtr)

       int
       Tcl_WriteChars(channel, charBuf, bytesToWrite)

       int
       Tcl_Write(channel, byteBuf, bytesToWrite)

       int
       Tcl_ReadRaw(channel, readBuf, bytesToRead)

       int
       Tcl_WriteRaw(channel, byteBuf, bytesToWrite)

       int
       Tcl_Eof(channel)

       int
       Tcl_Flush(channel)

       int
       Tcl_InputBlocked(channel)

       int
       Tcl_InputBuffered(channel)

       int
       Tcl_OutputBuffered(channel)

       Tcl_WideInt
       Tcl_Seek(channel, offset, seekMode)

       Tcl_WideInt
       Tcl_Tell(channel)

       int
       Tcl_TruncateChannel(channel, length)

       int
       Tcl_GetChannelOption(interp, channel, optionName, optionValue)

       int
       Tcl_SetChannelOption(interp, channel, optionName, newValue)

ARGUMENTS

       Tcl_Interp *interp (in)                Used  for  error reporting and to look up a channel
                                              registered in it.

       const char *fileName (in)              The name of a local or network file.

       const char *mode (in)                  Specifies how the file is to be accessed.  May have
                                              any  of the values allowed for the mode argument to
                                              the Tcl open command.

       int permissions (in)                   POSIX-style permission flags such as  0644.   If  a
                                              new  file is created, these permissions will be set
                                              on the created file.

       int argc (in)                          The number of elements in argv.

       const char **argv (in)                 Arguments  for  constructing  a  command  pipeline.
                                              These  values  have  the  same  meaning as the non-
                                              switch arguments to the Tcl exec command.

       int flags (in)                         Specifies the disposition of the stdio  handles  in
                                              pipeline:    OR-ed    combination   of   TCL_STDIN,
                                              TCL_STDOUT, TCL_STDERR,  and  TCL_ENFORCE_MODE.  If
                                              TCL_STDIN  is set, stdin for the first child in the
                                              pipe is the pipe channel, otherwise it is the  same
                                              as  the  standard  input  of  the invoking process;
                                              likewise  for   TCL_STDOUT   and   TCL_STDERR.   If
                                              TCL_ENFORCE_MODE  is  not  set,  then  the pipe can
                                              redirect  stdio  handles  to  override  the   stdio
                                              handles   for   which   TCL_STDIN,  TCL_STDOUT  and
                                              TCL_STDERR have been set.  If it is set, then  such
                                              redirections cause an error.

       ClientData handle (in)                 Operating system specific handle for I/O to a file.
                                              For Unix this is a file descriptor, for Windows  it
                                              is a HANDLE.

       int readOrWrite (in)                   OR-ed  combination of TCL_READABLE and TCL_WRITABLE
                                              to indicate what operations are valid on handle.

       const char *channelName (in)           The name of the channel.

       int *modePtr (out)                     Points at an integer variable that will receive  an
                                              OR-ed  combination of TCL_READABLE and TCL_WRITABLE
                                              denoting whether the channel is  open  for  reading
                                              and writing.

       const char *pattern (in)               The pattern to match on, passed to Tcl_StringMatch,
                                              or NULL.

       Tcl_Channel channel (in)               A Tcl channel for input or output.  Must have  been
                                              the   return   value   from  a  procedure  such  as
                                              Tcl_OpenFileChannel.

       Tcl_Obj *readObjPtr (in/out)           A pointer to a Tcl value  in  which  to  store  the
                                              characters read from the channel.

       int charsToRead (in)                   The  number of characters to read from the channel.
                                              If  the  channel's  encoding  is  binary,  this  is
                                              equivalent  to the number of bytes to read from the
                                              channel.

       int appendFlag (in)                    If non-zero, data read from  the  channel  will  be
                                              appended  to  the  value.  Otherwise, the data will
                                              replace the existing contents of the value.

       char *readBuf (out)                    A buffer in which to store the bytes read from  the
                                              channel.

       int bytesToRead (in)                   The  number of bytes to read from the channel.  The
                                              buffer readBuf must be large enough  to  hold  this
                                              many bytes.

       Tcl_Obj *lineObjPtr (in/out)           A pointer to a Tcl value in which to store the line
                                              read from the  channel.   The  line  read  will  be
                                              appended to the current value of the value.

       Tcl_DString *lineRead (in/out)         A pointer to a Tcl dynamic string in which to store
                                              the line read from the  channel.   Must  have  been
                                              initialized  by  the caller.  The line read will be
                                              appended to any data already in the dynamic string.

       const char *input (in)                 The input to add to a channel buffer.

       int inputLen (in)                      Length of the input

       int addAtEnd (in)                      Flag indicating whether the input should  be  added
                                              to the end or beginning of the channel buffer.

       Tcl_Obj *writeObjPtr (in)              A  pointer  to  a  Tcl value whose contents will be
                                              output to the channel.

       const char *charBuf (in)               A buffer containing the characters to output to the
                                              channel.

       const char *byteBuf (in)               A  buffer  containing  the  bytes  to output to the
                                              channel.

       int bytesToWrite (in)                  The number of bytes  to  consume  from  charBuf  or
                                              byteBuf and output to the channel.

       Tcl_WideInt offset (in)                How  far to move the access point in the channel at
                                              which the next input or output  operation  will  be
                                              applied,  measured in bytes from the position given
                                              by seekMode.  May be either positive or negative.

       int seekMode (in)                      Relative to which point to seek; used  with  offset
                                              to  calculate the new access point for the channel.
                                              Legal values are SEEK_SET, SEEK_CUR, and SEEK_END.

       Tcl_WideInt length (in)                The (non-negative) length to truncate  the  channel
                                              the channel to.

       const char *optionName (in)            The  name  of an option applicable to this channel,
                                              such as -blocking.  May  have  any  of  the  values
                                              accepted by the fconfigure command.

       Tcl_DString *optionValue (in)          Where  to store the value of an option or a list of
                                              all  options  and  their  values.  Must  have  been
                                              initialized by the caller.

       const char *newValue (in)              New value for the option given by optionName.
_________________________________________________________________

DESCRIPTION

       The Tcl channel mechanism provides a device-independent and platform-independent mechanism
       for performing buffered input and output operations on a  variety  of  file,  socket,  and
       device  types.   The  channel mechanism is extensible to new channel types, by providing a
       low-level channel driver for the new type; the channel driver interface  is  described  in
       the  manual entry for Tcl_CreateChannel. The channel mechanism provides a buffering scheme
       modeled after Unix's standard I/O, and it also allows for nonblocking I/O on channels.

       The procedures described in this manual entry comprise the C APIs of the generic layer  of
       the  channel architecture. For a description of the channel driver architecture and how to
       implement  channel  drivers  for  new  types  of  channels,  see  the  manual  entry   for
       Tcl_CreateChannel.

TCL_OPENFILECHANNEL

       Tcl_OpenFileChannel  opens  a file specified by fileName and returns a channel handle that
       can be used to perform input and output on the file. This API is modeled after  the  fopen
       procedure  of  the  Unix standard I/O library.  The syntax and meaning of all arguments is
       similar to those given in the Tcl open command when opening a file.  If  an  error  occurs
       while opening the channel, Tcl_OpenFileChannel returns NULL and records a POSIX error code
       that  can  be  retrieved  with  Tcl_GetErrno.   In  addition,  if  interp   is   non-NULL,
       Tcl_OpenFileChannel leaves an error message in interp's result after any error.  As of Tcl
       8.4,  the  value-based  API  Tcl_FSOpenFileChannel  should  be  used  in   preference   to
       Tcl_OpenFileChannel wherever possible.

       The  newly  created channel is not registered in the supplied interpreter; to register it,
       use Tcl_RegisterChannel, described below.  If one of the standard channels, stdin,  stdout
       or  stderr was previously closed, the act of creating the new channel also assigns it as a
       replacement for the standard channel.

TCL_OPENCOMMANDCHANNEL

       Tcl_OpenCommandChannel provides a C-level interface to the functions of the exec and  open
       commands.   It creates a sequence of subprocesses specified by the argv and argc arguments
       and returns a channel that can be used to communicate with these subprocesses.  The  flags
       argument indicates what sort of communication will exist with the command pipeline.

       If the TCL_STDIN flag is set then the standard input for the first subprocess will be tied
       to the channel: writing to the channel will provide input to the subprocess.  If TCL_STDIN
       is  not  set,  then  standard  input  for  the  first  subprocess will be the same as this
       application's standard input.  If TCL_STDOUT is set then standard  output  from  the  last
       subprocess  can be read from the channel; otherwise it goes to this application's standard
       output.  If TCL_STDERR is set, standard error output for all subprocesses is  returned  to
       the  channel and results in an error when the channel is closed; otherwise it goes to this
       application's standard error.  If TCL_ENFORCE_MODE is not set,  then  argc  and  argv  can
       redirect  the  stdio  handles  to override TCL_STDIN, TCL_STDOUT, and TCL_STDERR; if it is
       set, then it is an error for argc and argv to override stdio channels for which TCL_STDIN,
       TCL_STDOUT, and TCL_STDERR have been set.

       If  an  error  occurs  while  opening the channel, Tcl_OpenCommandChannel returns NULL and
       records a POSIX error  code  that  can  be  retrieved  with  Tcl_GetErrno.   In  addition,
       Tcl_OpenCommandChannel  leaves  an  error message in the interpreter's result if interp is
       not NULL.

       The newly created channel is not registered in the supplied interpreter; to  register  it,
       use  Tcl_RegisterChannel, described below.  If one of the standard channels, stdin, stdout
       or stderr was previously closed, the act of creating the new channel also assigns it as  a
       replacement for the standard channel.

TCL_MAKEFILECHANNEL

       Tcl_MakeFileChannel  makes a Tcl_Channel from an existing, platform-specific, file handle.
       The newly created channel is not registered in the supplied interpreter; to  register  it,
       use  Tcl_RegisterChannel, described below.  If one of the standard channels, stdin, stdout
       or stderr was previously closed, the act of creating the new channel also assigns it as  a
       replacement for the standard channel.

TCL_GETCHANNEL

       Tcl_GetChannel   returns   a  channel  given  the  channelName  used  to  create  it  with
       Tcl_CreateChannel and a pointer to a Tcl interpreter in interp. If a channel by that  name
       is not registered in that interpreter, the procedure returns NULL. If the modePtr argument
       is not NULL, it points at an integer variable that will receive an  OR-ed  combination  of
       TCL_READABLE  and  TCL_WRITABLE  describing  whether  the  channel is open for reading and
       writing.

       Tcl_GetChannelNames and Tcl_GetChannelNamesEx write the names of the  registered  channels
       to  the  interpreter's  result  as  a list value.  Tcl_GetChannelNamesEx will filter these
       names according to the pattern.  If pattern is NULL, then it will not  do  any  filtering.
       The  return  value  is TCL_OK if no errors occurred writing to the result, otherwise it is
       TCL_ERROR, and the error message is left in the interpreter's result.

TCL_REGISTERCHANNEL

       Tcl_RegisterChannel adds a channel to the set of channels accessible in interp. After this
       call,  Tcl  programs  executing  in  that interpreter can refer to the channel in input or
       output operations using the name given in the call to Tcl_CreateChannel.  After this call,
       the  channel  becomes  the  property  of  the  interpreter, and the caller should not call
       Tcl_Close  for  the  channel;  the  channel  will  be  closed  automatically  when  it  is
       unregistered from the interpreter.

       Code  executing outside of any Tcl interpreter can call Tcl_RegisterChannel with interp as
       NULL, to indicate that it wishes to hold a reference to this  channel.  Subsequently,  the
       channel  can  be  registered  in  a  Tcl  interpreter  and it will only be closed when the
       matching number of calls to  Tcl_UnregisterChannel  have  been  made.   This  allows  code
       executing  outside of any interpreter to safely hold a reference to a channel that is also
       registered in a Tcl interpreter.

       This procedure interacts with the code managing the  standard  channels.  If  no  standard
       channels  were  initialized  before  the  first call to Tcl_RegisterChannel, they will get
       initialized by that call. See Tcl_StandardChannels for a general treatise  about  standard
       channels and the behavior of the Tcl library with regard to them.

TCL_UNREGISTERCHANNEL

       Tcl_UnregisterChannel  removes  a  channel  from the set of channels accessible in interp.
       After this call, Tcl programs will no longer be able to use the channel's name to refer to
       the  channel  in that interpreter.  If this operation removed the last registration of the
       channel in any interpreter, the channel is also closed and destroyed.

       Code not associated with a Tcl interpreter can call Tcl_UnregisterChannel with  interp  as
       NULL,  to  indicate to Tcl that it no longer holds a reference to that channel. If this is
       the last reference to the channel, it will now be closed.  Tcl_UnregisterChannel  is  very
       similar  to  Tcl_DetachChannel  except  that  it will also close the channel if no further
       references to it exist.

TCL_DETACHCHANNEL

       Tcl_DetachChannel removes a channel from the set of channels accessible in  interp.  After
       this  call,  Tcl programs will no longer be able to use the channel's name to refer to the
       channel in that interpreter.  Beyond that, this command has no further effect.  It  cannot
       be  used  on  the  standard channels (stdout, stderr, stdin), and will return TCL_ERROR if
       passed one of those channels.

       Code not associated with a Tcl interpreter can call Tcl_DetachChannel with interp as NULL,
       to  indicate  to  Tcl  that it no longer holds a reference to that channel. If this is the
       last reference to the channel, unlike Tcl_UnregisterChannel, it will not be closed.

TCL_ISSTANDARDCHANNEL

       Tcl_IsStandardChannel tests whether a channel is  one  of  the  three  standard  channels,
       stdin, stdout or stderr.  If so, it returns 1, otherwise 0.

       No  attempt  is  made  to  check  whether  the  given channel or the standard channels are
       initialized or otherwise valid.

TCL_CLOSE

       Tcl_Close destroys the channel channel, which must denote a currently  open  channel.  The
       channel  should  not  be  registered in any interpreter when Tcl_Close is called. Buffered
       output is flushed to the channel's output device prior to destroying the channel, and  any
       buffered  input  is  discarded.   If  this is a blocking channel, the call does not return
       until all buffered data is successfully sent to the channel's output device.  If this is a
       nonblocking  channel and there is buffered output that cannot be written without blocking,
       the call returns immediately; output is flushed in the background and the channel will  be
       closed once all of the buffered data has been output.  In this case errors during flushing
       are not reported.

       If the channel was closed successfully, Tcl_Close returns TCL_OK.   If  an  error  occurs,
       Tcl_Close  returns  TCL_ERROR  and  records  a POSIX error code that can be retrieved with
       Tcl_GetErrno.  If the channel is being closed synchronously and  an  error  occurs  during
       closing  of  the  channel  and  interp  is  not  NULL,  an  error  message  is left in the
       interpreter's result.

       Note: it is not safe to call Tcl_Close  on  a  channel  that  has  been  registered  using
       Tcl_RegisterChannel; see the documentation for Tcl_RegisterChannel, above, for details. If
       the channel has ever been given as the chan argument in a call to Tcl_RegisterChannel, you
       should  instead  use  Tcl_UnregisterChannel, which will internally call Tcl_Close when all
       calls   to   Tcl_RegisterChannel   have   been   matched   by   corresponding   calls   to
       Tcl_UnregisterChannel.

TCL_READCHARS AND TCL_READ

       Tcl_ReadChars  consumes  bytes  from  channel,  converting the bytes to UTF-8 based on the
       channel's encoding and storing the produced data in  readObjPtr's  string  representation.
       The  return  value  of  Tcl_ReadChars is the number of characters, up to charsToRead, that
       were stored in readObjPtr.  If an error occurs while reading, the return value is  -1  and
       Tcl_ReadChars records a POSIX error code that can be retrieved with Tcl_GetErrno.

       Setting  charsToRead  to  -1  will  cause  the  command  to  read all characters currently
       available (non-blocking) or everything until eof (blocking mode).

       The return value may be smaller than the value to read, indicating  that  less  data  than
       requested  was  available.   This is called a short read.  In blocking mode, this can only
       happen on an end-of-file.  In nonblocking mode, a short read can also occur  if  there  is
       not  enough  input  currently  available:  Tcl_ReadChars returns a short count rather than
       waiting for more data.

       If the channel is in blocking mode, a  return  value  of  zero  indicates  an  end-of-file
       condition.  If the channel is in nonblocking mode, a return value of zero indicates either
       that no input is currently  available  or  an  end-of-file  condition.   Use  Tcl_Eof  and
       Tcl_InputBlocked to tell which of these conditions actually occurred.

       Tcl_ReadChars  translates  the  various  end-of-line representations into the canonical \n
       internal representation according to the current end-of-line  recognition  mode.   End-of-
       line recognition and the various platform-specific modes are described in the manual entry
       for the Tcl fconfigure command.

       As a performance optimization, when reading from a channel with the encoding  binary,  the
       bytes  are  not  converted  to  UTF-8  as  they  are  read.   Instead,  they are stored in
       readObjPtr's internal representation as a byte-array value.  The string representation  of
       this  value  will  only  be  constructed  if  it  is  needed  (e.g.,  because of a call to
       Tcl_GetStringFromObj).  In this way, byte-oriented  data  can  be  read  from  a  channel,
       manipulated  by calling Tcl_GetByteArrayFromObj and related functions, and then written to
       a channel without the expense of ever converting to or from UTF-8.

       Tcl_Read is similar to Tcl_ReadChars, except that it does  not  do  encoding  conversions,
       regardless  of  the  channel's  encoding.   It  is  deprecated  and  exists  for backwards
       compatibility with non-internationalized Tcl extensions.  It consumes bytes  from  channel
       and  stores  them  in readBuf, performing end-of-line translations on the way.  The return
       value of Tcl_Read is the number of bytes, up to  bytesToRead,  written  in  readBuf.   The
       buffer  produced  by  Tcl_Read  is  not  null-terminated.  Its contents are valid from the
       zeroth position up to and excluding the position indicated by the return value.

       Tcl_ReadRaw is the same as Tcl_Read but does not compensate for stacking.  While  Tcl_Read
       (and the other functions in the API) always get their data from the topmost channel in the
       stack the supplied channel is part of, Tcl_ReadRaw does not. Thus this  function  is  only
       usable for transformational channel drivers, i.e. drivers used in the middle of a stack of
       channels, to move data from the channel below into the transformation.

TCL_GETSOBJ AND TCL_GETS

       Tcl_GetsObj consumes bytes from channel, converting  the  bytes  to  UTF-8  based  on  the
       channel's  encoding,  until a full line of input has been seen.  If the channel's encoding
       is binary, each byte read from the channel is treated as an individual Unicode  character.
       All  of the characters of the line except for the terminating end-of-line character(s) are
       appended to lineObjPtr's string representation.  The end-of-line character(s) are read and
       discarded.

       If  a  line  was  successfully read, the return value is greater than or equal to zero and
       indicates the number of bytes stored in  lineObjPtr.   If  an  error  occurs,  Tcl_GetsObj
       returns  -1  and  records  a  POSIX  error  code  that can be retrieved with Tcl_GetErrno.
       Tcl_GetsObj also returns -1 if the end of the file is reached; the Tcl_Eof  procedure  can
       be used to distinguish an error from an end-of-file condition.

       If  the  channel  is  in  nonblocking mode, the return value can also be -1 if no data was
       available or the data that was available did not contain an end-of-line  character.   When
       -1  is returned, the Tcl_InputBlocked procedure may be invoked to determine if the channel
       is blocked because of input unavailability.

       Tcl_Gets is the same as Tcl_GetsObj except the resulting characters are  appended  to  the
       dynamic string given by lineRead rather than a Tcl value.

TCL_UNGETS

       Tcl_Ungets is used to add data to the input queue of a channel, at either the head or tail
       of the queue.  The pointer input points to the data that is to be added.   The  length  of
       the  input  to  add is given by inputLen.  A non-zero value of addAtEnd indicates that the
       data is to be added at the end of queue; otherwise it will be added at  the  head  of  the
       queue.   If  channel  has  a  “sticky”  EOF set, no data will be added to the input queue.
       Tcl_Ungets returns inputLen or -1 if an error occurs.

TCL_WRITECHARS, TCL_WRITEOBJ, AND TCL_WRITE

       Tcl_WriteChars accepts bytesToWrite  bytes  of  character  data  at  charBuf.   The  UTF-8
       characters  in the buffer are converted to the channel's encoding and queued for output to
       channel.  If  bytesToWrite  is  negative,  Tcl_WriteChars  expects  charBuf  to  be  null-
       terminated and it outputs everything up to the null.

       Data  queued  for  output may not appear on the output device immediately, due to internal
       buffering.  If the data should appear  immediately,  call  Tcl_Flush  after  the  call  to
       Tcl_WriteChars, or set the -buffering option on the channel to none.  If you wish the data
       to appear as soon as a complete line is accepted for output, set the -buffering option  on
       the channel to line mode.

       The  return  value of Tcl_WriteChars is a count of how many bytes were accepted for output
       to the channel.  This is either greater than zero to indicate success or  -1  to  indicate
       that  an  error  occurred.   If an error occurs, Tcl_WriteChars records a POSIX error code
       that may be retrieved with Tcl_GetErrno.

       Newline characters in the output data  are  translated  to  platform-specific  end-of-line
       sequences  according to the -translation option for the channel.  This is done even if the
       channel has no encoding.

       Tcl_WriteObj is similar to Tcl_WriteChars except it accepts a  Tcl  value  whose  contents
       will   be   output   to  the  channel.   The  UTF-8  characters  in  writeObjPtr's  string
       representation are converted to the channel's encoding and queued for output  to  channel.
       As  a  performance optimization, when writing to a channel with the encoding binary, UTF-8
       characters are not converted as they are written.  Instead,  the  bytes  in  writeObjPtr's
       internal  representation as a byte-array value are written to the channel.  The byte-array
       representation of the value will be constructed if it  is  needed.   In  this  way,  byte-
       oriented  data  can be read from a channel, manipulated by calling Tcl_GetByteArrayFromObj
       and related functions, and  then  written  to  a  channel  without  the  expense  of  ever
       converting to or from UTF-8.

       Tcl_Write  is  similar  to Tcl_WriteChars except that it does not do encoding conversions,
       regardless of  the  channel's  encoding.   It  is  deprecated  and  exists  for  backwards
       compatibility with non-internationalized Tcl extensions.  It accepts bytesToWrite bytes of
       data at byteBuf and queues them for output  to  channel.   If  bytesToWrite  is  negative,
       Tcl_Write expects byteBuf to be null-terminated and it outputs everything up to the null.

       Tcl_WriteRaw  is  the  same  as  Tcl_Write  but  does  not  compensate for stacking. While
       Tcl_Write (and the other functions in the API) always feed  their  input  to  the  topmost
       channel  in  the  stack  the supplied channel is part of, Tcl_WriteRaw does not. Thus this
       function is only usable for transformational channel drivers, i.e.  drivers  used  in  the
       middle of a stack of channels, to move data from the transformation into the channel below
       it.

TCL_FLUSH

       Tcl_Flush causes all of the buffered  output  data  for  channel  to  be  written  to  its
       underlying  file  or  device as soon as possible.  If the channel is in blocking mode, the
       call does not return until all the buffered data has been sent  to  the  channel  or  some
       error  occurred.   The call returns immediately if the channel is nonblocking; it starts a
       background flush that will write the buffered data to the channel eventually, as  fast  as
       the channel is able to absorb it.

       The  return value is normally TCL_OK.  If an error occurs, Tcl_Flush returns TCL_ERROR and
       records a POSIX error code that can be retrieved with Tcl_GetErrno.

TCL_SEEK

       Tcl_Seek moves the access point in channel where subsequent data will be read or  written.
       Buffered  output  is  flushed to the channel and buffered input is discarded, prior to the
       seek operation.

       Tcl_Seek normally returns the new access point.  If an error occurs, Tcl_Seek  returns  -1
       and  records  a POSIX error code that can be retrieved with Tcl_GetErrno.  After an error,
       the access point may or may not have been moved.

TCL_TELL

       Tcl_Tell returns the current access point for a channel. The returned value is -1  if  the
       channel does not support seeking.

TCL_TRUNCATECHANNEL

       Tcl_TruncateChannel  truncates  the file underlying channel to a given length of bytes. It
       returns TCL_OK if the operation succeeded, and TCL_ERROR otherwise.

TCL_GETCHANNELOPTION

       Tcl_GetChannelOption retrieves, in optionValue, the value of one of the options  currently
       in  effect for a channel, or a list of all options and their values.  The channel argument
       identifies the channel for which to query an option or  retrieve  all  options  and  their
       values.   If  optionName  is not NULL, it is the name of the option to query; the option's
       value is copied to the Tcl dynamic string denoted by optionValue. If optionName  is  NULL,
       the  function  stores an alternating list of option names and their values in optionValue,
       using a series of calls to Tcl_DStringAppendElement. The various preexisting  options  and
       their  possible  values  are described in the manual entry for the Tcl fconfigure command.
       Other options can be added by each channel type.  These channel type specific options  are
       described in the manual entry for the Tcl command that creates a channel of that type; for
       example, the additional options for TCP based channels are described in the  manual  entry
       for the Tcl socket command.  The procedure normally returns TCL_OK. If an error occurs, it
       returns TCL_ERROR and calls Tcl_SetErrno to store an appropriate POSIX error code.

TCL_SETCHANNELOPTION

       Tcl_SetChannelOption sets a new value newValue for an option optionName on  channel.   The
       procedure  normally  returns  TCL_OK.   If  an  error  occurs,  it  returns TCL_ERROR;  in
       addition, if interp is non-NULL, Tcl_SetChannelOption  leaves  an  error  message  in  the
       interpreter's result.

TCL_EOF

       Tcl_Eof  returns  a  nonzero  value  if channel encountered an end of file during the last
       input operation.

TCL_INPUTBLOCKED

       Tcl_InputBlocked returns a nonzero value if channel is in nonblocking mode  and  the  last
       input  operation  returned  less  data  than requested because there was insufficient data
       available.  The call always returns zero if the channel is in blocking mode.

TCL_INPUTBUFFERED

       Tcl_InputBuffered returns the number of bytes of input currently buffered in the  internal
       buffers  for  a  channel.  If  the  channel  is not open for reading, this function always
       returns zero.

TCL_OUTPUTBUFFERED

       Tcl_OutputBuffered returns the number  of  bytes  of  output  currently  buffered  in  the
       internal  buffers  for  a  channel.  If the channel is not open for writing, this function
       always returns zero.

PLATFORM ISSUES

       The handles returned from Tcl_GetChannelHandle depend on  the  platform  and  the  channel
       type.  On Unix platforms, the handle is always a Unix file descriptor as returned from the
       open system call.  On Windows platforms, the handle is a file HANDLE when the channel  was
       created  with  Tcl_OpenFileChannel, Tcl_OpenCommandChannel, or Tcl_MakeFileChannel.  Other
       channel types may return a different type of handle on Windows platforms.

SEE ALSO

       DString(3tcl), fconfigure(3tcl), filename(3tcl), fopen(3), Tcl_CreateChannel(3tcl)

KEYWORDS

       access point, blocking, buffered I/O, channel, channel driver, end of file, flush,  input,
       nonblocking, output, read, seek, write