CrtChannel.3
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:37k
源码类别:

通讯编程

开发平台:

Visual C++

  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.16.2.5 2005/10/05 20:35:45 andreas_kupries 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_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_CreateChannelfR(fItypePtr, channelName, instanceData, maskfR)
  21. .sp
  22. ClientData
  23. fBTcl_GetChannelInstanceDatafR(fIchannelfR)
  24. .sp
  25. Tcl_ChannelType *
  26. fBTcl_GetChannelTypefR(fIchannelfR)
  27. .sp
  28. CONST char *
  29. fBTcl_GetChannelNamefR(fIchannelfR)
  30. .sp
  31. int
  32. fBTcl_GetChannelHandlefR(fIchannel, direction, handlePtrfR)
  33. .sp
  34. .VS 8.4
  35. Tcl_ThreadId
  36. fBTcl_GetChannelThreadfR(fIchannelfR)
  37. .VE 8.4
  38. .sp
  39. int
  40. fBTcl_GetChannelModefR(fIchannelfR)
  41. .sp
  42. int
  43. fBTcl_GetChannelBufferSizefR(fIchannelfR)
  44. .sp
  45. fBTcl_SetChannelBufferSizefR(fIchannel, sizefR)
  46. .sp
  47. fBTcl_NotifyChannelfR(fIchannel, maskfR)
  48. .sp
  49. int
  50. fBTcl_BadChannelOptionfR(fIinterp, optionName, optionListfR)
  51. .VS 8.4
  52. .sp
  53. int
  54. fBTcl_IsChannelSharedfR(fIchannelfR)
  55. .sp
  56. int
  57. fBTcl_IsChannelRegisteredfR(fIinterp, channelfR)
  58. .sp
  59. int
  60. fBTcl_IsChannelExistingfR(fIchannelNamefR)
  61. .sp
  62. void
  63. fBTcl_CutChannelfR(fIchannelfR)
  64. .sp
  65. void
  66. fBTcl_SpliceChannelfR(fIchannelfR)
  67. .sp
  68. void
  69. fBTcl_ClearChannelHandlersfR(fIchannelfR)
  70. .VE 8.4
  71. .sp
  72. int
  73. fBTcl_ChannelBufferedfR(fIchannelfR)
  74. .sp
  75. CONST char *
  76. fBTcl_ChannelNamefR(fItypePtrfR)
  77. .sp
  78. Tcl_ChannelTypeVersion
  79. fBTcl_ChannelVersionfR(fItypePtrfR)
  80. .sp
  81. Tcl_DriverBlockModeProc *
  82. fBTcl_ChannelBlockModeProcfR(fItypePtrfR)
  83. .sp
  84. Tcl_DriverCloseProc *
  85. fBTcl_ChannelCloseProcfR(fItypePtrfR)
  86. .sp
  87. Tcl_DriverClose2Proc *
  88. fBTcl_ChannelClose2ProcfR(fItypePtrfR)
  89. .sp
  90. Tcl_DriverInputProc *
  91. fBTcl_ChannelInputProcfR(fItypePtrfR)
  92. .sp
  93. Tcl_DriverOutputProc *
  94. fBTcl_ChannelOutputProcfR(fItypePtrfR)
  95. .sp
  96. Tcl_DriverSeekProc *
  97. fBTcl_ChannelSeekProcfR(fItypePtrfR)
  98. .sp
  99. .VS 8.4
  100. Tcl_DriverWideSeekProc *
  101. fBTcl_ChannelWideSeekProcfR(fItypePtrfR)
  102. .sp
  103. Tcl_DriverThreadActionProc *
  104. fBTcl_ChannelThreadActionProcfR(fItypePtrfR)
  105. .VE 8.4
  106. .sp
  107. Tcl_DriverSetOptionProc *
  108. fBTcl_ChannelSetOptionProcfR(fItypePtrfR)
  109. .sp
  110. Tcl_DriverGetOptionProc *
  111. fBTcl_ChannelGetOptionProcfR(fItypePtrfR)
  112. .sp
  113. Tcl_DriverWatchProc *
  114. fBTcl_ChannelWatchProcfR(fItypePtrfR)
  115. .sp
  116. Tcl_DriverGetHandleProc *
  117. fBTcl_ChannelGetHandleProcfR(fItypePtrfR)
  118. .sp
  119. Tcl_DriverFlushProc *
  120. fBTcl_ChannelFlushProcfR(fItypePtrfR)
  121. .sp
  122. Tcl_DriverHandlerProc *
  123. fBTcl_ChannelHandlerProcfR(fItypePtrfR)
  124. .sp
  125. .SH ARGUMENTS
  126. .AS Tcl_ChannelType *channelName in
  127. .AP Tcl_ChannelType *typePtr in
  128. Points to a structure containing the addresses of procedures that
  129. can be called to perform I/O and other functions on the channel.
  130. .AP "CONST char" *channelName in
  131. The name of this channel, such as fBfile3fR; must not be in use
  132. by any other channel. Can be NULL, in which case the channel is
  133. created without a name.
  134. .AP ClientData instanceData in
  135. Arbitrary one-word value to be associated with this channel.  This
  136. value is passed to procedures in fItypePtrfR when they are invoked.
  137. .AP int mask in
  138. OR-ed combination of fBTCL_READABLEfR and fBTCL_WRITABLEfR to indicate
  139. whether a channel is readable and writable.
  140. .AP Tcl_Channel channel in
  141. The channel to operate on.
  142. .AP int direction in
  143. fBTCL_READABLEfR means the input handle is wanted; fBTCL_WRITABLEfR
  144. means the output handle is wanted.
  145. .AP ClientData *handlePtr out
  146. Points to the location where the desired OS-specific handle should be
  147. stored.
  148. .AP int size in
  149. The size, in bytes, of buffers to allocate in this channel.
  150. .AP int mask in
  151. An OR-ed combination of fBTCL_READABLEfR, fBTCL_WRITABLEfR
  152. and fBTCL_EXCEPTIONfR that indicates events that have occurred on
  153. this channel.
  154. .AP Tcl_Interp *interp in
  155. Current interpreter. (can be NULL)
  156. .AP "CONST char" *optionName in
  157. Name of the invalid option.
  158. .AP "CONST char" *optionList in
  159. Specific options list (space separated words, without "-") 
  160. to append to the standard generic options list.
  161. Can be NULL for generic options error message only.
  162. .BE
  163. .SH DESCRIPTION
  164. .PP
  165. Tcl uses a two-layered channel architecture. It provides a generic upper
  166. layer to enable C and Tcl programs to perform input and output using the
  167. same APIs for a variety of files, devices, sockets etc. The generic C APIs
  168. are described in the manual entry for fBTcl_OpenFileChannelfR.
  169. .PP
  170. The lower layer provides type-specific channel drivers for each type
  171. of device supported on each platform.  This manual entry describes the
  172. C APIs used to communicate between the generic layer and the
  173. type-specific channel drivers.  It also explains how new types of
  174. channels can be added by providing new channel drivers.
  175. .PP
  176. Channel drivers consist of a number of components: First, each channel
  177. driver provides a fBTcl_ChannelTypefR structure containing pointers to
  178. functions implementing the various operations used by the generic layer to
  179. communicate with the channel driver. The fBTcl_ChannelTypefR structure
  180. and the functions referenced by it are described in the section
  181. TCL_CHANNELTYPE, below.
  182. .PP
  183. Second, channel drivers usually provide a Tcl command to create
  184. instances of that type of channel. For example, the Tcl fBopenfR
  185. command creates channels that use the file and command channel
  186. drivers, and the Tcl fBsocketfR command creates channels that use
  187. TCP sockets for network communication.
  188. .PP
  189. Third, a channel driver optionally provides a C function to open
  190. channel instances of that type. For example, fBTcl_OpenFileChannelfR
  191. opens a channel that uses the file channel driver, and
  192. fBTcl_OpenTcpClientfR opens a channel that uses the TCP network
  193. protocol.  These creation functions typically use
  194. fBTcl_CreateChannelfR internally to open the channel.
  195. .PP
  196. To add a new type of channel you must implement a C API or a Tcl command
  197. that opens a channel by invoking fBTcl_CreateChannelfR.
  198. When your driver calls fBTcl_CreateChannelfR it passes in
  199. a fBTcl_ChannelTypefR structure describing the driver's I/O
  200. procedures.
  201. The generic layer will then invoke the functions referenced in that
  202. structure to perform operations on the channel.
  203. .PP
  204. fBTcl_CreateChannelfR opens a new channel and associates the supplied
  205. fItypePtrfR and fIinstanceDatafR with it. The channel is opened in the
  206. mode indicated by fImaskfR.
  207. For a discussion of channel drivers, their operations and the
  208. fBTcl_ChannelTypefR structure, see the section TCL_CHANNELTYPE, below.
  209. .PP
  210. fBTcl_CreateChannelfR interacts with the code managing the standard
  211. channels. Once a standard channel was initialized either through a
  212. call to fBTcl_GetStdChannelfR or a call to fBTcl_SetStdChannelfR
  213. closing this standard channel will cause the next call to
  214. fBTcl_CreateChannelfR to make the new channel the new standard
  215. channel too. See fBTcl_StandardChannelsfR for a general treatise
  216. about standard channels and the behaviour of the Tcl library with
  217. regard to them.
  218. .PP
  219. fBTcl_GetChannelInstanceDatafR returns the instance data associated with
  220. the channel in fIchannelfR. This is the same as the fIinstanceDatafR
  221. argument in the call to fBTcl_CreateChannelfR that created this channel.
  222. .PP
  223. fBTcl_GetChannelTypefR returns a pointer to the fBTcl_ChannelTypefR
  224. structure used by the channel in the fIchannelfR argument. This is
  225. the same as the fItypePtrfR argument in the call to
  226. fBTcl_CreateChannelfR that created this channel.
  227. .PP
  228. fBTcl_GetChannelNamefR returns a string containing the name associated
  229. with the channel, or NULL if the fIchannelNamefR argument to
  230. fBTcl_CreateChannelfR was NULL.
  231. .PP
  232. fBTcl_GetChannelHandlefR places the OS-specific device handle
  233. associated with fIchannelfR for the given fIdirectionfR in the
  234. location specified by fIhandlePtrfR and returns fBTCL_OKfR.  If
  235. the channel does not have a device handle for the specified direction,
  236. then fBTCL_ERRORfR is returned instead.  Different channel drivers
  237. will return different types of handle.  Refer to the manual entries
  238. for each driver to determine what type of handle is returned.
  239. .PP
  240. .VS 8.4
  241. fBTcl_GetChannelThreadfR returns the id of the thread currently managing
  242. the specified fIchannelfR. This allows channel drivers to send their file
  243. events to the correct event queue even for a multi-threaded core.
  244. .VE 8.4
  245. .PP
  246. fBTcl_GetChannelModefR returns an OR-ed combination of fBTCL_READABLEfR
  247. and fBTCL_WRITABLEfR, indicating whether the channel is open for input
  248. and output.
  249. .PP
  250. fBTcl_GetChannelBufferSizefR returns the size, in bytes, of buffers
  251. allocated to store input or output in fIchannelfR. If the value was not set
  252. by a previous call to fBTcl_SetChannelBufferSizefR, described below, then
  253. the default value of 4096 is returned.
  254. .PP
  255. fBTcl_SetChannelBufferSizefR 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 fIsizefR argument should be between ten and one million,
  258. allowing buffers of ten bytes to one million bytes. If fIsizefR is
  259. outside this range, fBTcl_SetChannelBufferSizefR sets the buffer size to
  260. 4096.
  261. .PP
  262. fBTcl_NotifyChannelfR is called by a channel driver to indicate to
  263. the generic layer that the events specified by fImaskfR 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 fBWATCHPROCfR below for more details.
  267. .PP
  268. fBTcl_BadChannelOptionfR is called from driver specific set or get option
  269. procs to generate a complete error message.
  270. .PP
  271. fBTcl_ChannelBufferedfR returns the number of bytes of input
  272. currently buffered in the internal buffer (push back area) of the
  273. channel itself. It does not report about the data in the overall
  274. buffers for the stack of channels the supplied channel is part of.
  275. .PP
  276. .VS 8.4
  277. fBTcl_IsChannelSharedfR checks the refcount of the specified
  278. fIchannelfR and returns whether the fIchannelfR was shared among
  279. multiple interpreters (result == 1) or not (result == 0).
  280. .PP
  281. fBTcl_IsChannelRegisteredfR checks whether the specified fIchannelfR is
  282. registered in the given fIinterpfRreter (result == 1) or not
  283. (result == 0).
  284. .PP
  285. fBTcl_IsChannelExistingfR 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_CutChannelfR removes the specified fIchannelfR 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.4
  294. Also notifies the driver if the fBTcl_ChannelTypefR version is
  295. fBTCL_CHANNEL_VERSION_4fR (or higher), and
  296. fBTcl_DriverThreadActionProcfR is defined for it.
  297. .VE 8.4
  298. .PP
  299. fBTcl_SpliceChannelfR adds the specified fIchannelfR 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.4
  303. Also notifies the driver if the fBTcl_ChannelTypefR version is
  304. fBTCL_CHANNEL_VERSION_4fR (or higher), and
  305. fBTcl_DriverThreadActionProcfR is defined for it.
  306. .VE 8.4
  307. .PP
  308. fBTcl_ClearChannelHandlersfR removes all channelhandlers and event
  309. scripts associated with the specified fIchannelfR, thus shutting
  310. down all event processing for this channel.
  311. .VE 8.4
  312. .SH TCL_CHANNELTYPE
  313. .PP
  314. A channel driver provides a fBTcl_ChannelTypefR structure that contains
  315. pointers to functions that implement the various operations on a channel;
  316. these operations are invoked as needed by the generic layer.  The structure
  317. was versioned starting in Tcl 8.3.2/8.4 to correct a problem with stacked
  318. channel drivers.  See the fBOLD CHANNEL TYPESfR section below for
  319. details about the old structure.
  320. .PP
  321. The fBTcl_ChannelTypefR structure contains the following fields:
  322. .CS
  323. typedef struct Tcl_ChannelType {
  324. char *fItypeNamefR;
  325. Tcl_ChannelTypeVersion fIversionfR;
  326. Tcl_DriverCloseProc *fIcloseProcfR;
  327. Tcl_DriverInputProc *fIinputProcfR;
  328. Tcl_DriverOutputProc *fIoutputProcfR;
  329. Tcl_DriverSeekProc *fIseekProcfR;
  330. Tcl_DriverSetOptionProc *fIsetOptionProcfR;
  331. Tcl_DriverGetOptionProc *fIgetOptionProcfR;
  332. Tcl_DriverWatchProc *fIwatchProcfR;
  333. Tcl_DriverGetHandleProc *fIgetHandleProcfR;
  334. Tcl_DriverClose2Proc *fIclose2ProcfR;
  335. Tcl_DriverBlockModeProc *fIblockModeProcfR;
  336. Tcl_DriverFlushProc *fIflushProcfR;
  337. Tcl_DriverHandlerProc *fIhandlerProcfR;
  338. Tcl_DriverWideSeekProc *fIwideSeekProcfR;
  339. Tcl_DriverThreadActionProc *fIthreadActionProcfR;
  340. } Tcl_ChannelType;
  341. .CE
  342. .PP
  343. It is not necessary to provide implementations for all channel
  344. operations.  Those which are not necessary may be set to NULL in the
  345. struct: fIblockModeProcfR, fIseekProcfR, fIsetOptionProcfR,
  346. fIgetOptionProcfR, and fIclose2ProcfR, in addition to
  347. fIflushProcfR, fIhandlerProcfR, and fIthreadActionProcfR.  Other
  348. functions that cannot be implemented in a meaningful way should return
  349. fBEINVALfR when called, to indicate that the operations they
  350. represent are not available. Also note that fIwideSeekProcfR can be
  351. NULL if fIseekProcfR is.
  352. .PP
  353. The user should only use the above structure for fBTcl_ChannelTypefR
  354. instantiation.  When referencing fields in a fBTcl_ChannelTypefR
  355. structure, the following functions should be used to obtain the values:
  356. fBTcl_ChannelNamefR, fBTcl_ChannelVersionfR,
  357. fBTcl_ChannelBlockModeProcfR, fBTcl_ChannelCloseProcfR,
  358. fBTcl_ChannelClose2ProcfR, fBTcl_ChannelInputProcfR,
  359. fBTcl_ChannelOutputProcfR, fBTcl_ChannelSeekProcfR,
  360. .VS 8.4
  361. fBTcl_ChannelWideSeekProcfR,
  362. fBTcl_ChannelThreadActionProcfR,
  363. .VE 8.4
  364. fBTcl_ChannelSetOptionProcfR, fBTcl_ChannelGetOptionProcfR,
  365. fBTcl_ChannelWatchProcfR, fBTcl_ChannelGetHandleProcfR,
  366. fBTcl_ChannelFlushProcfR, or fBTcl_ChannelHandlerProcfR.
  367. .PP
  368. The change to the structures was made in such a way that standard channel
  369. types are binary compatible.  However, channel types that use stacked
  370. channels (ie: TLS, Trf) have new versions to correspond to the above change
  371. since the previous code for stacked channels had problems.
  372. .SH TYPENAME
  373. .PP
  374. The fItypeNamefR field contains a null-terminated string that
  375. identifies the type of the device implemented by this driver, e.g.
  376. fBfilefR or fBsocketfR.
  377. .PP
  378. This value can be retrieved with fBTcl_ChannelNamefR, which returns
  379. a pointer to the string.
  380. .SH VERSION
  381. .PP
  382. The fIversionfR field should be set to the version of the structure
  383. that you require. fBTCL_CHANNEL_VERSION_2fR is the minimum recommended.
  384. .VS 8.4
  385. fBTCL_CHANNEL_VERSION_3fR must be set to specifiy the fIwideSeekProcfR member.
  386. .VE 8.4
  387. .VS 8.4
  388. fBTCL_CHANNEL_VERSION_4fR must be set to specifiy the
  389. fIthreadActionProcfR member (includes fIwideSeekProcfR).
  390. .VE 8.4
  391. If it is not set to any of these, then this
  392. fBTcl_ChannelTypefR is assumed to have the original structure.  See
  393. fBOLD CHANNEL TYPESfR for more details.  While Tcl will recognize
  394. and function with either structures, stacked channels must be of at
  395. least fBTCL_CHANNEL_VERSION_2fR to function correctly.
  396. .PP
  397. This value can be retrieved with fBTcl_ChannelVersionfR, which returns
  398. .VS 8.4
  399. one of fBTCL_CHANNEL_VERSION_4fR, fBTCL_CHANNEL_VERSION_3fR,
  400. .VE 8.4
  401. fBTCL_CHANNEL_VERSION_2fR, or fBTCL_CHANNEL_VERSION_1fR.
  402. .SH BLOCKMODEPROC
  403. .PP
  404. The fIblockModeProcfR field contains the address of a function called by
  405. the generic layer to set blocking and nonblocking mode on the device.
  406. fIBlockModeProcfR should match the following prototype:
  407. .PP
  408. .CS
  409. typedef int Tcl_DriverBlockModeProc(
  410. ClientData fIinstanceDatafR,
  411. int fImodefR);
  412. .CE
  413. .PP
  414. The fIinstanceDatafR is the same as the value passed to
  415. fBTcl_CreateChannelfR when this channel was created.  The fImodefR
  416. argument is either fBTCL_MODE_BLOCKINGfR or fBTCL_MODE_NONBLOCKINGfR to
  417. set the device into blocking or nonblocking mode. The function should
  418. return zero if the operation was successful, or a nonzero POSIX error code
  419. if the operation failed.
  420. .PP
  421. If the operation is successful, the function can modify the supplied
  422. fIinstanceDatafR to record that the channel entered blocking or
  423. nonblocking mode and to implement the blocking or nonblocking behavior.
  424. For some device types, the blocking and nonblocking behavior can be
  425. implemented by the underlying operating system; for other device types, the
  426. behavior must be emulated in the channel driver.
  427. .PP
  428. This value can be retrieved with fBTcl_ChannelBlockModeProcfR, which returns
  429. a pointer to the function.
  430. .PP
  431. A channel driver fBnotfR supplying a fIblockModeProcfR has to be
  432. very, very careful. It has to tell the generic layer exactly which
  433. blocking mode is acceptable to it, and should this also document for
  434. the user so that the blocking mode of the channel is not changed to an
  435. inacceptable value. Any confusion here may lead the interpreter into a
  436. (spurious and difficult to find) deadlock.
  437. .SH "CLOSEPROC AND CLOSE2PROC"
  438. .PP
  439. The fIcloseProcfR field contains the address of a function called by the
  440. generic layer to clean up driver-related information when the channel is
  441. closed. fICloseProcfR must match the following prototype:
  442. .PP
  443. .CS
  444. typedef int Tcl_DriverCloseProc(
  445. ClientData fIinstanceDatafR,
  446. Tcl_Interp *fIinterpfR);
  447. .CE
  448. .PP
  449. The fIinstanceDatafR argument is the same as the value provided to
  450. fBTcl_CreateChannelfR when the channel was created. The function should
  451. release any storage maintained by the channel driver for this channel, and
  452. close the input and output devices encapsulated by this channel. All queued
  453. output will have been flushed to the device before this function is called,
  454. and no further driver operations will be invoked on this instance after
  455. calling the fIcloseProcfR. If the close operation is successful, the
  456. procedure should return zero; otherwise it should return a nonzero POSIX
  457. error code. In addition, if an error occurs and fIinterpfR is not NULL,
  458. the procedure should store an error message in the interpreter's result.
  459. .PP
  460. Alternatively, channels that support closing the read and write sides
  461. independently may set fIcloseProcfR to fBTCL_CLOSE2PROCfR and set
  462. fIclose2ProcfR to the address of a function that matches the
  463. following prototype:
  464. .PP
  465. .CS
  466. typedef int Tcl_DriverClose2Proc(
  467. ClientData fIinstanceDatafR,
  468. Tcl_Interp *fIinterpfR,
  469. int fIflagsfR);
  470. .CE
  471. .PP
  472. The fIclose2ProcfR will be called with fIflagsfR set to an OR'ed
  473. combination of fBTCL_CLOSE_READfR or fBTCL_CLOSE_WRITEfR to
  474. indicate that the driver should close the read and/or write side of
  475. the channel.  The channel driver may be invoked to perform
  476. additional operations on the channel after fIclose2ProcfR is
  477. called to close one or both sides of the channel.  If fIflagsfR is
  478. fB0fR (zero), the driver should close the channel in the manner
  479. described above for fIcloseProcfR.  No further operations will be
  480. invoked on this instance after fIclose2ProcfR is called with all
  481. flags cleared.  In all cases, the fIclose2ProcfR function should
  482. return zero if the close operation was successful; otherwise it should
  483. return a nonzero POSIX error code. In addition, if an error occurs and
  484. fIinterpfR is not NULL, the procedure should store an error message
  485. in the interpreter's result.
  486. .PP
  487. These value can be retrieved with fBTcl_ChannelCloseProcfR or
  488. fBTcl_ChannelClose2ProcfR, which returns a pointer to the respective
  489. function.
  490. .SH INPUTPROC
  491. .PP
  492. The fIinputProcfR field contains the address of a function called by the
  493. generic layer to read data from the file or device and store it in an
  494. internal buffer. fIInputProcfR must match the following prototype:
  495. .PP
  496. .CS
  497. typedef int Tcl_DriverInputProc(
  498. ClientData fIinstanceDatafR,
  499. char *fIbuffR,
  500. int fIbufSizefR,
  501. int *fIerrorCodePtrfR);
  502. .CE
  503. .PP
  504. fIInstanceDatafR is the same as the value passed to
  505. fBTcl_CreateChannelfR when the channel was created.  The fIbuffR
  506. argument points to an array of bytes in which to store input from the
  507. device, and the fIbufSizefR argument indicates how many bytes are
  508. available at fIbuffR.
  509. .PP
  510. The fIerrorCodePtrfR argument points to an integer variable provided by
  511. the generic layer. If an error occurs, the function should set the variable
  512. to a POSIX error code that identifies the error that occurred.
  513. .PP
  514. The function should read data from the input device encapsulated by the
  515. channel and store it at fIbuffR.  On success, the function should return
  516. a nonnegative integer indicating how many bytes were read from the input
  517. device and stored at fIbuffR. On error, the function should return -1. If
  518. an error occurs after some data has been read from the device, that data is
  519. lost.
  520. .PP
  521. If fIinputProcfR can determine that the input device has some data
  522. available but less than requested by the fIbufSizefR argument, the
  523. function should only attempt to read as much data as is available and
  524. return without blocking. If the input device has no data available
  525. whatsoever and the channel is in nonblocking mode, the function should
  526. return an fBEAGAINfR error. If the input device has no data available
  527. whatsoever and the channel is in blocking mode, the function should block
  528. for the shortest possible time until at least one byte of data can be read
  529. from the device; then, it should return as much data as it can read without
  530. blocking.
  531. .PP
  532. This value can be retrieved with fBTcl_ChannelInputProcfR, which returns
  533. a pointer to the function.
  534. .SH OUTPUTPROC
  535. .PP
  536. The fIoutputProcfR field contains the address of a function called by the
  537. generic layer to transfer data from an internal buffer to the output device.
  538. fIOutputProcfR must match the following prototype:
  539. .PP
  540. .CS
  541. typedef int Tcl_DriverOutputProc(
  542. ClientData fIinstanceDatafR,
  543. CONST char *fIbuffR,
  544. int fItoWritefR,
  545. int *fIerrorCodePtrfR);
  546. .CE
  547. .PP
  548. fIInstanceDatafR is the same as the value passed to
  549. fBTcl_CreateChannelfR when the channel was created. The fIbuffR
  550. argument contains an array of bytes to be written to the device, and the
  551. fItoWritefR argument indicates how many bytes are to be written from the
  552. fIbuffR argument.
  553. .PP
  554. The fIerrorCodePtrfR argument points to an integer variable provided by
  555. the generic layer. If an error occurs, the function should set this
  556. variable to a POSIX error code that identifies the error.
  557. .PP
  558. The function should write the data at fIbuffR to the output device
  559. encapsulated by the channel. On success, the function should return a
  560. nonnegative integer indicating how many bytes were written to the output
  561. device.  The return value is normally the same as fItoWritefR, but may be
  562. less in some cases such as if the output operation is interrupted by a
  563. signal. If an error occurs the function should return -1.  In case of
  564. error, some data may have been written to the device.
  565. .PP
  566. If the channel is nonblocking and the output device is unable to absorb any
  567. data whatsoever, the function should return -1 with an fBEAGAINfR error
  568. without writing any data.
  569. .PP
  570. This value can be retrieved with fBTcl_ChannelOutputProcfR, which returns
  571. a pointer to the function.
  572. .SH "SEEKPROC AND WIDESEEKPROC"
  573. .PP
  574. The fIseekProcfR field contains the address of a function called by the
  575. generic layer to move the access point at which subsequent input or output
  576. operations will be applied. fISeekProcfR must match the following
  577. prototype:
  578. .PP
  579. .CS
  580. typedef int Tcl_DriverSeekProc(
  581. ClientData fIinstanceDatafR,
  582. long fIoffsetfR,
  583. int fIseekModefR,
  584. int *fIerrorCodePtrfR);
  585. .CE
  586. .PP
  587. The fIinstanceDatafR argument is the same as the value given to
  588. fBTcl_CreateChannelfR when this channel was created.  fIOffsetfR and
  589. fIseekModefR have the same meaning as for the fBTcl_SeekfR
  590. procedure (described in the manual entry for fBTcl_OpenFileChannelfR).
  591. .PP
  592. The fIerrorCodePtrfR argument points to an integer variable provided by
  593. the generic layer for returning fBerrnofR values from the function.  The
  594. function should set this variable to a POSIX error code if an error occurs.
  595. The function should store an fBEINVALfR error code if the channel type
  596. does not implement seeking.
  597. .PP
  598. The return value is the new access point or -1 in case of error. If an
  599. error occurred, the function should not move the access point.
  600. .PP
  601. .VS 8.4
  602. If there is a non-NULL fIseekProcfR field, the fIwideSeekProcfR
  603. field may contain the address of an alternative function to use which
  604. handles wide (i.e. larger than 32-bit) offsets, so allowing seeks
  605. within files larger than 2GB.  The fIwideSeekProcfR will be called
  606. in preference to the fIseekProcfR, but both must be defined if the
  607. fIwideSeekProcfR is defined.  fIWideSeekProcfR must match the
  608. following prototype:
  609. .PP
  610. .CS
  611. typedef Tcl_WideInt Tcl_DriverWideSeekProc(
  612. ClientData fIinstanceDatafR,
  613. Tcl_WideInt fIoffsetfR,
  614. int fIseekModefR,
  615. int *fIerrorCodePtrfR);
  616. .CE
  617. .PP
  618. The arguments and return values mean the same thing as with
  619. fIseekProcfR above, except that the type of offsets and the return
  620. type are different.
  621. .PP
  622. The fIseekProcfR value can be retrieved with
  623. fBTcl_ChannelSeekProcfR, which returns a pointer to the function,
  624. and similarly the fIwideSeekProcfR can be retrieved with
  625. fBTcl_ChannelWideSeekProcfR.
  626. .VE 8.4
  627. .SH SETOPTIONPROC
  628. .PP
  629. The fIsetOptionProcfR field contains the address of a function called by
  630. the generic layer to set a channel type specific option on a channel.
  631. fIsetOptionProcfR must match the following prototype:
  632. .PP
  633. .CS
  634. typedef int Tcl_DriverSetOptionProc(
  635. ClientData fIinstanceDatafR,
  636. Tcl_Interp *fIinterpfR,
  637. CONST char *fIoptionNamefR,
  638. CONST char *fInewValuefR);
  639. .CE
  640. .PP
  641. fIoptionNamefR is the name of an option to set, and fInewValuefR is
  642. the new value for that option, as a string. The fIinstanceDatafR is the
  643. same as the value given to fBTcl_CreateChannelfR when this channel was
  644. created. The function should do whatever channel type specific action is
  645. required to implement the new value of the option.
  646. .PP
  647. Some options are handled by the generic code and this function is never
  648. called to set them, e.g. fB-blockmodefR. Other options are specific to
  649. each channel type and the fIsetOptionProcfR procedure of the channel
  650. driver will get called to implement them. The fIsetOptionProcfR field can
  651. be NULL, which indicates that this channel type supports no type specific
  652. options. 
  653. .PP
  654. If the option value is successfully modified to the new value, the function
  655. returns fBTCL_OKfR.
  656. It should call fBTcl_BadChannelOptionfR which itself returns
  657. fBTCL_ERRORfR if the fIoptionNamefR is
  658. unrecognized. 
  659. If fInewValuefR specifies a value for the option that
  660. is not supported or if a system call error occurs,
  661. the function should leave an error message in the
  662. fIresultfR field of fIinterpfR if fIinterpfR is not NULL. The
  663. function should also call fBTcl_SetErrnofR to store an appropriate POSIX
  664. error code.
  665. .PP
  666. This value can be retrieved with fBTcl_ChannelSetOptionProcfR, which returns
  667. a pointer to the function.
  668. .SH GETOPTIONPROC
  669. .PP
  670. The fIgetOptionProcfR field contains the address of a function called by
  671. the generic layer to get the value of a channel type specific option on a
  672. channel. fIgetOptionProcfR must match the following prototype:
  673. .PP
  674. .CS
  675. typedef int Tcl_DriverGetOptionProc(
  676. ClientData fIinstanceDatafR,
  677. Tcl_Interp *fIinterpfR,
  678. CONST char *fIoptionNamefR,
  679. Tcl_DString *fIoptionValuefR);
  680. .CE
  681. .PP
  682. fIOptionNamefR is the name of an option supported by this type of
  683. channel. If the option name is not NULL, the function stores its current
  684. value, as a string, in the Tcl dynamic string fIoptionValuefR.
  685. If fIoptionNamefR is NULL, the function stores in fIoptionValuefR an
  686. alternating list of all supported options and their current values.
  687. On success, the function returns fBTCL_OKfR. 
  688. It should call fBTcl_BadChannelOptionfR which itself returns
  689. fBTCL_ERRORfR if the fIoptionNamefR is
  690. unrecognized. If a system call error occurs,
  691. the function should leave an error message in the
  692. result of fIinterpfR if fIinterpfR is not NULL. The
  693. function should also call fBTcl_SetErrnofR to store an appropriate POSIX
  694. error code.
  695. .PP
  696. Some options are handled by the generic code and this function is never
  697. called to retrieve their value, e.g. fB-blockmodefR. Other options are
  698. specific to each channel type and the fIgetOptionProcfR procedure of the
  699. channel driver will get called to implement them. The fIgetOptionProcfR
  700. field can be NULL, which indicates that this channel type supports no type
  701. specific options.
  702. .PP
  703. This value can be retrieved with fBTcl_ChannelGetOptionProcfR, which returns
  704. a pointer to the function.
  705. .SH WATCHPROC
  706. .PP
  707. The fIwatchProcfR field contains the address of a function called
  708. by the generic layer to initialize the event notification mechanism to
  709. notice events of interest on this channel.
  710. fIWatchProcfR should match the following prototype:
  711. .PP
  712. .CS
  713. typedef void Tcl_DriverWatchProc(
  714. ClientData fIinstanceDatafR,
  715. int fImaskfR);
  716. .CE
  717. .PP
  718. The fIinstanceDatafR is the same as the value passed to
  719. fBTcl_CreateChannelfR when this channel was created. The fImaskfR
  720. argument is an OR-ed combination of fBTCL_READABLEfR, fBTCL_WRITABLEfR
  721. and fBTCL_EXCEPTIONfR; it indicates events the caller is interested in
  722. noticing on this channel.
  723. .PP
  724. The function should initialize device type specific mechanisms to
  725. notice when an event of interest is present on the channel.  When one
  726. or more of the designated events occurs on the channel, the channel
  727. driver is responsible for calling fBTcl_NotifyChannelfR to inform
  728. the generic channel module.  The driver should take care not to starve
  729. other channel drivers or sources of callbacks by invoking
  730. Tcl_NotifyChannel too frequently.  Fairness can be insured by using
  731. the Tcl event queue to allow the channel event to be scheduled in sequence
  732. with other events.  See the description of fBTcl_QueueEventfR for
  733. details on how to queue an event.
  734. .PP
  735. This value can be retrieved with fBTcl_ChannelWatchProcfR, which returns
  736. a pointer to the function.
  737. .SH GETHANDLEPROC
  738. .PP
  739. The fIgetHandleProcfR field contains the address of a function called by
  740. the generic layer to retrieve a device-specific handle from the channel.
  741. fIGetHandleProcfR should match the following prototype:
  742. .PP
  743. .CS
  744. typedef int Tcl_DriverGetHandleProc(
  745. ClientData fIinstanceDatafR,
  746. int fIdirectionfR,
  747. ClientData *fIhandlePtrfR);
  748. .CE
  749. .PP
  750. fIInstanceDatafR is the same as the value passed to
  751. fBTcl_CreateChannelfR when this channel was created. The fIdirectionfR
  752. argument is either fBTCL_READABLEfR to retrieve the handle used
  753. for input, or fBTCL_WRITABLEfR to retrieve the handle used for
  754. output.
  755. .PP
  756. If the channel implementation has device-specific handles, the
  757. function should retrieve the appropriate handle associated with the
  758. channel, according the fIdirectionfR argument.  The handle should be
  759. stored in the location referred to by fIhandlePtrfR, and
  760. fBTCL_OKfR should be returned.  If the channel is not open for the
  761. specified direction, or if the channel implementation does not use
  762. device handles, the function should return fBTCL_ERRORfR.
  763. .PP
  764. This value can be retrieved with fBTcl_ChannelGetHandleProcfR, which returns
  765. a pointer to the function.
  766. .SH FLUSHPROC
  767. .PP
  768. The fIflushProcfR field is currently reserved for future use.
  769. It should be set to NULL.
  770. fIFlushProcfR should match the following prototype:
  771. .PP
  772. .CS
  773. typedef int Tcl_DriverFlushProc(
  774. ClientData fIinstanceDatafR);
  775. .CE
  776. .PP
  777. This value can be retrieved with fBTcl_ChannelFlushProcfR, which returns
  778. a pointer to the function.
  779. .SH HANDLERPROC
  780. .PP
  781. The fIhandlerProcfR field contains the address of a function called by
  782. the generic layer to notify the channel that an event occurred.  It should
  783. be defined for stacked channel drivers that wish to be notified of events
  784. that occur on the underlying (stacked) channel.
  785. fIHandlerProcfR should match the following prototype:
  786. .PP
  787. .CS
  788. typedef int Tcl_DriverHandlerProc(
  789. ClientData fIinstanceDatafR,
  790. int fIinterestMaskfR);
  791. .CE
  792. .PP
  793. fIInstanceDatafR is the same as the value passed to fBTcl_CreateChannelfR
  794. when this channel was created.  The fIinterestMaskfR is an OR-ed
  795. combination of fBTCL_READABLEfR or fBTCL_WRITABLEfR; it indicates what
  796. type of event occurred on this channel.
  797. .PP
  798. This value can be retrieved with fBTcl_ChannelHandlerProcfR, which returns
  799. a pointer to the function.
  800. .VS 8.4
  801. .SH "THREADACTIONPROC"
  802. .PP
  803. The fIthreadActionProcfR field contains the address of the function
  804. called by the generic layer when a channel is created, closed, or
  805. going to move to a different thread, i.e. whenever thread-specific
  806. driver state might have to initialized or updated. It can be NULL.
  807. The action fITCL_CHANNEL_THREAD_REMOVEfR is used to notify the
  808. driver that it should update or remove any thread-specific data it
  809. might be maintaining for the channel.
  810. .PP
  811. The action fITCL_CHANNEL_THREAD_INSERTfR is used to notify the
  812. driver that it should update or initialize any thread-specific data it
  813. might be maintaining using the calling thread as the associate. See
  814. fBTcl_CutChannelfR and fBTcl_SpliceChannelfR for more detail.
  815. .PP
  816. .CS
  817. typedef void Tcl_DriverThreadActionProc(
  818. ClientData fIinstanceDatafR,
  819.       int        fIactionfR);
  820. .CE
  821. .PP
  822. fIInstanceDatafR is the same as the value passed to
  823. fBTcl_CreateChannelfR when this channel was created.
  824. .PP
  825. These values can be retrieved with fBTcl_ChannelThreadActionProcfR,
  826. which returns a pointer to the function.
  827. .VE 8.4
  828. .SH TCL_BADCHANNELOPTION
  829. .PP
  830. This procedure generates a "bad option" error message in an
  831. (optional) interpreter.  It is used by channel drivers when 
  832. a invalid Set/Get option is requested. Its purpose is to concatenate
  833. the generic options list to the specific ones and factorize
  834. the generic options error message string.
  835. .PP
  836. It always return fBTCL_ERRORfR
  837. .PP
  838. An error message is generated in fIinterpfR's result object to
  839. indicate that a command was invoked with the a bad option
  840. The message has the form
  841. .CS
  842.     bad option "blah": should be one of 
  843.     <...generic options...>+<...specific options...>
  844. so you get for instance:
  845.     bad option "-blah": should be one of -blocking,
  846.     -buffering, -buffersize, -eofchar, -translation,
  847.     -peername, or -sockname
  848. when called with fIoptionListfR="peername sockname"
  849. .CE
  850. ``blah'' is the fIoptionNamefR argument and ``<specific options>''
  851. is a space separated list of specific option words.
  852. The function takes good care of inserting minus signs before
  853. each option, commas after, and an ``or'' before the last option.
  854. .SH "OLD CHANNEL TYPES"
  855. The original (8.3.1 and below) fBTcl_ChannelTypefR structure contains
  856. the following fields:
  857. .PP
  858. .CS
  859. typedef struct Tcl_ChannelType {
  860. char *fItypeNamefR;
  861. Tcl_DriverBlockModeProc *fIblockModeProcfR;
  862. Tcl_DriverCloseProc *fIcloseProcfR;
  863. Tcl_DriverInputProc *fIinputProcfR;
  864. Tcl_DriverOutputProc *fIoutputProcfR;
  865. Tcl_DriverSeekProc *fIseekProcfR;
  866. Tcl_DriverSetOptionProc *fIsetOptionProcfR;
  867. Tcl_DriverGetOptionProc *fIgetOptionProcfR;
  868. Tcl_DriverWatchProc *fIwatchProcfR;
  869. Tcl_DriverGetHandleProc *fIgetHandleProcfR;
  870. Tcl_DriverClose2Proc *fIclose2ProcfR;
  871. } Tcl_ChannelType;
  872. .CE
  873. .PP
  874. It is still possible to create channel with the above structure.  The
  875. internal channel code will determine the version.  It is imperative to use
  876. the new fBTcl_ChannelTypefR structure if you are creating a stacked
  877. channel driver, due to problems with the earlier stacked channel
  878. implementation (in 8.2.0 to 8.3.1).
  879. .PP
  880. .VS 8.4
  881. Prior to 8.4.0 (i.e. during the later releases of 8.3 and early part
  882. of the 8.4 development cycle) the fBTcl_ChannelTypefR structure
  883. contained the following fields:
  884. .PP
  885. .CS
  886. typedef struct Tcl_ChannelType {
  887. char *fItypeNamefR;
  888. Tcl_ChannelTypeVersion fIversionfR;
  889. Tcl_DriverCloseProc *fIcloseProcfR;
  890. Tcl_DriverInputProc *fIinputProcfR;
  891. Tcl_DriverOutputProc *fIoutputProcfR;
  892. Tcl_DriverSeekProc *fIseekProcfR;
  893. Tcl_DriverSetOptionProc *fIsetOptionProcfR;
  894. Tcl_DriverGetOptionProc *fIgetOptionProcfR;
  895. Tcl_DriverWatchProc *fIwatchProcfR;
  896. Tcl_DriverGetHandleProc *fIgetHandleProcfR;
  897. Tcl_DriverClose2Proc *fIclose2ProcfR;
  898. Tcl_DriverBlockModeProc *fIblockModeProcfR;
  899. Tcl_DriverFlushProc *fIflushProcfR;
  900. Tcl_DriverHandlerProc *fIhandlerProcfR;
  901. } Tcl_ChannelType;
  902. .CE
  903. .PP
  904. When the above structure is registered as a channel type, the
  905. fIversionfR field should always be fBTCL_CHANNEL_VERSION_2fR.
  906. .VE 8.4
  907. .SH "SEE ALSO"
  908. Tcl_Close(3), Tcl_OpenFileChannel(3), Tcl_SetErrno(3), Tcl_QueueEvent(3), Tcl_StackChannel(3), Tcl_GetStdChannel(3)
  909. .SH KEYWORDS
  910. blocking, channel driver, channel registration, channel type, nonblocking