| [25] | 1 | '\" | 
|---|
 | 2 | '\" Copyright (c) 1996-1997 Sun Microsystems, Inc. | 
|---|
 | 3 | '\" Copyright (c) 1997-2000 Ajuba Solutions. | 
|---|
 | 4 | '\" | 
|---|
 | 5 | '\" See the file "license.terms" for information on usage and redistribution | 
|---|
 | 6 | '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. | 
|---|
 | 7 | '\" | 
|---|
 | 8 | '\" RCS: @(#) $Id: CrtChannel.3,v 1.40 2007/12/13 15:22:30 dgp Exp $ | 
|---|
 | 9 | .so man.macros | 
|---|
 | 10 | .TH Tcl_CreateChannel 3 8.4 Tcl "Tcl Library Procedures" | 
|---|
 | 11 | .BS | 
|---|
 | 12 | '\" Note:  do not modify the .SH NAME line immediately below! | 
|---|
 | 13 | .SH NAME | 
|---|
 | 14 | Tcl_CreateChannel, Tcl_GetChannelInstanceData, Tcl_GetChannelType, Tcl_GetChannelName, Tcl_GetChannelHandle, Tcl_GetChannelMode, Tcl_GetChannelBufferSize, Tcl_SetChannelBufferSize, Tcl_NotifyChannel, Tcl_BadChannelOption, Tcl_ChannelName, Tcl_ChannelVersion, Tcl_ChannelBlockModeProc, Tcl_ChannelCloseProc, Tcl_ChannelClose2Proc, Tcl_ChannelInputProc, Tcl_ChannelOutputProc, Tcl_ChannelSeekProc, Tcl_ChannelWideSeekProc, Tcl_ChannelTruncateProc, Tcl_ChannelSetOptionProc, Tcl_ChannelGetOptionProc, Tcl_ChannelWatchProc, Tcl_ChannelGetHandleProc, Tcl_ChannelFlushProc, Tcl_ChannelHandlerProc, Tcl_ChannelThreadActionProc, Tcl_IsChannelShared, Tcl_IsChannelRegistered, Tcl_CutChannel, Tcl_SpliceChannel, Tcl_IsChannelExisting, Tcl_ClearChannelHandlers, Tcl_GetChannelThread, Tcl_ChannelBuffered \- procedures for creating and manipulating channels | 
|---|
 | 15 | .SH SYNOPSIS | 
|---|
 | 16 | .nf | 
|---|
 | 17 | \fB#include <tcl.h>\fR | 
|---|
 | 18 | .sp | 
|---|
 | 19 | Tcl_Channel | 
|---|
 | 20 | \fBTcl_CreateChannel\fR(\fItypePtr, channelName, instanceData, mask\fR) | 
|---|
 | 21 | .sp | 
|---|
 | 22 | ClientData | 
|---|
 | 23 | \fBTcl_GetChannelInstanceData\fR(\fIchannel\fR) | 
|---|
 | 24 | .sp | 
|---|
 | 25 | Tcl_ChannelType * | 
|---|
 | 26 | \fBTcl_GetChannelType\fR(\fIchannel\fR) | 
|---|
 | 27 | .sp | 
|---|
 | 28 | const char * | 
|---|
 | 29 | \fBTcl_GetChannelName\fR(\fIchannel\fR) | 
|---|
 | 30 | .sp | 
|---|
 | 31 | int | 
|---|
 | 32 | \fBTcl_GetChannelHandle\fR(\fIchannel, direction, handlePtr\fR) | 
|---|
 | 33 | .sp | 
|---|
 | 34 | Tcl_ThreadId | 
|---|
 | 35 | \fBTcl_GetChannelThread\fR(\fIchannel\fR) | 
|---|
 | 36 | .sp | 
|---|
 | 37 | int | 
|---|
 | 38 | \fBTcl_GetChannelMode\fR(\fIchannel\fR) | 
|---|
 | 39 | .sp | 
|---|
 | 40 | int | 
|---|
 | 41 | \fBTcl_GetChannelBufferSize\fR(\fIchannel\fR) | 
|---|
 | 42 | .sp | 
|---|
 | 43 | \fBTcl_SetChannelBufferSize\fR(\fIchannel, size\fR) | 
|---|
 | 44 | .sp | 
|---|
 | 45 | \fBTcl_NotifyChannel\fR(\fIchannel, mask\fR) | 
|---|
 | 46 | .sp | 
|---|
 | 47 | int | 
|---|
 | 48 | \fBTcl_BadChannelOption\fR(\fIinterp, optionName, optionList\fR) | 
|---|
 | 49 | .sp | 
|---|
 | 50 | int | 
|---|
 | 51 | \fBTcl_IsChannelShared\fR(\fIchannel\fR) | 
|---|
 | 52 | .sp | 
|---|
 | 53 | int | 
|---|
 | 54 | \fBTcl_IsChannelRegistered\fR(\fIinterp, channel\fR) | 
|---|
 | 55 | .sp | 
|---|
 | 56 | int | 
|---|
 | 57 | \fBTcl_IsChannelExisting\fR(\fIchannelName\fR) | 
|---|
 | 58 | .sp | 
|---|
 | 59 | void | 
|---|
 | 60 | \fBTcl_CutChannel\fR(\fIchannel\fR) | 
|---|
 | 61 | .sp | 
|---|
 | 62 | void | 
|---|
 | 63 | \fBTcl_SpliceChannel\fR(\fIchannel\fR) | 
|---|
 | 64 | .sp | 
|---|
 | 65 | void | 
|---|
 | 66 | \fBTcl_ClearChannelHandlers\fR(\fIchannel\fR) | 
|---|
 | 67 | .sp | 
|---|
 | 68 | int | 
|---|
 | 69 | \fBTcl_ChannelBuffered\fR(\fIchannel\fR) | 
|---|
 | 70 | .sp | 
|---|
 | 71 | const char * | 
|---|
 | 72 | \fBTcl_ChannelName\fR(\fItypePtr\fR) | 
|---|
 | 73 | .sp | 
|---|
 | 74 | Tcl_ChannelTypeVersion | 
|---|
 | 75 | \fBTcl_ChannelVersion\fR(\fItypePtr\fR) | 
|---|
 | 76 | .sp | 
|---|
 | 77 | Tcl_DriverBlockModeProc * | 
|---|
 | 78 | \fBTcl_ChannelBlockModeProc\fR(\fItypePtr\fR) | 
|---|
 | 79 | .sp | 
|---|
 | 80 | Tcl_DriverCloseProc * | 
|---|
 | 81 | \fBTcl_ChannelCloseProc\fR(\fItypePtr\fR) | 
|---|
 | 82 | .sp | 
|---|
 | 83 | Tcl_DriverClose2Proc * | 
|---|
 | 84 | \fBTcl_ChannelClose2Proc\fR(\fItypePtr\fR) | 
|---|
 | 85 | .sp | 
|---|
 | 86 | Tcl_DriverInputProc * | 
|---|
 | 87 | \fBTcl_ChannelInputProc\fR(\fItypePtr\fR) | 
|---|
 | 88 | .sp | 
|---|
 | 89 | Tcl_DriverOutputProc * | 
|---|
 | 90 | \fBTcl_ChannelOutputProc\fR(\fItypePtr\fR) | 
|---|
 | 91 | .sp | 
|---|
 | 92 | Tcl_DriverSeekProc * | 
|---|
 | 93 | \fBTcl_ChannelSeekProc\fR(\fItypePtr\fR) | 
|---|
 | 94 | .sp | 
|---|
 | 95 | Tcl_DriverWideSeekProc * | 
|---|
 | 96 | \fBTcl_ChannelWideSeekProc\fR(\fItypePtr\fR) | 
|---|
 | 97 | .sp | 
|---|
 | 98 | Tcl_DriverThreadActionProc * | 
|---|
 | 99 | \fBTcl_ChannelThreadActionProc\fR(\fItypePtr\fR) | 
|---|
 | 100 | .sp | 
|---|
 | 101 | .VS 8.5 | 
|---|
 | 102 | Tcl_DriverTruncateProc * | 
|---|
 | 103 | \fBTcl_ChannelTruncateProc\fR(\fItypePtr\fR) | 
|---|
 | 104 | .VE 8.5 | 
|---|
 | 105 | .sp | 
|---|
 | 106 | Tcl_DriverSetOptionProc * | 
|---|
 | 107 | \fBTcl_ChannelSetOptionProc\fR(\fItypePtr\fR) | 
|---|
 | 108 | .sp | 
|---|
 | 109 | Tcl_DriverGetOptionProc * | 
|---|
 | 110 | \fBTcl_ChannelGetOptionProc\fR(\fItypePtr\fR) | 
|---|
 | 111 | .sp | 
|---|
 | 112 | Tcl_DriverWatchProc * | 
|---|
 | 113 | \fBTcl_ChannelWatchProc\fR(\fItypePtr\fR) | 
|---|
 | 114 | .sp | 
|---|
 | 115 | Tcl_DriverGetHandleProc * | 
|---|
 | 116 | \fBTcl_ChannelGetHandleProc\fR(\fItypePtr\fR) | 
|---|
 | 117 | .sp | 
|---|
 | 118 | Tcl_DriverFlushProc * | 
|---|
 | 119 | \fBTcl_ChannelFlushProc\fR(\fItypePtr\fR) | 
|---|
 | 120 | .sp | 
|---|
 | 121 | Tcl_DriverHandlerProc * | 
|---|
 | 122 | \fBTcl_ChannelHandlerProc\fR(\fItypePtr\fR) | 
|---|
 | 123 | .sp | 
|---|
 | 124 | .SH ARGUMENTS | 
|---|
 | 125 | .AS "const Tcl_ChannelType" *channelName | 
|---|
 | 126 | .AP "const Tcl_ChannelType" *typePtr in | 
|---|
 | 127 | Points to a structure containing the addresses of procedures that | 
|---|
 | 128 | can be called to perform I/O and other functions on the channel. | 
|---|
 | 129 | .AP "const char" *channelName in | 
|---|
 | 130 | The name of this channel, such as \fBfile3\fR; must not be in use | 
|---|
 | 131 | by any other channel. Can be NULL, in which case the channel is | 
|---|
 | 132 | created without a name. | 
|---|
 | 133 | .AP ClientData instanceData in | 
|---|
 | 134 | Arbitrary one-word value to be associated with this channel.  This | 
|---|
 | 135 | value is passed to procedures in \fItypePtr\fR when they are invoked. | 
|---|
 | 136 | .AP int mask in | 
|---|
 | 137 | OR-ed combination of \fBTCL_READABLE\fR and \fBTCL_WRITABLE\fR to indicate | 
|---|
 | 138 | whether a channel is readable and writable. | 
|---|
 | 139 | .AP Tcl_Channel channel in | 
|---|
 | 140 | The channel to operate on. | 
|---|
 | 141 | .AP int direction in | 
|---|
 | 142 | \fBTCL_READABLE\fR means the input handle is wanted; \fBTCL_WRITABLE\fR | 
|---|
 | 143 | means the output handle is wanted. | 
|---|
 | 144 | .AP ClientData *handlePtr out | 
|---|
 | 145 | Points to the location where the desired OS-specific handle should be | 
|---|
 | 146 | stored. | 
|---|
 | 147 | .AP int size in | 
|---|
 | 148 | The size, in bytes, of buffers to allocate in this channel. | 
|---|
 | 149 | .AP int mask in | 
|---|
 | 150 | An OR-ed combination of \fBTCL_READABLE\fR, \fBTCL_WRITABLE\fR | 
|---|
 | 151 | and \fBTCL_EXCEPTION\fR that indicates events that have occurred on | 
|---|
 | 152 | this channel. | 
|---|
 | 153 | .AP Tcl_Interp *interp in | 
|---|
 | 154 | Current interpreter. (can be NULL) | 
|---|
 | 155 | .AP "const char" *optionName in | 
|---|
 | 156 | Name of the invalid option. | 
|---|
 | 157 | .AP "const char" *optionList in | 
|---|
 | 158 | Specific options list (space separated words, without | 
|---|
 | 159 | .QW \- ) | 
|---|
 | 160 | to append to the standard generic options list. | 
|---|
 | 161 | Can be NULL for generic options error message only. | 
|---|
 | 162 |  | 
|---|
 | 163 | .BE | 
|---|
 | 164 |  | 
|---|
 | 165 | .SH DESCRIPTION | 
|---|
 | 166 | .PP | 
|---|
 | 167 | Tcl uses a two-layered channel architecture. It provides a generic upper | 
|---|
 | 168 | layer to enable C and Tcl programs to perform input and output using the | 
|---|
 | 169 | same APIs for a variety of files, devices, sockets etc. The generic C APIs | 
|---|
 | 170 | are described in the manual entry for \fBTcl_OpenFileChannel\fR. | 
|---|
 | 171 | .PP | 
|---|
 | 172 | The lower layer provides type-specific channel drivers for each type | 
|---|
 | 173 | of device supported on each platform.  This manual entry describes the | 
|---|
 | 174 | C APIs used to communicate between the generic layer and the | 
|---|
 | 175 | type-specific channel drivers.  It also explains how new types of | 
|---|
 | 176 | channels can be added by providing new channel drivers. | 
|---|
 | 177 | .PP | 
|---|
 | 178 | Channel drivers consist of a number of components: First, each channel | 
|---|
 | 179 | driver provides a \fBTcl_ChannelType\fR structure containing pointers to | 
|---|
 | 180 | functions implementing the various operations used by the generic layer to | 
|---|
 | 181 | communicate with the channel driver. The \fBTcl_ChannelType\fR structure | 
|---|
 | 182 | and the functions referenced by it are described in the section | 
|---|
 | 183 | \fBTCL_CHANNELTYPE\fR, below. | 
|---|
 | 184 | .PP | 
|---|
 | 185 | Second, channel drivers usually provide a Tcl command to create | 
|---|
 | 186 | instances of that type of channel. For example, the Tcl \fBopen\fR | 
|---|
 | 187 | command creates channels that use the file and command channel | 
|---|
 | 188 | drivers, and the Tcl \fBsocket\fR command creates channels that use | 
|---|
 | 189 | TCP sockets for network communication. | 
|---|
 | 190 | .PP | 
|---|
 | 191 | Third, a channel driver optionally provides a C function to open | 
|---|
 | 192 | channel instances of that type. For example, \fBTcl_OpenFileChannel\fR | 
|---|
 | 193 | opens a channel that uses the file channel driver, and | 
|---|
 | 194 | \fBTcl_OpenTcpClient\fR opens a channel that uses the TCP network | 
|---|
 | 195 | protocol.  These creation functions typically use | 
|---|
 | 196 | \fBTcl_CreateChannel\fR internally to open the channel. | 
|---|
 | 197 | .PP | 
|---|
 | 198 | To add a new type of channel you must implement a C API or a Tcl command | 
|---|
 | 199 | that opens a channel by invoking \fBTcl_CreateChannel\fR. | 
|---|
 | 200 | When your driver calls \fBTcl_CreateChannel\fR it passes in | 
|---|
 | 201 | a \fBTcl_ChannelType\fR structure describing the driver's I/O | 
|---|
 | 202 | procedures. | 
|---|
 | 203 | The generic layer will then invoke the functions referenced in that | 
|---|
 | 204 | structure to perform operations on the channel. | 
|---|
 | 205 | .PP | 
|---|
 | 206 | \fBTcl_CreateChannel\fR opens a new channel and associates the supplied | 
|---|
 | 207 | \fItypePtr\fR and \fIinstanceData\fR with it. The channel is opened in the | 
|---|
 | 208 | mode indicated by \fImask\fR. | 
|---|
 | 209 | For a discussion of channel drivers, their operations and the | 
|---|
 | 210 | \fBTcl_ChannelType\fR structure, see the section \fBTCL_CHANNELTYPE\fR, below. | 
|---|
 | 211 | .PP | 
|---|
 | 212 | \fBTcl_CreateChannel\fR interacts with the code managing the standard | 
|---|
 | 213 | channels. Once a standard channel was initialized either through a | 
|---|
 | 214 | call to \fBTcl_GetStdChannel\fR or a call to \fBTcl_SetStdChannel\fR | 
|---|
 | 215 | closing this standard channel will cause the next call to | 
|---|
 | 216 | \fBTcl_CreateChannel\fR to make the new channel the new standard | 
|---|
 | 217 | channel too. See \fBTcl_StandardChannels\fR for a general treatise | 
|---|
 | 218 | about standard channels and the behaviour of the Tcl library with | 
|---|
 | 219 | regard to them. | 
|---|
 | 220 | .PP | 
|---|
 | 221 | \fBTcl_GetChannelInstanceData\fR returns the instance data associated with | 
|---|
 | 222 | the channel in \fIchannel\fR. This is the same as the \fIinstanceData\fR | 
|---|
 | 223 | argument in the call to \fBTcl_CreateChannel\fR that created this channel. | 
|---|
 | 224 | .PP | 
|---|
 | 225 | \fBTcl_GetChannelType\fR returns a pointer to the \fBTcl_ChannelType\fR | 
|---|
 | 226 | structure used by the channel in the \fIchannel\fR argument. This is | 
|---|
 | 227 | the same as the \fItypePtr\fR argument in the call to | 
|---|
 | 228 | \fBTcl_CreateChannel\fR that created this channel. | 
|---|
 | 229 | .PP | 
|---|
 | 230 | \fBTcl_GetChannelName\fR returns a string containing the name associated | 
|---|
 | 231 | with the channel, or NULL if the \fIchannelName\fR argument to | 
|---|
 | 232 | \fBTcl_CreateChannel\fR was NULL. | 
|---|
 | 233 | .PP | 
|---|
 | 234 | \fBTcl_GetChannelHandle\fR places the OS-specific device handle | 
|---|
 | 235 | associated with \fIchannel\fR for the given \fIdirection\fR in the | 
|---|
 | 236 | location specified by \fIhandlePtr\fR and returns \fBTCL_OK\fR.  If | 
|---|
 | 237 | the channel does not have a device handle for the specified direction, | 
|---|
 | 238 | then \fBTCL_ERROR\fR is returned instead.  Different channel drivers | 
|---|
 | 239 | will return different types of handle.  Refer to the manual entries | 
|---|
 | 240 | for each driver to determine what type of handle is returned. | 
|---|
 | 241 | .PP | 
|---|
 | 242 | \fBTcl_GetChannelThread\fR returns the id of the thread currently managing | 
|---|
 | 243 | the specified \fIchannel\fR. This allows channel drivers to send their file | 
|---|
 | 244 | events to the correct event queue even for a multi-threaded core. | 
|---|
 | 245 | .PP | 
|---|
 | 246 | \fBTcl_GetChannelMode\fR returns an OR-ed combination of \fBTCL_READABLE\fR | 
|---|
 | 247 | and \fBTCL_WRITABLE\fR, indicating whether the channel is open for input | 
|---|
 | 248 | and output. | 
|---|
 | 249 | .PP | 
|---|
 | 250 | \fBTcl_GetChannelBufferSize\fR returns the size, in bytes, of buffers | 
|---|
 | 251 | allocated to store input or output in \fIchannel\fR. If the value was not set | 
|---|
 | 252 | by a previous call to \fBTcl_SetChannelBufferSize\fR, described below, then | 
|---|
 | 253 | the default value of 4096 is returned. | 
|---|
 | 254 | .PP | 
|---|
 | 255 | \fBTcl_SetChannelBufferSize\fR sets the size, in bytes, of buffers that | 
|---|
 | 256 | will be allocated in subsequent operations on the channel to store input or | 
|---|
 | 257 | output. The \fIsize\fR argument should be between ten and one million, | 
|---|
 | 258 | allowing buffers of ten bytes to one million bytes. If \fIsize\fR is | 
|---|
 | 259 | outside this range, \fBTcl_SetChannelBufferSize\fR sets the buffer size to | 
|---|
 | 260 | 4096. | 
|---|
 | 261 | .PP | 
|---|
 | 262 | \fBTcl_NotifyChannel\fR is called by a channel driver to indicate to | 
|---|
 | 263 | the generic layer that the events specified by \fImask\fR have | 
|---|
 | 264 | occurred on the channel.  Channel drivers are responsible for invoking | 
|---|
 | 265 | this function whenever the channel handlers need to be called for the | 
|---|
 | 266 | channel.  See \fBWATCHPROC\fR below for more details. | 
|---|
 | 267 | .PP | 
|---|
 | 268 | \fBTcl_BadChannelOption\fR is called from driver specific | 
|---|
 | 269 | \fIsetOptionProc\fR or \fIgetOptionProc\fR to generate a complete | 
|---|
 | 270 | error message. | 
|---|
 | 271 | .PP | 
|---|
 | 272 | \fBTcl_ChannelBuffered\fR returns the number of bytes of input | 
|---|
 | 273 | currently buffered in the internal buffer (push back area) of the | 
|---|
 | 274 | channel itself. It does not report about the data in the overall | 
|---|
 | 275 | buffers for the stack of channels the supplied channel is part of. | 
|---|
 | 276 | .PP | 
|---|
 | 277 | \fBTcl_IsChannelShared\fR checks the refcount of the specified | 
|---|
 | 278 | \fIchannel\fR and returns whether the \fIchannel\fR was shared among | 
|---|
 | 279 | multiple interpreters (result == 1) or not (result == 0). | 
|---|
 | 280 | .PP | 
|---|
 | 281 | \fBTcl_IsChannelRegistered\fR checks whether the specified \fIchannel\fR is | 
|---|
 | 282 | registered in the given \fIinterp\fRreter (result == 1) or not | 
|---|
 | 283 | (result == 0). | 
|---|
 | 284 | .PP | 
|---|
 | 285 | \fBTcl_IsChannelExisting\fR checks whether a channel with the specified | 
|---|
 | 286 | name is registered in the (thread)-global list of all channels (result | 
|---|
 | 287 | == 1) or not (result == 0). | 
|---|
 | 288 | .PP | 
|---|
 | 289 | \fBTcl_CutChannel\fR removes the specified \fIchannel\fR from the | 
|---|
 | 290 | (thread)global list of all channels (of the current thread). | 
|---|
 | 291 | Application to a channel still registered in some interpreter | 
|---|
 | 292 | is not allowed. | 
|---|
 | 293 | .VS 8.5 | 
|---|
 | 294 | Also notifies the driver if the \fBTcl_ChannelType\fR version is | 
|---|
 | 295 | \fBTCL_CHANNEL_VERSION_4\fR (or higher), and | 
|---|
 | 296 | \fBTcl_DriverThreadActionProc\fR is defined for it. | 
|---|
 | 297 | .VE 8.5 | 
|---|
 | 298 | .PP | 
|---|
 | 299 | \fBTcl_SpliceChannel\fR adds the specified \fIchannel\fR to the | 
|---|
 | 300 | (thread)global list of all channels (of the current thread). | 
|---|
 | 301 | Application to a channel registered in some interpreter is not allowed. | 
|---|
 | 302 | .VS 8.5 | 
|---|
 | 303 | Also notifies the driver if the \fBTcl_ChannelType\fR version is | 
|---|
 | 304 | \fBTCL_CHANNEL_VERSION_4\fR (or higher), and | 
|---|
 | 305 | \fBTcl_DriverThreadActionProc\fR is defined for it. | 
|---|
 | 306 | .VE 8.5 | 
|---|
 | 307 | .PP | 
|---|
 | 308 | \fBTcl_ClearChannelHandlers\fR removes all channelhandlers and event | 
|---|
 | 309 | scripts associated with the specified \fIchannel\fR, thus shutting | 
|---|
 | 310 | down all event processing for this channel. | 
|---|
 | 311 | .SH TCL_CHANNELTYPE | 
|---|
 | 312 | .PP | 
|---|
 | 313 | A channel driver provides a \fBTcl_ChannelType\fR structure that contains | 
|---|
 | 314 | pointers to functions that implement the various operations on a channel; | 
|---|
 | 315 | these operations are invoked as needed by the generic layer.  The structure | 
|---|
 | 316 | was versioned starting in Tcl 8.3.2/8.4 to correct a problem with stacked | 
|---|
 | 317 | channel drivers.  See the \fBOLD CHANNEL TYPES\fR section below for | 
|---|
 | 318 | details about the old structure. | 
|---|
 | 319 | .PP | 
|---|
 | 320 | The \fBTcl_ChannelType\fR structure contains the following fields: | 
|---|
 | 321 | .CS | 
|---|
 | 322 | typedef struct Tcl_ChannelType { | 
|---|
 | 323 |         char *\fItypeName\fR; | 
|---|
 | 324 |         Tcl_ChannelTypeVersion \fIversion\fR; | 
|---|
 | 325 |         Tcl_DriverCloseProc *\fIcloseProc\fR; | 
|---|
 | 326 |         Tcl_DriverInputProc *\fIinputProc\fR; | 
|---|
 | 327 |         Tcl_DriverOutputProc *\fIoutputProc\fR; | 
|---|
 | 328 |         Tcl_DriverSeekProc *\fIseekProc\fR; | 
|---|
 | 329 |         Tcl_DriverSetOptionProc *\fIsetOptionProc\fR; | 
|---|
 | 330 |         Tcl_DriverGetOptionProc *\fIgetOptionProc\fR; | 
|---|
 | 331 |         Tcl_DriverWatchProc *\fIwatchProc\fR; | 
|---|
 | 332 |         Tcl_DriverGetHandleProc *\fIgetHandleProc\fR; | 
|---|
 | 333 |         Tcl_DriverClose2Proc *\fIclose2Proc\fR; | 
|---|
 | 334 |         Tcl_DriverBlockModeProc *\fIblockModeProc\fR; | 
|---|
 | 335 |         Tcl_DriverFlushProc *\fIflushProc\fR; | 
|---|
 | 336 |         Tcl_DriverHandlerProc *\fIhandlerProc\fR; | 
|---|
 | 337 |         Tcl_DriverWideSeekProc *\fIwideSeekProc\fR; | 
|---|
 | 338 |         Tcl_DriverThreadActionProc *\fIthreadActionProc\fR; | 
|---|
 | 339 | .VS 8.5 | 
|---|
 | 340 |         Tcl_DriverTruncateProc *\fItruncateProc\fR; | 
|---|
 | 341 | .VE 8.5 | 
|---|
 | 342 | } Tcl_ChannelType; | 
|---|
 | 343 | .CE | 
|---|
 | 344 | .PP | 
|---|
 | 345 | It is not necessary to provide implementations for all channel | 
|---|
 | 346 | operations.  Those which are not necessary may be set to NULL in the | 
|---|
 | 347 | struct: \fIblockModeProc\fR, \fIseekProc\fR, \fIsetOptionProc\fR, | 
|---|
 | 348 | \fIgetOptionProc\fR, and \fIclose2Proc\fR, in addition to | 
|---|
 | 349 | \fIflushProc\fR, \fIhandlerProc\fR, \fIthreadActionProc\fR, and | 
|---|
 | 350 | \fItruncateProc\fR.  Other functions that cannot be implemented in a | 
|---|
 | 351 | meaningful way should return \fBEINVAL\fR when called, to indicate | 
|---|
 | 352 | that the operations they represent are not available. Also note that | 
|---|
 | 353 | \fIwideSeekProc\fR can be NULL if \fIseekProc\fR is. | 
|---|
 | 354 | .PP | 
|---|
 | 355 | The user should only use the above structure for \fBTcl_ChannelType\fR | 
|---|
 | 356 | instantiation.  When referencing fields in a \fBTcl_ChannelType\fR | 
|---|
 | 357 | structure, the following functions should be used to obtain the values: | 
|---|
 | 358 | \fBTcl_ChannelName\fR, \fBTcl_ChannelVersion\fR, | 
|---|
 | 359 | \fBTcl_ChannelBlockModeProc\fR, \fBTcl_ChannelCloseProc\fR, | 
|---|
 | 360 | \fBTcl_ChannelClose2Proc\fR, \fBTcl_ChannelInputProc\fR, | 
|---|
 | 361 | \fBTcl_ChannelOutputProc\fR, \fBTcl_ChannelSeekProc\fR, | 
|---|
 | 362 | \fBTcl_ChannelWideSeekProc\fR, \fBTcl_ChannelThreadActionProc\fR, | 
|---|
 | 363 | .VS 8.5 | 
|---|
 | 364 | \fBTcl_ChannelTruncateProc\fR, | 
|---|
 | 365 | .VE 8.5 | 
|---|
 | 366 | \fBTcl_ChannelSetOptionProc\fR, \fBTcl_ChannelGetOptionProc\fR, | 
|---|
 | 367 | \fBTcl_ChannelWatchProc\fR, \fBTcl_ChannelGetHandleProc\fR, | 
|---|
 | 368 | \fBTcl_ChannelFlushProc\fR, or \fBTcl_ChannelHandlerProc\fR. | 
|---|
 | 369 | .PP | 
|---|
 | 370 | The change to the structures was made in such a way that standard channel | 
|---|
 | 371 | types are binary compatible.  However, channel types that use stacked | 
|---|
 | 372 | channels (i.e. TLS, Trf) have new versions to correspond to the above change | 
|---|
 | 373 | since the previous code for stacked channels had problems. | 
|---|
 | 374 | .SS TYPENAME | 
|---|
 | 375 | .PP | 
|---|
 | 376 | The \fItypeName\fR field contains a null-terminated string that | 
|---|
 | 377 | identifies the type of the device implemented by this driver, e.g. | 
|---|
 | 378 | \fBfile\fR or \fBsocket\fR. | 
|---|
 | 379 | .PP | 
|---|
 | 380 | This value can be retrieved with \fBTcl_ChannelName\fR, which returns | 
|---|
 | 381 | a pointer to the string. | 
|---|
 | 382 | .SS VERSION | 
|---|
 | 383 | .PP | 
|---|
 | 384 |  | 
|---|
 | 385 | The \fIversion\fR field should be set to the version of the structure | 
|---|
 | 386 | that you require. \fBTCL_CHANNEL_VERSION_2\fR is the minimum recommended. | 
|---|
 | 387 | \fBTCL_CHANNEL_VERSION_3\fR must be set to specifiy the \fIwideSeekProc\fR member. | 
|---|
 | 388 | \fBTCL_CHANNEL_VERSION_4\fR must be set to specifiy the \fIthreadActionProc\fR member | 
|---|
 | 389 | (includes \fIwideSeekProc\fR). | 
|---|
 | 390 | .VS 8.5 | 
|---|
 | 391 | \fBTCL_CHANNEL_VERSION_5\fR must be set to specifiy the | 
|---|
 | 392 | \fItruncateProc\fR members (includes | 
|---|
 | 393 | \fIwideSeekProc\fR and \fIthreadActionProc\fR). | 
|---|
 | 394 | .VE 8.5 | 
|---|
 | 395 | If it is not set to any of these, then this | 
|---|
 | 396 | \fBTcl_ChannelType\fR is assumed to have the original structure.  See | 
|---|
 | 397 | \fBOLD CHANNEL TYPES\fR for more details.  While Tcl will recognize | 
|---|
 | 398 | and function with either structures, stacked channels must be of at | 
|---|
 | 399 | least \fBTCL_CHANNEL_VERSION_2\fR to function correctly. | 
|---|
 | 400 | .PP | 
|---|
 | 401 | This value can be retrieved with \fBTcl_ChannelVersion\fR, which returns | 
|---|
 | 402 | one of | 
|---|
 | 403 | .VS 8.5 | 
|---|
 | 404 | \fBTCL_CHANNEL_VERSION_5\fR, | 
|---|
 | 405 | .VE 8.5 | 
|---|
 | 406 | \fBTCL_CHANNEL_VERSION_4\fR, | 
|---|
 | 407 | \fBTCL_CHANNEL_VERSION_3\fR, | 
|---|
 | 408 | \fBTCL_CHANNEL_VERSION_2\fR or \fBTCL_CHANNEL_VERSION_1\fR. | 
|---|
 | 409 | .SS BLOCKMODEPROC | 
|---|
 | 410 | .PP | 
|---|
 | 411 | The \fIblockModeProc\fR field contains the address of a function called by | 
|---|
 | 412 | the generic layer to set blocking and nonblocking mode on the device. | 
|---|
 | 413 | \fIBlockModeProc\fR should match the following prototype: | 
|---|
 | 414 | .PP | 
|---|
 | 415 | .CS | 
|---|
 | 416 | typedef int Tcl_DriverBlockModeProc( | 
|---|
 | 417 |         ClientData \fIinstanceData\fR, | 
|---|
 | 418 |         int \fImode\fR); | 
|---|
 | 419 | .CE | 
|---|
 | 420 | .PP | 
|---|
 | 421 | The \fIinstanceData\fR is the same as the value passed to | 
|---|
 | 422 | \fBTcl_CreateChannel\fR when this channel was created.  The \fImode\fR | 
|---|
 | 423 | argument is either \fBTCL_MODE_BLOCKING\fR or \fBTCL_MODE_NONBLOCKING\fR to | 
|---|
 | 424 | set the device into blocking or nonblocking mode. The function should | 
|---|
 | 425 | return zero if the operation was successful, or a nonzero POSIX error code | 
|---|
 | 426 | if the operation failed. | 
|---|
 | 427 | .PP | 
|---|
 | 428 | If the operation is successful, the function can modify the supplied | 
|---|
 | 429 | \fIinstanceData\fR to record that the channel entered blocking or | 
|---|
 | 430 | nonblocking mode and to implement the blocking or nonblocking behavior. | 
|---|
 | 431 | For some device types, the blocking and nonblocking behavior can be | 
|---|
 | 432 | implemented by the underlying operating system; for other device types, the | 
|---|
 | 433 | behavior must be emulated in the channel driver. | 
|---|
 | 434 | .PP | 
|---|
 | 435 | This value can be retrieved with \fBTcl_ChannelBlockModeProc\fR, which returns | 
|---|
 | 436 | a pointer to the function. | 
|---|
 | 437 | .PP | 
|---|
 | 438 | A channel driver \fBnot\fR supplying a \fIblockModeProc\fR has to be | 
|---|
 | 439 | very, very careful. It has to tell the generic layer exactly which | 
|---|
 | 440 | blocking mode is acceptable to it, and should this also document for | 
|---|
 | 441 | the user so that the blocking mode of the channel is not changed to an | 
|---|
 | 442 | inacceptable value. Any confusion here may lead the interpreter into a | 
|---|
 | 443 | (spurious and difficult to find) deadlock. | 
|---|
 | 444 | .SS "CLOSEPROC AND CLOSE2PROC" | 
|---|
 | 445 | .PP | 
|---|
 | 446 | The \fIcloseProc\fR field contains the address of a function called by the | 
|---|
 | 447 | generic layer to clean up driver-related information when the channel is | 
|---|
 | 448 | closed. \fICloseProc\fR must match the following prototype: | 
|---|
 | 449 | .PP | 
|---|
 | 450 | .CS | 
|---|
 | 451 | typedef int Tcl_DriverCloseProc( | 
|---|
 | 452 |         ClientData \fIinstanceData\fR, | 
|---|
 | 453 |         Tcl_Interp *\fIinterp\fR); | 
|---|
 | 454 | .CE | 
|---|
 | 455 | .PP | 
|---|
 | 456 | The \fIinstanceData\fR argument is the same as the value provided to | 
|---|
 | 457 | \fBTcl_CreateChannel\fR when the channel was created. The function should | 
|---|
 | 458 | release any storage maintained by the channel driver for this channel, and | 
|---|
 | 459 | close the input and output devices encapsulated by this channel. All queued | 
|---|
 | 460 | output will have been flushed to the device before this function is called, | 
|---|
 | 461 | and no further driver operations will be invoked on this instance after | 
|---|
 | 462 | calling the \fIcloseProc\fR. If the close operation is successful, the | 
|---|
 | 463 | procedure should return zero; otherwise it should return a nonzero POSIX | 
|---|
 | 464 | error code. In addition, if an error occurs and \fIinterp\fR is not NULL, | 
|---|
 | 465 | the procedure should store an error message in the interpreter's result. | 
|---|
 | 466 | .PP | 
|---|
 | 467 | Alternatively, channels that support closing the read and write sides | 
|---|
 | 468 | independently may set \fIcloseProc\fR to \fBTCL_CLOSE2PROC\fR and set | 
|---|
 | 469 | \fIclose2Proc\fR to the address of a function that matches the | 
|---|
 | 470 | following prototype: | 
|---|
 | 471 | .PP | 
|---|
 | 472 | .CS | 
|---|
 | 473 | typedef int Tcl_DriverClose2Proc( | 
|---|
 | 474 |         ClientData \fIinstanceData\fR, | 
|---|
 | 475 |         Tcl_Interp *\fIinterp\fR, | 
|---|
 | 476 |         int \fIflags\fR); | 
|---|
 | 477 | .CE | 
|---|
 | 478 | .PP | 
|---|
 | 479 | The \fIclose2Proc\fR will be called with \fIflags\fR set to an OR'ed | 
|---|
 | 480 | combination of \fBTCL_CLOSE_READ\fR or \fBTCL_CLOSE_WRITE\fR to | 
|---|
 | 481 | indicate that the driver should close the read and/or write side of | 
|---|
 | 482 | the channel.  The channel driver may be invoked to perform | 
|---|
 | 483 | additional operations on the channel after \fIclose2Proc\fR is | 
|---|
 | 484 | called to close one or both sides of the channel.  If \fIflags\fR is | 
|---|
 | 485 | \fB0\fR (zero), the driver should close the channel in the manner | 
|---|
 | 486 | described above for \fIcloseProc\fR.  No further operations will be | 
|---|
 | 487 | invoked on this instance after \fIclose2Proc\fR is called with all | 
|---|
 | 488 | flags cleared.  In all cases, the \fIclose2Proc\fR function should | 
|---|
 | 489 | return zero if the close operation was successful; otherwise it should | 
|---|
 | 490 | return a nonzero POSIX error code. In addition, if an error occurs and | 
|---|
 | 491 | \fIinterp\fR is not NULL, the procedure should store an error message | 
|---|
 | 492 | in the interpreter's result. | 
|---|
 | 493 | .PP | 
|---|
 | 494 | The \fIcloseProc\fR and \fIclose2Proc\fR values can be retrieved with | 
|---|
 | 495 | \fBTcl_ChannelCloseProc\fR or \fBTcl_ChannelClose2Proc\fR, which | 
|---|
 | 496 | return a pointer to the respective function. | 
|---|
 | 497 | .SS INPUTPROC | 
|---|
 | 498 | .PP | 
|---|
 | 499 | The \fIinputProc\fR field contains the address of a function called by the | 
|---|
 | 500 | generic layer to read data from the file or device and store it in an | 
|---|
 | 501 | internal buffer. \fIInputProc\fR must match the following prototype: | 
|---|
 | 502 | .PP | 
|---|
 | 503 | .CS | 
|---|
 | 504 | typedef int Tcl_DriverInputProc( | 
|---|
 | 505 |         ClientData \fIinstanceData\fR, | 
|---|
 | 506 |         char *\fIbuf\fR, | 
|---|
 | 507 |         int \fIbufSize\fR, | 
|---|
 | 508 |         int *\fIerrorCodePtr\fR); | 
|---|
 | 509 | .CE | 
|---|
 | 510 | .PP | 
|---|
 | 511 | \fIInstanceData\fR is the same as the value passed to | 
|---|
 | 512 | \fBTcl_CreateChannel\fR when the channel was created.  The \fIbuf\fR | 
|---|
 | 513 | argument points to an array of bytes in which to store input from the | 
|---|
 | 514 | device, and the \fIbufSize\fR argument indicates how many bytes are | 
|---|
 | 515 | available at \fIbuf\fR. | 
|---|
 | 516 | .PP | 
|---|
 | 517 | The \fIerrorCodePtr\fR argument points to an integer variable provided by | 
|---|
 | 518 | the generic layer. If an error occurs, the function should set the variable | 
|---|
 | 519 | to a POSIX error code that identifies the error that occurred. | 
|---|
 | 520 | .PP | 
|---|
 | 521 | The function should read data from the input device encapsulated by the | 
|---|
 | 522 | channel and store it at \fIbuf\fR.  On success, the function should return | 
|---|
 | 523 | a nonnegative integer indicating how many bytes were read from the input | 
|---|
 | 524 | device and stored at \fIbuf\fR. On error, the function should return -1. If | 
|---|
 | 525 | an error occurs after some data has been read from the device, that data is | 
|---|
 | 526 | lost. | 
|---|
 | 527 | .PP | 
|---|
 | 528 | If \fIinputProc\fR can determine that the input device has some data | 
|---|
 | 529 | available but less than requested by the \fIbufSize\fR argument, the | 
|---|
 | 530 | function should only attempt to read as much data as is available and | 
|---|
 | 531 | return without blocking. If the input device has no data available | 
|---|
 | 532 | whatsoever and the channel is in nonblocking mode, the function should | 
|---|
 | 533 | return an \fBEAGAIN\fR error. If the input device has no data available | 
|---|
 | 534 | whatsoever and the channel is in blocking mode, the function should block | 
|---|
 | 535 | for the shortest possible time until at least one byte of data can be read | 
|---|
 | 536 | from the device; then, it should return as much data as it can read without | 
|---|
 | 537 | blocking. | 
|---|
 | 538 | .PP | 
|---|
 | 539 | This value can be retrieved with \fBTcl_ChannelInputProc\fR, which returns | 
|---|
 | 540 | a pointer to the function. | 
|---|
 | 541 | .SS OUTPUTPROC | 
|---|
 | 542 | .PP | 
|---|
 | 543 | The \fIoutputProc\fR field contains the address of a function called by the | 
|---|
 | 544 | generic layer to transfer data from an internal buffer to the output device. | 
|---|
 | 545 | \fIOutputProc\fR must match the following prototype: | 
|---|
 | 546 | .PP | 
|---|
 | 547 | .CS | 
|---|
 | 548 | typedef int Tcl_DriverOutputProc( | 
|---|
 | 549 |         ClientData \fIinstanceData\fR, | 
|---|
 | 550 |         const char *\fIbuf\fR, | 
|---|
 | 551 |         int \fItoWrite\fR, | 
|---|
 | 552 |         int *\fIerrorCodePtr\fR); | 
|---|
 | 553 | .CE | 
|---|
 | 554 | .PP | 
|---|
 | 555 | \fIInstanceData\fR is the same as the value passed to | 
|---|
 | 556 | \fBTcl_CreateChannel\fR when the channel was created. The \fIbuf\fR | 
|---|
 | 557 | argument contains an array of bytes to be written to the device, and the | 
|---|
 | 558 | \fItoWrite\fR argument indicates how many bytes are to be written from the | 
|---|
 | 559 | \fIbuf\fR argument. | 
|---|
 | 560 | .PP | 
|---|
 | 561 | The \fIerrorCodePtr\fR argument points to an integer variable provided by | 
|---|
 | 562 | the generic layer. If an error occurs, the function should set this | 
|---|
 | 563 | variable to a POSIX error code that identifies the error. | 
|---|
 | 564 | .PP | 
|---|
 | 565 | The function should write the data at \fIbuf\fR to the output device | 
|---|
 | 566 | encapsulated by the channel. On success, the function should return a | 
|---|
 | 567 | nonnegative integer indicating how many bytes were written to the output | 
|---|
 | 568 | device.  The return value is normally the same as \fItoWrite\fR, but may be | 
|---|
 | 569 | less in some cases such as if the output operation is interrupted by a | 
|---|
 | 570 | signal. If an error occurs the function should return -1.  In case of | 
|---|
 | 571 | error, some data may have been written to the device. | 
|---|
 | 572 | .PP | 
|---|
 | 573 | If the channel is nonblocking and the output device is unable to absorb any | 
|---|
 | 574 | data whatsoever, the function should return -1 with an \fBEAGAIN\fR error | 
|---|
 | 575 | without writing any data. | 
|---|
 | 576 | .PP | 
|---|
 | 577 | This value can be retrieved with \fBTcl_ChannelOutputProc\fR, which returns | 
|---|
 | 578 | a pointer to the function. | 
|---|
 | 579 | .SS "SEEKPROC AND WIDESEEKPROC" | 
|---|
 | 580 | .PP | 
|---|
 | 581 | The \fIseekProc\fR field contains the address of a function called by the | 
|---|
 | 582 | generic layer to move the access point at which subsequent input or output | 
|---|
 | 583 | operations will be applied. \fISeekProc\fR must match the following | 
|---|
 | 584 | prototype: | 
|---|
 | 585 | .PP | 
|---|
 | 586 | .CS | 
|---|
 | 587 | typedef int Tcl_DriverSeekProc( | 
|---|
 | 588 |         ClientData \fIinstanceData\fR, | 
|---|
 | 589 |         long \fIoffset\fR, | 
|---|
 | 590 |         int \fIseekMode\fR, | 
|---|
 | 591 |         int *\fIerrorCodePtr\fR); | 
|---|
 | 592 | .CE | 
|---|
 | 593 | .PP | 
|---|
 | 594 | The \fIinstanceData\fR argument is the same as the value given to | 
|---|
 | 595 | \fBTcl_CreateChannel\fR when this channel was created.  \fIOffset\fR and | 
|---|
 | 596 | \fIseekMode\fR have the same meaning as for the \fBTcl_Seek\fR | 
|---|
 | 597 | procedure (described in the manual entry for \fBTcl_OpenFileChannel\fR). | 
|---|
 | 598 | .PP | 
|---|
 | 599 | The \fIerrorCodePtr\fR argument points to an integer variable provided by | 
|---|
 | 600 | the generic layer for returning \fBerrno\fR values from the function.  The | 
|---|
 | 601 | function should set this variable to a POSIX error code if an error occurs. | 
|---|
 | 602 | The function should store an \fBEINVAL\fR error code if the channel type | 
|---|
 | 603 | does not implement seeking. | 
|---|
 | 604 | .PP | 
|---|
 | 605 | The return value is the new access point or -1 in case of error. If an | 
|---|
 | 606 | error occurred, the function should not move the access point. | 
|---|
 | 607 | .PP | 
|---|
 | 608 | If there is a non-NULL \fIseekProc\fR field, the \fIwideSeekProc\fR | 
|---|
 | 609 | field may contain the address of an alternative function to use which | 
|---|
 | 610 | handles wide (i.e. larger than 32-bit) offsets, so allowing seeks | 
|---|
 | 611 | within files larger than 2GB.  The \fIwideSeekProc\fR will be called | 
|---|
 | 612 | in preference to the \fIseekProc\fR, but both must be defined if the | 
|---|
 | 613 | \fIwideSeekProc\fR is defined.  \fIWideSeekProc\fR must match the | 
|---|
 | 614 | following prototype: | 
|---|
 | 615 | .PP | 
|---|
 | 616 | .CS | 
|---|
 | 617 | typedef Tcl_WideInt Tcl_DriverWideSeekProc( | 
|---|
 | 618 |         ClientData \fIinstanceData\fR, | 
|---|
 | 619 |         Tcl_WideInt \fIoffset\fR, | 
|---|
 | 620 |         int \fIseekMode\fR, | 
|---|
 | 621 |         int *\fIerrorCodePtr\fR); | 
|---|
 | 622 | .CE | 
|---|
 | 623 | .PP | 
|---|
 | 624 | The arguments and return values mean the same thing as with | 
|---|
 | 625 | \fIseekProc\fR above, except that the type of offsets and the return | 
|---|
 | 626 | type are different. | 
|---|
 | 627 | .PP | 
|---|
 | 628 | The \fIseekProc\fR value can be retrieved with | 
|---|
 | 629 | \fBTcl_ChannelSeekProc\fR, which returns a pointer to the function, | 
|---|
 | 630 | and similarly the \fIwideSeekProc\fR can be retrieved with | 
|---|
 | 631 | \fBTcl_ChannelWideSeekProc\fR. | 
|---|
 | 632 | .SS SETOPTIONPROC | 
|---|
 | 633 | .PP | 
|---|
 | 634 | The \fIsetOptionProc\fR field contains the address of a function called by | 
|---|
 | 635 | the generic layer to set a channel type specific option on a channel. | 
|---|
 | 636 | \fIsetOptionProc\fR must match the following prototype: | 
|---|
 | 637 | .PP | 
|---|
 | 638 | .CS | 
|---|
 | 639 | typedef int Tcl_DriverSetOptionProc( | 
|---|
 | 640 |         ClientData \fIinstanceData\fR, | 
|---|
 | 641 |         Tcl_Interp *\fIinterp\fR, | 
|---|
 | 642 |         const char *\fIoptionName\fR, | 
|---|
 | 643 |         const char *\fInewValue\fR); | 
|---|
 | 644 | .CE | 
|---|
 | 645 | .PP | 
|---|
 | 646 | \fIoptionName\fR is the name of an option to set, and \fInewValue\fR is | 
|---|
 | 647 | the new value for that option, as a string. The \fIinstanceData\fR is the | 
|---|
 | 648 | same as the value given to \fBTcl_CreateChannel\fR when this channel was | 
|---|
 | 649 | created. The function should do whatever channel type specific action is | 
|---|
 | 650 | required to implement the new value of the option. | 
|---|
 | 651 | .PP | 
|---|
 | 652 | Some options are handled by the generic code and this function is never | 
|---|
 | 653 | called to set them, e.g. \fB\-blockmode\fR. Other options are specific to | 
|---|
 | 654 | each channel type and the \fIsetOptionProc\fR procedure of the channel | 
|---|
 | 655 | driver will get called to implement them. The \fIsetOptionProc\fR field can | 
|---|
 | 656 | be NULL, which indicates that this channel type supports no type specific | 
|---|
 | 657 | options.  | 
|---|
 | 658 | .PP | 
|---|
 | 659 | If the option value is successfully modified to the new value, the function | 
|---|
 | 660 | returns \fBTCL_OK\fR. | 
|---|
 | 661 | It should call \fBTcl_BadChannelOption\fR which itself returns | 
|---|
 | 662 | \fBTCL_ERROR\fR if the \fIoptionName\fR is | 
|---|
 | 663 | unrecognized.  | 
|---|
 | 664 | If \fInewValue\fR specifies a value for the option that | 
|---|
 | 665 | is not supported or if a system call error occurs, | 
|---|
 | 666 | the function should leave an error message in the | 
|---|
 | 667 | \fIresult\fR field of \fIinterp\fR if \fIinterp\fR is not NULL. The | 
|---|
 | 668 | function should also call \fBTcl_SetErrno\fR to store an appropriate POSIX | 
|---|
 | 669 | error code. | 
|---|
 | 670 | .PP | 
|---|
 | 671 | This value can be retrieved with \fBTcl_ChannelSetOptionProc\fR, which returns | 
|---|
 | 672 | a pointer to the function. | 
|---|
 | 673 | .SS GETOPTIONPROC | 
|---|
 | 674 | .PP | 
|---|
 | 675 | The \fIgetOptionProc\fR field contains the address of a function called by | 
|---|
 | 676 | the generic layer to get the value of a channel type specific option on a | 
|---|
 | 677 | channel. \fIgetOptionProc\fR must match the following prototype: | 
|---|
 | 678 | .PP | 
|---|
 | 679 | .CS | 
|---|
 | 680 | typedef int Tcl_DriverGetOptionProc( | 
|---|
 | 681 |         ClientData \fIinstanceData\fR, | 
|---|
 | 682 |         Tcl_Interp *\fIinterp\fR, | 
|---|
 | 683 |         const char *\fIoptionName\fR, | 
|---|
 | 684 |         Tcl_DString *\fIoptionValue\fR); | 
|---|
 | 685 | .CE | 
|---|
 | 686 | .PP | 
|---|
 | 687 | \fIOptionName\fR is the name of an option supported by this type of | 
|---|
 | 688 | channel. If the option name is not NULL, the function stores its current | 
|---|
 | 689 | value, as a string, in the Tcl dynamic string \fIoptionValue\fR. | 
|---|
 | 690 | If \fIoptionName\fR is NULL, the function stores in \fIoptionValue\fR an | 
|---|
 | 691 | alternating list of all supported options and their current values. | 
|---|
 | 692 | On success, the function returns \fBTCL_OK\fR.  | 
|---|
 | 693 | It should call \fBTcl_BadChannelOption\fR which itself returns | 
|---|
 | 694 | \fBTCL_ERROR\fR if the \fIoptionName\fR is | 
|---|
 | 695 | unrecognized. If a system call error occurs, | 
|---|
 | 696 | the function should leave an error message in the | 
|---|
 | 697 | result of \fIinterp\fR if \fIinterp\fR is not NULL. The | 
|---|
 | 698 | function should also call \fBTcl_SetErrno\fR to store an appropriate POSIX | 
|---|
 | 699 | error code. | 
|---|
 | 700 | .PP | 
|---|
 | 701 | Some options are handled by the generic code and this function is never | 
|---|
 | 702 | called to retrieve their value, e.g. \fB\-blockmode\fR. Other options are | 
|---|
 | 703 | specific to each channel type and the \fIgetOptionProc\fR procedure of the | 
|---|
 | 704 | channel driver will get called to implement them. The \fIgetOptionProc\fR | 
|---|
 | 705 | field can be NULL, which indicates that this channel type supports no type | 
|---|
 | 706 | specific options. | 
|---|
 | 707 | .PP | 
|---|
 | 708 | This value can be retrieved with \fBTcl_ChannelGetOptionProc\fR, which returns | 
|---|
 | 709 | a pointer to the function. | 
|---|
 | 710 | .SS WATCHPROC | 
|---|
 | 711 | .PP | 
|---|
 | 712 | The \fIwatchProc\fR field contains the address of a function called | 
|---|
 | 713 | by the generic layer to initialize the event notification mechanism to | 
|---|
 | 714 | notice events of interest on this channel. | 
|---|
 | 715 | \fIWatchProc\fR should match the following prototype: | 
|---|
 | 716 | .PP | 
|---|
 | 717 | .CS | 
|---|
 | 718 | typedef void Tcl_DriverWatchProc( | 
|---|
 | 719 |         ClientData \fIinstanceData\fR, | 
|---|
 | 720 |         int \fImask\fR); | 
|---|
 | 721 | .CE | 
|---|
 | 722 | .PP | 
|---|
 | 723 | The \fIinstanceData\fR is the same as the value passed to | 
|---|
 | 724 | \fBTcl_CreateChannel\fR when this channel was created. The \fImask\fR | 
|---|
 | 725 | argument is an OR-ed combination of \fBTCL_READABLE\fR, \fBTCL_WRITABLE\fR | 
|---|
 | 726 | and \fBTCL_EXCEPTION\fR; it indicates events the caller is interested in | 
|---|
 | 727 | noticing on this channel. | 
|---|
 | 728 | .PP | 
|---|
 | 729 | The function should initialize device type specific mechanisms to | 
|---|
 | 730 | notice when an event of interest is present on the channel.  When one | 
|---|
 | 731 | or more of the designated events occurs on the channel, the channel | 
|---|
 | 732 | driver is responsible for calling \fBTcl_NotifyChannel\fR to inform | 
|---|
 | 733 | the generic channel module.  The driver should take care not to starve | 
|---|
 | 734 | other channel drivers or sources of callbacks by invoking | 
|---|
 | 735 | Tcl_NotifyChannel too frequently.  Fairness can be insured by using | 
|---|
 | 736 | the Tcl event queue to allow the channel event to be scheduled in sequence | 
|---|
 | 737 | with other events.  See the description of \fBTcl_QueueEvent\fR for | 
|---|
 | 738 | details on how to queue an event. | 
|---|
 | 739 | .PP | 
|---|
 | 740 | This value can be retrieved with \fBTcl_ChannelWatchProc\fR, which returns | 
|---|
 | 741 | a pointer to the function. | 
|---|
 | 742 | .SS GETHANDLEPROC | 
|---|
 | 743 | .PP | 
|---|
 | 744 | The \fIgetHandleProc\fR field contains the address of a function called by | 
|---|
 | 745 | the generic layer to retrieve a device-specific handle from the channel. | 
|---|
 | 746 | \fIGetHandleProc\fR should match the following prototype: | 
|---|
 | 747 | .PP | 
|---|
 | 748 | .CS | 
|---|
 | 749 | typedef int Tcl_DriverGetHandleProc( | 
|---|
 | 750 |         ClientData \fIinstanceData\fR, | 
|---|
 | 751 |         int \fIdirection\fR, | 
|---|
 | 752 |         ClientData *\fIhandlePtr\fR); | 
|---|
 | 753 | .CE | 
|---|
 | 754 | .PP | 
|---|
 | 755 | \fIInstanceData\fR is the same as the value passed to | 
|---|
 | 756 | \fBTcl_CreateChannel\fR when this channel was created. The \fIdirection\fR | 
|---|
 | 757 | argument is either \fBTCL_READABLE\fR to retrieve the handle used | 
|---|
 | 758 | for input, or \fBTCL_WRITABLE\fR to retrieve the handle used for | 
|---|
 | 759 | output. | 
|---|
 | 760 | .PP | 
|---|
 | 761 | If the channel implementation has device-specific handles, the | 
|---|
 | 762 | function should retrieve the appropriate handle associated with the | 
|---|
 | 763 | channel, according the \fIdirection\fR argument.  The handle should be | 
|---|
 | 764 | stored in the location referred to by \fIhandlePtr\fR, and | 
|---|
 | 765 | \fBTCL_OK\fR should be returned.  If the channel is not open for the | 
|---|
 | 766 | specified direction, or if the channel implementation does not use | 
|---|
 | 767 | device handles, the function should return \fBTCL_ERROR\fR. | 
|---|
 | 768 | .PP | 
|---|
 | 769 | This value can be retrieved with \fBTcl_ChannelGetHandleProc\fR, which returns | 
|---|
 | 770 | a pointer to the function. | 
|---|
 | 771 | .SS FLUSHPROC | 
|---|
 | 772 | .PP | 
|---|
 | 773 | The \fIflushProc\fR field is currently reserved for future use. | 
|---|
 | 774 | It should be set to NULL. | 
|---|
 | 775 | \fIFlushProc\fR should match the following prototype: | 
|---|
 | 776 | .PP | 
|---|
 | 777 | .CS | 
|---|
 | 778 | typedef int Tcl_DriverFlushProc( | 
|---|
 | 779 |         ClientData \fIinstanceData\fR); | 
|---|
 | 780 | .CE | 
|---|
 | 781 | .PP | 
|---|
 | 782 | This value can be retrieved with \fBTcl_ChannelFlushProc\fR, which returns | 
|---|
 | 783 | a pointer to the function. | 
|---|
 | 784 | .SS HANDLERPROC | 
|---|
 | 785 | .PP | 
|---|
 | 786 | The \fIhandlerProc\fR field contains the address of a function called by | 
|---|
 | 787 | the generic layer to notify the channel that an event occurred.  It should | 
|---|
 | 788 | be defined for stacked channel drivers that wish to be notified of events | 
|---|
 | 789 | that occur on the underlying (stacked) channel. | 
|---|
 | 790 | \fIHandlerProc\fR should match the following prototype: | 
|---|
 | 791 | .PP | 
|---|
 | 792 | .CS | 
|---|
 | 793 | typedef int Tcl_DriverHandlerProc( | 
|---|
 | 794 |         ClientData \fIinstanceData\fR, | 
|---|
 | 795 |         int \fIinterestMask\fR); | 
|---|
 | 796 | .CE | 
|---|
 | 797 | .PP | 
|---|
 | 798 | \fIInstanceData\fR is the same as the value passed to \fBTcl_CreateChannel\fR | 
|---|
 | 799 | when this channel was created.  The \fIinterestMask\fR is an OR-ed | 
|---|
 | 800 | combination of \fBTCL_READABLE\fR or \fBTCL_WRITABLE\fR; it indicates what | 
|---|
 | 801 | type of event occurred on this channel. | 
|---|
 | 802 | .PP | 
|---|
 | 803 | This value can be retrieved with \fBTcl_ChannelHandlerProc\fR, which returns | 
|---|
 | 804 | a pointer to the function. | 
|---|
 | 805 |  | 
|---|
 | 806 | .SS "THREADACTIONPROC" | 
|---|
 | 807 | .PP | 
|---|
 | 808 | The \fIthreadActionProc\fR field contains the address of the function | 
|---|
 | 809 | called by the generic layer when a channel is created, closed, or | 
|---|
 | 810 | going to move to a different thread, i.e. whenever thread-specific | 
|---|
 | 811 | driver state might have to initialized or updated. It can be NULL. | 
|---|
 | 812 | The action \fITCL_CHANNEL_THREAD_REMOVE\fR is used to notify the | 
|---|
 | 813 | driver that it should update or remove any thread-specific data it | 
|---|
 | 814 | might be maintaining for the channel. | 
|---|
 | 815 | .PP | 
|---|
 | 816 | The action \fITCL_CHANNEL_THREAD_INSERT\fR is used to notify the | 
|---|
 | 817 | driver that it should update or initialize any thread-specific data it | 
|---|
 | 818 | might be maintaining using the calling thread as the associate. See | 
|---|
 | 819 | \fBTcl_CutChannel\fR and \fBTcl_SpliceChannel\fR for more detail. | 
|---|
 | 820 | .PP | 
|---|
 | 821 | .CS | 
|---|
 | 822 | typedef void Tcl_DriverThreadActionProc( | 
|---|
 | 823 |         ClientData \fIinstanceData\fR, | 
|---|
 | 824 |         int        \fIaction\fR); | 
|---|
 | 825 | .CE | 
|---|
 | 826 | .PP | 
|---|
 | 827 | \fIInstanceData\fR is the same as the value passed to | 
|---|
 | 828 | \fBTcl_CreateChannel\fR when this channel was created. | 
|---|
 | 829 | .PP | 
|---|
 | 830 | These values can be retrieved with \fBTcl_ChannelThreadActionProc\fR, | 
|---|
 | 831 | which returns a pointer to the function. | 
|---|
 | 832 | .SS "TRUNCATEPROC" | 
|---|
 | 833 | .PP | 
|---|
 | 834 | The \fItruncateProc\fR field contains the address of the function | 
|---|
 | 835 | called by the generic layer when a channel is truncated to some | 
|---|
 | 836 | length. It can be NULL. | 
|---|
 | 837 | .PP | 
|---|
 | 838 | .CS | 
|---|
 | 839 | typedef int Tcl_DriverTruncateProc( | 
|---|
 | 840 |         ClientData \fIinstanceData\fR, | 
|---|
 | 841 |         Tcl_WideInt \fIlength\fR); | 
|---|
 | 842 | .CE | 
|---|
 | 843 | .PP | 
|---|
 | 844 | \fIInstanceData\fR is the same as the value passed to | 
|---|
 | 845 | \fBTcl_CreateChannel\fR when this channel was created, and | 
|---|
 | 846 | \fIlength\fR is the new length of the underlying file, which should | 
|---|
 | 847 | not be negative. The result should be 0 on success or an errno code | 
|---|
 | 848 | (suitable for use with \fBTcl_SetErrno\fR) on failure. | 
|---|
 | 849 | .PP | 
|---|
 | 850 | These values can be retrieved with \fBTcl_ChannelTruncateProc\fR, | 
|---|
 | 851 | which returns a pointer to the function. | 
|---|
 | 852 | .SH TCL_BADCHANNELOPTION | 
|---|
 | 853 | .PP | 
|---|
 | 854 | This procedure generates a | 
|---|
 | 855 | .QW "bad option" | 
|---|
 | 856 | error message in an | 
|---|
 | 857 | (optional) interpreter.  It is used by channel drivers when  | 
|---|
 | 858 | an invalid Set/Get option is requested. Its purpose is to concatenate | 
|---|
 | 859 | the generic options list to the specific ones and factorize | 
|---|
 | 860 | the generic options error message string. | 
|---|
 | 861 | .PP | 
|---|
 | 862 | It always returns \fBTCL_ERROR\fR | 
|---|
 | 863 | .PP | 
|---|
 | 864 | An error message is generated in \fIinterp\fR's result object to | 
|---|
 | 865 | indicate that a command was invoked with a bad option. | 
|---|
 | 866 | The message has the form | 
|---|
 | 867 | .CS | 
|---|
 | 868 |     bad option "blah": should be one of  | 
|---|
 | 869 |     <...generic options...>+<...specific options...> | 
|---|
 | 870 | .CE | 
|---|
 | 871 | so you get for instance: | 
|---|
 | 872 | .CS | 
|---|
 | 873 |     bad option "-blah": should be one of -blocking, | 
|---|
 | 874 |     -buffering, -buffersize, -eofchar, -translation, | 
|---|
 | 875 |     -peername, or -sockname | 
|---|
 | 876 | .CE | 
|---|
 | 877 | when called with \fIoptionList\fR equal to | 
|---|
 | 878 | .QW "peername sockname" | 
|---|
 | 879 | .PP | 
|---|
 | 880 | .QW blah | 
|---|
 | 881 | is the \fIoptionName\fR argument and | 
|---|
 | 882 | .QW "<specific options>" | 
|---|
 | 883 | is a space separated list of specific option words. | 
|---|
 | 884 | The function takes good care of inserting minus signs before | 
|---|
 | 885 | each option, commas after, and an | 
|---|
 | 886 | .QW or | 
|---|
 | 887 | before the last option. | 
|---|
 | 888 | .SH "OLD CHANNEL TYPES" | 
|---|
 | 889 | The original (8.3.1 and below) \fBTcl_ChannelType\fR structure contains | 
|---|
 | 890 | the following fields: | 
|---|
 | 891 | .PP | 
|---|
 | 892 | .CS | 
|---|
 | 893 | typedef struct Tcl_ChannelType { | 
|---|
 | 894 |         char *\fItypeName\fR; | 
|---|
 | 895 |         Tcl_DriverBlockModeProc *\fIblockModeProc\fR; | 
|---|
 | 896 |         Tcl_DriverCloseProc *\fIcloseProc\fR; | 
|---|
 | 897 |         Tcl_DriverInputProc *\fIinputProc\fR; | 
|---|
 | 898 |         Tcl_DriverOutputProc *\fIoutputProc\fR; | 
|---|
 | 899 |         Tcl_DriverSeekProc *\fIseekProc\fR; | 
|---|
 | 900 |         Tcl_DriverSetOptionProc *\fIsetOptionProc\fR; | 
|---|
 | 901 |         Tcl_DriverGetOptionProc *\fIgetOptionProc\fR; | 
|---|
 | 902 |         Tcl_DriverWatchProc *\fIwatchProc\fR; | 
|---|
 | 903 |         Tcl_DriverGetHandleProc *\fIgetHandleProc\fR; | 
|---|
 | 904 |         Tcl_DriverClose2Proc *\fIclose2Proc\fR; | 
|---|
 | 905 | } Tcl_ChannelType; | 
|---|
 | 906 | .CE | 
|---|
 | 907 | .PP | 
|---|
 | 908 | It is still possible to create channel with the above structure.  The | 
|---|
 | 909 | internal channel code will determine the version.  It is imperative to use | 
|---|
 | 910 | the new \fBTcl_ChannelType\fR structure if you are creating a stacked | 
|---|
 | 911 | channel driver, due to problems with the earlier stacked channel | 
|---|
 | 912 | implementation (in 8.2.0 to 8.3.1). | 
|---|
 | 913 | .PP | 
|---|
 | 914 | Prior to 8.4.0 (i.e. during the later releases of 8.3 and early part | 
|---|
 | 915 | of the 8.4 development cycle) the \fBTcl_ChannelType\fR structure | 
|---|
 | 916 | contained the following fields: | 
|---|
 | 917 | .PP | 
|---|
 | 918 | .CS | 
|---|
 | 919 | typedef struct Tcl_ChannelType { | 
|---|
 | 920 |         char *\fItypeName\fR; | 
|---|
 | 921 |         Tcl_ChannelTypeVersion \fIversion\fR; | 
|---|
 | 922 |         Tcl_DriverCloseProc *\fIcloseProc\fR; | 
|---|
 | 923 |         Tcl_DriverInputProc *\fIinputProc\fR; | 
|---|
 | 924 |         Tcl_DriverOutputProc *\fIoutputProc\fR; | 
|---|
 | 925 |         Tcl_DriverSeekProc *\fIseekProc\fR; | 
|---|
 | 926 |         Tcl_DriverSetOptionProc *\fIsetOptionProc\fR; | 
|---|
 | 927 |         Tcl_DriverGetOptionProc *\fIgetOptionProc\fR; | 
|---|
 | 928 |         Tcl_DriverWatchProc *\fIwatchProc\fR; | 
|---|
 | 929 |         Tcl_DriverGetHandleProc *\fIgetHandleProc\fR; | 
|---|
 | 930 |         Tcl_DriverClose2Proc *\fIclose2Proc\fR; | 
|---|
 | 931 |         Tcl_DriverBlockModeProc *\fIblockModeProc\fR; | 
|---|
 | 932 |         Tcl_DriverFlushProc *\fIflushProc\fR; | 
|---|
 | 933 |         Tcl_DriverHandlerProc *\fIhandlerProc\fR; | 
|---|
 | 934 |         Tcl_DriverTruncateProc *\fItruncateProc\fR; | 
|---|
 | 935 | } Tcl_ChannelType; | 
|---|
 | 936 | .CE | 
|---|
 | 937 | .PP | 
|---|
 | 938 | When the above structure is registered as a channel type, the | 
|---|
 | 939 | \fIversion\fR field should always be \fBTCL_CHANNEL_VERSION_2\fR. | 
|---|
 | 940 |  | 
|---|
 | 941 | .SH "SEE ALSO" | 
|---|
 | 942 | Tcl_Close(3), Tcl_OpenFileChannel(3), Tcl_SetErrno(3), Tcl_QueueEvent(3), Tcl_StackChannel(3), Tcl_GetStdChannel(3) | 
|---|
 | 943 |  | 
|---|
 | 944 | .SH KEYWORDS | 
|---|
 | 945 | blocking, channel driver, channel registration, channel type, nonblocking | 
|---|