Xtranstli.c
上传用户:lctgjx
上传日期:2022-06-04
资源大小:8887k
文件大小:32k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2. Copyright 1993, 1994, 1998  The Open Group
  3. Permission to use, copy, modify, distribute, and sell this software and its
  4. documentation for any purpose is hereby granted without fee, provided that
  5. the above copyright notice appear in all copies and that both that
  6. copyright notice and this permission notice appear in supporting
  7. documentation.
  8. The above copyright notice and this permission notice shall be included
  9. in all copies or substantial portions of the Software.
  10. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  11. OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  12. MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  13. IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
  14. OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  15. ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  16. OTHER DEALINGS IN THE SOFTWARE.
  17. Except as contained in this notice, the name of The Open Group shall
  18. not be used in advertising or otherwise to promote the sale, use or
  19. other dealings in this Software without prior written authorization
  20. from The Open Group.
  21.  * Copyright 1993, 1994 NCR Corporation - Dayton, Ohio, USA
  22.  *
  23.  * All Rights Reserved
  24.  *
  25.  * Permission to use, copy, modify, and distribute this software and its
  26.  * documentation for any purpose and without fee is hereby granted, provided
  27.  * that the above copyright notice appear in all copies and that both that
  28.  * copyright notice and this permission notice appear in supporting
  29.  * documentation, and that the name NCR not be used in advertising
  30.  * or publicity pertaining to distribution of the software without specific,
  31.  * written prior permission.  NCR makes no representations about the
  32.  * suitability of this software for any purpose.  It is provided "as is"
  33.  * without express or implied warranty.
  34.  *
  35.  * NCR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
  36.  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
  37.  * NO EVENT SHALL NCR BE LIABLE FOR ANY SPECIAL, INDIRECT OR
  38.  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
  39.  * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
  40.  * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  41.  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  42.  */
  43. #include <sys/un.h>
  44. #include <stropts.h>
  45. #include <poll.h>
  46. #include <tiuser.h>
  47. #include <netdir.h>
  48. #include <netconfig.h>
  49. /*
  50.  * This is the TLI implementation of the X Transport service layer
  51.  */
  52. typedef struct _TLItrans2dev {
  53.     char *transname;
  54.     char *protofamily;
  55.     char *devcotsname;
  56.     char *devcltsname;
  57.     int family;
  58. } TLItrans2dev;
  59. static TLItrans2dev TLItrans2devtab[] = {
  60. {"inet","inet","/dev/tcp","/dev/udp",AF_INET},
  61. {"tcp","inet","/dev/tcp","/dev/udp",AF_INET},
  62. {"tli","loopback","/dev/ticots","/dev/ticlts",AF_UNIX},
  63. };
  64. #define NUMTLIFAMILIES (sizeof(TLItrans2devtab)/sizeof(TLItrans2dev))
  65.     
  66. /*
  67.  * The local TLI connection, is a form of a local connection, so use a
  68.  * sockaddr_un for the address so that it will be treated just like the other
  69.  * local transports such as UNIX domain sockets, pts, and named.
  70.  */
  71.     
  72. #if defined(X11_t)
  73. #define TLINODENAME "TLI:xserver"
  74. #endif
  75.     
  76. #if defined(XIM_t)
  77. #define TLINODENAME "TLI:xim"
  78. #endif
  79.     
  80. #if defined(FS_t) || defined(FONT_t)
  81. #define TLINODENAME "TLI:fontserver"
  82. #endif
  83.     
  84. #if defined(ICE_t)
  85. #define TLINODENAME "TLI:ICE"
  86. #endif
  87.     
  88. #if defined(TEST_t)
  89. #define TLINODENAME "TLI:test"
  90. #endif
  91.     
  92. #ifndef PORTBUFSIZE
  93. #ifdef TRANS_SERVER
  94. #define PORTBUFSIZE 64
  95. #else
  96. #ifdef TRANS_CLIENT
  97. #define PORTBUFSIZE 64
  98. #endif
  99. #endif
  100. #endif
  101. /*
  102.  * These are some utility function used by the real interface function below.
  103.  */
  104. static int
  105. TRANS(TLISelectFamily)(char *family)
  106. {
  107.     int     i;
  108.     
  109.     PRMSG(3,"TLISelectFamily(%s)n", family, 0,0 );
  110.     
  111.     for(i=0;i<NUMTLIFAMILIES;i++)
  112.     {
  113. if( !strcmp(family,TLItrans2devtab[i].transname) )
  114.     return i;
  115.     }
  116.     return -1;
  117. }
  118. /*
  119.  * This function gets the local address of the transport and stores it in the
  120.  * XtransConnInfo structure for the connection.
  121.  */
  122. static int
  123. TRANS(TLIGetAddr)(XtransConnInfo ciptr)
  124. {
  125.     Xtransaddr sockname;
  126.     struct netbuf netbuf;
  127.     
  128.     PRMSG(3,"TLIGetAddr(%x)n", ciptr, 0,0 );
  129.     
  130.     netbuf.buf=(char *)&sockname;
  131.     netbuf.len=sizeof(sockname);
  132.     netbuf.maxlen=sizeof(sockname);
  133.     
  134.     if( t_getname(ciptr->fd,&netbuf,LOCALNAME) < 0 )
  135.     {
  136. PRMSG(1,"TLIGetAddr: t_getname(LOCALNAME) failed: %dn",
  137.       errno, 0,0 );
  138. return -1;
  139.     }
  140.     
  141.     PRMSG(4,"TLIGetAddr: got family %d len %dn",
  142.   ((struct sockaddr *) &sockname)->sa_family ,netbuf.len, 0 );
  143.     
  144.     /*
  145.      * Everything looks good: fill in the XtransConnInfo structure.
  146.      */
  147.     
  148.     if( ciptr->addr )
  149. xfree(ciptr->addr);
  150.     
  151.     if( (ciptr->addr=(char *)xalloc(netbuf.len)) == NULL )
  152.     {
  153. PRMSG(1, "TLIGetAddr: Can't allocate space for the addrn",
  154.       0,0,0);
  155. return -1;
  156.     }
  157.     
  158.     ciptr->family=((struct sockaddr *) &sockname)->sa_family;
  159.     ciptr->addrlen=netbuf.len;
  160.     memcpy(ciptr->addr,&sockname,ciptr->addrlen);
  161.     
  162.     return 0;
  163. }
  164. /*
  165.  * This function gets the remote address of the socket and stores it in the
  166.  * XtransConnInfo structure for the connection.
  167.  */
  168. static int
  169. TRANS(TLIGetPeerAddr)(XtransConnInfo ciptr)
  170. {
  171.     Xtransaddr sockname;
  172.     struct netbuf netbuf;
  173.     
  174.     PRMSG(3,"TLIGetPeerAddr(%x)n", ciptr, 0,0 );
  175.     
  176.     netbuf.buf=(char *)&sockname;
  177.     netbuf.len=sizeof(sockname);
  178.     netbuf.maxlen=sizeof(sockname);
  179.     
  180.     if( t_getname(ciptr->fd,&netbuf,REMOTENAME) < 0 )
  181.     {
  182. PRMSG(1,"TLIGetPeerAddr: t_getname(REMOTENAME) failed: %dn",
  183.       errno, 0,0 );
  184. return -1;
  185.     }
  186.     
  187.     PRMSG(4,"TLIGetPeerAddr: got family %d len %dn",
  188.   ((struct sockaddr *) &sockname)->sa_family ,netbuf.len, 0 );
  189.     
  190.     /*
  191.      * Everything looks good: fill in the XtransConnInfo structure.
  192.      */
  193.     
  194.     if( ciptr->peeraddr )
  195. xfree(ciptr->peeraddr);
  196.     
  197.     if( (ciptr->peeraddr=(char *)xalloc(netbuf.len)) == NULL )
  198.     {
  199. PRMSG(1,
  200.       "TLIGetPeerAddr: Can't allocate space for the addrn",
  201.       0,0,0);
  202. return -1;
  203.     }
  204.     
  205.     ciptr->peeraddrlen=netbuf.len;
  206.     memcpy(ciptr->peeraddr,&sockname,ciptr->peeraddrlen);
  207.     
  208.     return 0;
  209. }
  210. /*
  211.  * This function will establish a local name for the transport. This function
  212.  * do extra work for the local tli connection. It must create a sockaddr_un
  213.  * format address so that it will look like an AF_UNIX connection to the
  214.  * higher layer.
  215.  *
  216.  * This function will only be called by the OPENC?TSClient() functions since
  217.  * the local address is set up in the CreateListner() for the server ends.
  218.  */
  219. static int
  220. TRANS(TLITLIBindLocal)(int fd, int family, char *port)
  221. {
  222.     struct sockaddr_un *sunaddr=NULL;
  223.     struct t_bind *req=NULL;
  224.     
  225.     PRMSG(2, "TLITLIBindLocal(%d,%d,%s)n", fd, family, port);
  226.     
  227.     if( family == AF_UNIX )
  228.     {
  229. if( (req=(struct t_bind *)t_alloc(fd,T_BIND,0)) == NULL )
  230. {
  231.     PRMSG(1,
  232.   "TLITLIBindLocal() failed to allocate a t_bindn",
  233.   0,0,0 );
  234.     return -1;
  235. }
  236. if( (sunaddr=(struct sockaddr_un *)
  237.      malloc(sizeof(struct sockaddr_un))) == NULL )
  238. {
  239.     PRMSG(1,
  240.   "TLITLIBindLocal: failed to allocate a sockaddr_unn",
  241.   0,0,0 );
  242.     t_free((char *)req,T_BIND);
  243.     return -1;
  244. }
  245. sunaddr->sun_family=AF_UNIX;
  246. #ifdef nuke
  247. if( *port == '/' ) { /* A full pathname */
  248.     (void) strcpy(sunaddr->sun_path, port);
  249. } else {
  250.     (void) sprintf(sunaddr->sun_path,"%s%s", TLINODENAME, port );
  251. }
  252. #endif /*NUKE*/
  253. (void) sprintf(sunaddr->sun_path,"%s%d",
  254.        TLINODENAME, getpid()^time(NULL) );
  255. PRMSG(4, "TLITLIBindLocal: binding to %sn",
  256.       sunaddr->sun_path, 0,0);
  257. req->addr.buf=(char *)sunaddr;
  258. req->addr.len=sizeof(*sunaddr);
  259. req->addr.maxlen=sizeof(*sunaddr);
  260.     }
  261.     
  262.     if( t_bind(fd, req, NULL) < 0 )
  263.     {
  264. PRMSG(1,
  265.       "TLIBindLocal: Unable to bind TLI device to %sn",
  266.       port, 0,0 );
  267. if (sunaddr)
  268.     free((char *) sunaddr);
  269. if (req)
  270.     t_free((char *)req,T_BIND);
  271. return -1;
  272.     }
  273.     return 0;
  274. }
  275. static XtransConnInfo
  276. TRANS(TLIOpen)(char *device)
  277. {
  278.     XtransConnInfo ciptr;
  279.     
  280.     PRMSG(3,"TLIOpen(%s)n", device, 0,0 );
  281.     
  282.     if( (ciptr=(XtransConnInfo)xcalloc(1,sizeof(struct _XtransConnInfo))) == NULL )
  283.     {
  284. PRMSG(1, "TLIOpen: calloc failedn", 0,0,0 );
  285. return NULL;
  286.     }
  287.     
  288.     if( (ciptr->fd=t_open( device, O_RDWR, NULL )) < 0 )
  289.     {
  290. PRMSG(1, "TLIOpen: t_open failed for %sn", device, 0,0 );
  291. free(ciptr);
  292. return NULL;
  293.     }
  294.     
  295.     return ciptr;
  296. }
  297. #ifdef TRANS_REOPEN
  298. static XtransConnInfo
  299. TRANS(TLIReopen)(char *device, int fd, char *port)
  300. {
  301.     XtransConnInfo ciptr;
  302.     
  303.     PRMSG(3,"TLIReopen(%s,%d, %s)n", device, fd, port );
  304.     
  305.     if (t_sync (fd) < 0)
  306.     {
  307. PRMSG(1, "TLIReopen: t_sync failedn", 0,0,0 );
  308. return NULL;
  309.     }
  310.     if( (ciptr=(XtransConnInfo)xcalloc(1,sizeof(struct _XtransConnInfo))) == NULL )
  311.     {
  312. PRMSG(1, "TLIReopen: calloc failedn", 0,0,0 );
  313. return NULL;
  314.     }
  315.     
  316.     ciptr->fd = fd;
  317.     
  318.     return ciptr;
  319. }
  320. #endif /* TRANS_REOPEN */
  321. static int
  322. TRANS(TLIAddrToNetbuf)(int tlifamily, char *host, char *port, 
  323.        struct netbuf *netbufp)
  324. {
  325.     struct netconfig *netconfigp;
  326.     struct nd_hostserv nd_hostserv;
  327.     struct nd_addrlist *nd_addrlistp = NULL;
  328.     void *handlep;
  329.     long lport;
  330.     
  331.     PRMSG(3,"TLIAddrToNetbuf(%d,%s,%s)n", tlifamily, host, port );
  332.     
  333.     if( (handlep=setnetconfig()) == NULL )
  334. return -1;
  335.     lport = strtol (port, (char**)NULL, 10);
  336.     if (lport < 1024 || lport > USHRT_MAX)
  337. return -1;
  338.     
  339.     nd_hostserv.h_host = host;
  340.     if( port && *port ) {
  341. nd_hostserv.h_serv = port;
  342.     } else {
  343. nd_hostserv.h_serv = NULL;
  344.     }
  345.     
  346.     while( (netconfigp=getnetconfig(handlep)) != NULL )
  347.     {
  348. if( strcmp(netconfigp->nc_protofmly,
  349.    TLItrans2devtab[tlifamily].protofamily) != 0 )
  350.     continue;
  351. PRMSG(5,"TLIAddrToNetbuf: Trying to resolve %s.%s for %sn",
  352.       host, port, TLItrans2devtab[tlifamily].protofamily );
  353. if( netdir_getbyname(netconfigp,&nd_hostserv, &nd_addrlistp) == 0 )
  354. {
  355.     /* we have at least one address to use */
  356.     
  357.     PRMSG(5, "TLIAddrToNetbuf: found address for %s.%sn", host, port, 0 );
  358.     PRMSG(5, "TLIAddrToNetbuf: %sn",taddr2uaddr(netconfigp,nd_addrlistp->n_addrs),
  359.   0,0 );
  360.     
  361.     memcpy(netbufp->buf,nd_addrlistp->n_addrs->buf,
  362.    nd_addrlistp->n_addrs->len);
  363.     netbufp->len=nd_addrlistp->n_addrs->len;
  364.     endnetconfig(handlep);
  365.     return 0;
  366. }
  367.     }
  368.     endnetconfig(handlep);
  369.     
  370.     return -1;
  371. }
  372. /*
  373.  * These functions are the interface supplied in the Xtransport structure
  374.  */
  375. #ifdef TRANS_CLIENT
  376. static XtransConnInfo
  377. TRANS(TLIOpenCOTSClient)(Xtransport *thistrans, char *protocol, 
  378.  char *host, char *port)
  379. {
  380.     XtransConnInfo ciptr;
  381.     int  i;
  382.     
  383.     PRMSG(2,"TLIOpenCOTSClient(%s,%s,%s)n", protocol, host, port );
  384.     
  385.     if( (i=TRANS(TLISelectFamily)(thistrans->TransName)) < 0 )
  386.     {
  387. PRMSG(1,"TLIOpenCOTSClient: Unable to determine device for %sn",
  388.       thistrans->TransName, 0,0 );
  389. return NULL;
  390.     }
  391.     
  392.     if( (ciptr=TRANS(TLIOpen)(TLItrans2devtab[i].devcotsname)) == NULL )
  393.     {
  394. PRMSG(1,"TLIOpenCOTSClient: Unable to open device for %sn",
  395.       thistrans->TransName, 0,0 );
  396. return NULL;
  397.     }
  398.     
  399.     if( TRANS(TLITLIBindLocal)(ciptr->fd,TLItrans2devtab[i].family,port) < 0 )
  400.     {
  401. PRMSG(1,
  402.       "TLIOpenCOTSClient: ...TLITLIBindLocal() failed: %dn",
  403.       errno, 0,0 );
  404. t_close(ciptr->fd);
  405. xfree(ciptr);
  406. return NULL;
  407.     }
  408.     
  409.     if( TRANS(TLIGetAddr)(ciptr) < 0 )
  410.     {
  411. PRMSG(1,
  412.       "TLIOpenCOTSClient: ...TLIGetAddr() failed: %dn",
  413.       errno, 0,0 );
  414. t_close(ciptr->fd);
  415. xfree(ciptr);
  416. return NULL;
  417.     }
  418.     
  419.     /* Save the TLIFamily for later use in TLIAddrToNetbuf() lookups */
  420.     ciptr->index = i;
  421.     
  422.     return ciptr;
  423. }
  424. #endif /* TRANS_CLIENT */
  425. #ifdef TRANS_SERVER
  426. static XtransConnInfo
  427. TRANS(TLIOpenCOTSServer)(Xtransport *thistrans, char *protocol, 
  428.  char *host, char *port)
  429. {
  430.     XtransConnInfo ciptr;
  431.     int  i;
  432.     
  433.     PRMSG(2,"TLIOpenCOTSServer(%s,%s,%s)n", protocol, host, port );
  434.     
  435.     if( (i=TRANS(TLISelectFamily)(thistrans->TransName)) < 0 )
  436.     {
  437. PRMSG(1,
  438.       "TLIOpenCOTSServer: Unable to determine device for %sn",
  439.       thistrans->TransName, 0,0 );
  440. return NULL;
  441.     }
  442.     
  443.     if( (ciptr=TRANS(TLIOpen)(TLItrans2devtab[i].devcotsname)) == NULL )
  444.     {
  445. PRMSG(1,
  446.       "TLIOpenCOTSServer: Unable to open device for %sn",
  447.       thistrans->TransName, 0,0 );
  448. return NULL;
  449.     }
  450.     
  451.     /* Set the family type */
  452.     ciptr->family = TLItrans2devtab[i].family;
  453.     /* Save the TLIFamily for later use in TLIAddrToNetbuf() lookups */
  454.     
  455.     ciptr->index = i;
  456.     
  457.     return ciptr;
  458. }
  459. #endif /* TRANS_SERVER */
  460. #ifdef TRANS_CLIENT
  461. static XtransConnInfo
  462. TRANS(TLIOpenCLTSClient)(Xtransport *thistrans, char *protocol, 
  463.  char *host, char *port)
  464. {
  465.     XtransConnInfo ciptr;
  466.     int  i;
  467.     
  468.     PRMSG(2,"TLIOpenCLTSClient(%s,%s,%s)n", protocol, host, port );
  469.     
  470.     if( (i=TRANS(TLISelectFamily)(thistrans->TransName)) < 0 )
  471.     {
  472. PRMSG(1,
  473.       "TLIOpenCLTSClient: Unable to determine device for %sn",
  474.       thistrans->TransName, 0,0 );
  475. return NULL;
  476.     }
  477.     
  478.     if( (ciptr=TRANS(TLIOpen)(TLItrans2devtab[i].devcltsname)) == NULL )
  479.     {
  480. PRMSG(1,
  481.       "TLIOpenCLTSClient: Unable to open device for %sn",
  482.       thistrans->TransName, 0,0 );
  483. return NULL;
  484.     }
  485.     
  486.     if( TRANS(TLITLIBindLocal)(ciptr->fd,TLItrans2devtab[i].family,port) < 0 )
  487.     {
  488. PRMSG(1,
  489.       "TLIOpenCLTSClient: ...TLITLIBindLocal() failed: %dn",
  490.       errno, 0,0 );
  491. t_close(ciptr->fd);
  492. xfree(ciptr);
  493. return NULL;
  494.     }
  495.     
  496.     if( TRANS(TLIGetAddr)(ciptr) < 0 )
  497.     {
  498. PRMSG(1,
  499.       "TLIOpenCLTSClient: ...TLIGetPeerAddr() failed: %dn",
  500.       errno, 0,0 );
  501. t_close(ciptr->fd);
  502. xfree(ciptr);
  503. return NULL;
  504.     }
  505.     
  506.     return ciptr;
  507. }
  508. #endif /* TRANS_CLIENT */
  509. #ifdef TRANS_SERVER
  510. static XtransConnInfo
  511. TRANS(TLIOpenCLTSServer)(Xtransport *thistrans, char *protocol, 
  512.  char *host, char *port)
  513. {
  514.     XtransConnInfo ciptr;
  515.     int  i;
  516.     
  517.     PRMSG(2,"TLIOpenCLTSServer(%s,%s,%s)n", protocol, host, port );
  518.     
  519.     if( (i=TRANS(TLISelectFamily)(thistrans->TransName)) < 0 )
  520.     {
  521. PRMSG(1,
  522.       "TLIOpenCLTSServer: Unable to determine device for %sn",
  523.       thistrans->TransName, 0,0 );
  524. return NULL;
  525.     }
  526.     
  527.     if( (ciptr=TRANS(TLIOpen)(TLItrans2devtab[i].devcltsname)) == NULL )
  528.     {
  529. PRMSG(1,
  530.       "TLIOpenCLTSServer: Unable to open device for %sn",
  531.       thistrans->TransName, 0,0 );
  532. return NULL;
  533.     }
  534.     
  535.     return ciptr;
  536. }
  537. #endif /* TRANS_SERVER */
  538. #ifdef TRANS_REOPEN
  539. static XtransConnInfo
  540. TRANS(TLIReopenCOTSServer)(Xtransport *thistrans, int fd, char *port)
  541. {
  542.     XtransConnInfo ciptr;
  543.     int i;
  544.     
  545.     PRMSG(2,"TLIReopenCOTSServer(%d, %s)n", fd, port, 0 );
  546.     
  547.     if( (i=TRANS(TLISelectFamily)(thistrans->TransName)) < 0 )
  548.     {
  549. PRMSG(1,
  550.       "TLIReopenCOTSServer: Unable to determine device for %sn",
  551.       thistrans->TransName, 0,0 );
  552. return NULL;
  553.     }
  554.     if( (ciptr=TRANS(TLIReopen)(
  555. TLItrans2devtab[i].devcotsname, fd, port)) == NULL )
  556.     {
  557. PRMSG(1,
  558.       "TLIReopenCOTSServer: Unable to open device for %sn",
  559.       thistrans->TransName, 0,0 );
  560. return NULL;
  561.     }
  562.     
  563.     /* Save the TLIFamily for later use in TLIAddrToNetbuf() lookups */
  564.     
  565.     ciptr->index = i;
  566.     
  567.     return ciptr;
  568. }
  569. static XtransConnInfo
  570. TRANS(TLIReopenCLTSServer)(Xtransport *thistrans, int fd, char *port)
  571. {
  572.     XtransConnInfo ciptr;
  573.     int  i;
  574.     
  575.     PRMSG(2,"TLIReopenCLTSServer(%d, %s)n", fd, port, 0 );
  576.     
  577.     if( (i=TRANS(TLISelectFamily)(thistrans->TransName)) < 0 )
  578.     {
  579. PRMSG(1,
  580.       "TLIReopenCLTSServer: Unable to determine device for %sn",
  581.       thistrans->TransName, 0,0 );
  582. return NULL;
  583.     }
  584.     if( (ciptr=TRANS(TLIReopen)(
  585. TLItrans2devtab[i].devcltsname, fd, port)) == NULL )
  586.     {
  587. PRMSG(1,
  588.       "TLIReopenCLTSServer: Unable to open device for %sn",
  589.       thistrans->TransName, 0,0 );
  590. return NULL;
  591.     }
  592.     
  593.     ciptr->index = i;
  594.     return ciptr;
  595. }
  596. #endif /* TRANS_REOPEN */
  597. static int
  598. TRANS(TLISetOption)(XtransConnInfo ciptr, int option, int arg)
  599. {
  600.     PRMSG(2,"TLISetOption(%d,%d,%d)n", ciptr->fd, option, arg );
  601.     
  602.     return -1;
  603. }
  604. #ifdef TRANS_SERVER
  605. static int
  606. TRANS(TLICreateListener)(XtransConnInfo ciptr, struct t_bind *req)
  607. {
  608.     struct t_bind *ret;
  609.     
  610.     PRMSG(2,"TLICreateListener(%x->%d,%x)n", ciptr, ciptr->fd, req );
  611.     
  612.     if( (ret=(struct t_bind *)t_alloc(ciptr->fd,T_BIND,T_ALL)) == NULL )
  613.     {
  614. PRMSG(1, "TLICreateListener: failed to allocate a t_bindn",
  615.       0,0,0 );
  616. t_free((char *)req,T_BIND);
  617. return TRANS_CREATE_LISTENER_FAILED;
  618.     }
  619.     
  620.     if( t_bind(ciptr->fd, req, ret) < 0 )
  621.     {
  622. PRMSG(1, "TLICreateListener: t_bind failedn", 0,0,0 );
  623. t_free((char *)req,T_BIND);
  624. t_free((char *)ret,T_BIND);
  625. return TRANS_CREATE_LISTENER_FAILED;
  626.     }
  627.     
  628.     if( memcmp(req->addr.buf,ret->addr.buf,req->addr.len) != 0 )
  629.     {
  630. PRMSG(1, "TLICreateListener: unable to bind to %xn",
  631.       req, 0,0 );
  632. t_free((char *)req,T_BIND);
  633. t_free((char *)ret,T_BIND);
  634. return TRANS_ADDR_IN_USE;
  635.     }
  636.     
  637.     /*
  638.      * Everything looks good: fill in the XtransConnInfo structure.
  639.      */
  640.     
  641.     if( (ciptr->addr=(char *)xalloc(ret->addr.len)) == NULL )
  642.     {
  643. PRMSG(1,
  644.       "TLICreateListener: Unable to allocate space for the addressn",
  645.       0,0,0 );
  646. t_free((char *)req,T_BIND);
  647. t_free((char *)ret, T_BIND);
  648. return TRANS_CREATE_LISTENER_FAILED;
  649.     }
  650.     
  651.     ciptr->addrlen=ret->addr.len;
  652.     memcpy(ciptr->addr,ret->addr.buf,ret->addr.len);
  653.     
  654.     t_free((char *)req,T_BIND);
  655.     t_free((char *)ret, T_BIND);
  656.     
  657.     return 0;
  658. }
  659. static int
  660. TRANS(TLIINETCreateListener)(XtransConnInfo ciptr, char *port, unsigned int flags)
  661. {
  662.     char    portbuf[PORTBUFSIZE];
  663.     struct t_bind *req;
  664.     struct sockaddr_in *sinaddr;
  665.     long tmpport;
  666.     
  667.     PRMSG(2,"TLIINETCreateListener(%x->%d,%s)n", ciptr,
  668. ciptr->fd, port ? port : "NULL" );
  669.     
  670. #ifdef X11_t
  671.     /*
  672.      * X has a well known port, that is transport dependent. It is easier
  673.      * to handle it here, than try and come up with a transport independent
  674.      * representation that can be passed in and resolved the usual way.
  675.      *
  676.      * The port that is passed here is really a string containing the idisplay
  677.      * from ConnectDisplay().
  678.      */
  679.     
  680.     if (is_numeric (port))
  681.     {
  682. tmpport = X_TCP_PORT + strtol (port, (char**)NULL, 10);
  683. sprintf(portbuf,"%u", tmpport);
  684. port = portbuf;
  685.     }
  686. #endif
  687.     
  688.     if( (req=(struct t_bind *)t_alloc(ciptr->fd,T_BIND,T_ALL)) == NULL )
  689.     {
  690. PRMSG(1,
  691.     "TLIINETCreateListener: failed to allocate a t_bindn",
  692.     0,0,0 );
  693. return TRANS_CREATE_LISTENER_FAILED;
  694.     }
  695.     if( port && *port ) {
  696. if(TRANS(TLIAddrToNetbuf)(ciptr->index,HOST_SELF,port,&(req->addr)) < 0)
  697. {
  698.     PRMSG(1,
  699.   "TLIINETCreateListener: can't resolve name:HOST_SELF.%sn",
  700.   port, 0,0 );
  701.     t_free((char *)req,T_BIND);
  702.     return TRANS_CREATE_LISTENER_FAILED;
  703. }
  704.     } else {
  705. sinaddr=(struct sockaddr_in *) req->addr.buf;
  706. sinaddr->sin_family=AF_INET;
  707. sinaddr->sin_port=htons(0);
  708. sinaddr->sin_addr.s_addr=0;
  709.     }
  710.     /* Set the qlen */
  711.     req->qlen=1;
  712.     
  713.     return TRANS(TLICreateListener)(ciptr, req);
  714. }
  715. static int
  716. TRANS(TLITLICreateListener)(XtransConnInfo ciptr, char *port, unsigned int flags)
  717. {
  718.     struct t_bind *req;
  719.     struct sockaddr_un *sunaddr;
  720.     int  ret_value;
  721.     
  722.     PRMSG(2,"TLITLICreateListener(%x->%d,%s)n", ciptr, ciptr->fd,
  723. port ? port : "NULL");
  724.     
  725.     if( (req=(struct t_bind *)t_alloc(ciptr->fd,T_BIND,0)) == NULL )
  726.     {
  727. PRMSG(1,
  728.       "TLITLICreateListener: failed to allocate a t_bindn",
  729.       0,0,0 );
  730. return TRANS_CREATE_LISTENER_FAILED;
  731.     }
  732.     
  733.     if( (sunaddr=(struct sockaddr_un *)
  734.  malloc(sizeof(struct sockaddr_un))) == NULL )
  735.     {
  736. PRMSG(1,
  737.       "TLITLICreateListener: failed to allocate a sockaddr_unn",
  738.       0,0,0 );
  739. t_free((char *)req,T_BIND);
  740. return TRANS_CREATE_LISTENER_FAILED;
  741.     }
  742.     
  743.     sunaddr->sun_family=AF_UNIX;
  744.     if( port && *port ) {
  745. if( *port == '/' ) { /* A full pathname */
  746.     (void) strcpy(sunaddr->sun_path, port);
  747. } else {
  748.     (void) sprintf(sunaddr->sun_path,"%s%s", TLINODENAME, port );
  749. }
  750.     } else {
  751. (void) sprintf(sunaddr->sun_path,"%s%d", TLINODENAME, getpid());
  752.     }
  753.     
  754.     req->addr.buf=(char *)sunaddr;
  755.     req->addr.len=sizeof(*sunaddr);
  756.     req->addr.maxlen=sizeof(*sunaddr);
  757.     
  758.     /* Set the qlen */
  759.     
  760.     req->qlen=1;
  761.     
  762.     ret_value = TRANS(TLICreateListener)(ciptr, req);
  763.     free((char *) sunaddr);
  764.     return ret_value;
  765. }
  766. static XtransConnInfo
  767. TRANS(TLIAccept)(XtransConnInfo ciptr, int *status)
  768. {
  769.     struct t_call *call;
  770.     XtransConnInfo newciptr;
  771.     int i;
  772.     
  773.     PRMSG(2,"TLIAccept(%x->%d)n", ciptr, ciptr->fd, 0 );
  774.     
  775.     if( (call=(struct t_call *)t_alloc(ciptr->fd,T_CALL,T_ALL)) == NULL )
  776.     {
  777. PRMSG(1, "TLIAccept() failed to allocate a t_calln", 0,0,0 );
  778. *status = TRANS_ACCEPT_BAD_MALLOC;
  779. return NULL;
  780.     }
  781.     
  782.     if( t_listen(ciptr->fd,call) < 0 )
  783.     {
  784. extern char *t_errlist[];
  785. extern int t_errno;
  786. PRMSG(1, "TLIAccept() t_listen() failedn", 0,0,0 );
  787. PRMSG(1, "TLIAccept: %sn", t_errlist[t_errno], 0,0 );
  788. t_free((char *)call,T_CALL);
  789. *status = TRANS_ACCEPT_MISC_ERROR;
  790. return NULL;
  791.     }
  792.     
  793.     /*
  794.      * Now we need to set up the new endpoint for the incoming connection.
  795.      */
  796.     
  797.     i=ciptr->index; /* Makes the next line more readable */
  798.     
  799.     if( (newciptr=TRANS(TLIOpen)(TLItrans2devtab[i].devcotsname)) == NULL )
  800.     {
  801. PRMSG(1, "TLIAccept() failed to open a new endpointn", 0,0,0 );
  802. t_free((char *)call,T_CALL);
  803. *status = TRANS_ACCEPT_MISC_ERROR;
  804. return NULL;
  805.     }
  806.     
  807.     if( TRANS(TLITLIBindLocal)(newciptr->fd,TLItrans2devtab[i].family,"") < 0 )
  808.     {
  809. PRMSG(1,
  810.       "TLIAccept: TRANS(TLITLIBindLocal)() failed: %dn",
  811.       errno, 0,0 );
  812. t_free((char *)call,T_CALL);
  813. t_close(newciptr->fd);
  814. xfree(newciptr);
  815. *status = TRANS_ACCEPT_MISC_ERROR;
  816. return NULL;
  817.     }
  818.     
  819.     
  820.     if( t_accept(ciptr->fd,newciptr->fd,call) < 0 )
  821.     {
  822. extern char *t_errlist[];
  823. extern int t_errno;
  824. PRMSG(1, "TLIAccept() t_accept() failedn", 0,0,0 );
  825. PRMSG(1, "TLIAccept: %sn", t_errlist[t_errno], 0,0 );
  826. if( t_errno == TLOOK )
  827. {
  828.     int evtype = t_look(ciptr->fd);
  829.     PRMSG(1, "TLIAccept() t_look() returned %dn", evtype,0,0 );
  830.     switch( evtype )
  831.     {
  832. case T_DISCONNECT:
  833.     if( t_rcvdis(ciptr->fd, NULL) < 0 )
  834.     {
  835. PRMSG(1, "TLIAccept() t_rcvdis() failedn", 0,0,0 );
  836. PRMSG(1, "TLIAccept: %sn", t_errlist[t_errno], 0,0 );
  837.     }
  838.     break;
  839. default:
  840.     break;
  841.     }
  842. }
  843. t_free((char *)call,T_CALL);
  844. t_close(newciptr->fd);
  845. free(newciptr);
  846. *status = TRANS_ACCEPT_FAILED;
  847. return NULL;
  848.     }
  849.     
  850.     t_free((char *)call,T_CALL);
  851.     
  852.     if( TRANS(TLIGetAddr)(newciptr) < 0 )
  853.     {
  854. PRMSG(1,
  855.       "TLIAccept: TRANS(TLIGetPeerAddr)() failed: %dn",
  856.       errno, 0,0 );
  857. t_close(newciptr->fd);
  858. xfree(newciptr);
  859. *status = TRANS_ACCEPT_MISC_ERROR;
  860. return NULL;
  861.     }
  862.     
  863.     if( TRANS(TLIGetPeerAddr)(newciptr) < 0 )
  864.     {
  865. PRMSG(1,
  866.       "TLIAccept: TRANS(TLIGetPeerAddr)() failed: %dn",
  867.       errno, 0,0 );
  868. t_close(newciptr->fd);
  869. xfree(newciptr->addr);
  870. xfree(newciptr);
  871. *status = TRANS_ACCEPT_MISC_ERROR;
  872. return NULL;
  873.     }
  874.     
  875.     if( ioctl(newciptr->fd, I_POP,"timod") < 0 )
  876.     {
  877. PRMSG(1, "TLIAccept() ioctl(I_POP, "timod") failed %dn",
  878.       errno,0,0 );
  879. t_close(newciptr->fd);
  880. xfree(newciptr->addr);
  881. xfree(newciptr);
  882. *status = TRANS_ACCEPT_MISC_ERROR;
  883. return NULL;
  884.     }
  885.     
  886.     if( ioctl(newciptr->fd, I_PUSH,"tirdwr") < 0 )
  887.     {
  888. PRMSG(1, "TLIAccept() ioctl(I_PUSH,"tirdwr") failed %dn",
  889.       errno,0,0 );
  890. t_close(newciptr->fd);
  891. xfree(newciptr->addr);
  892. xfree(newciptr);
  893. *status = TRANS_ACCEPT_MISC_ERROR;
  894. return NULL;
  895.     }
  896.     
  897.     *status = 0;
  898.     return newciptr;
  899. }
  900. #endif /* TRANS_SERVER */
  901. #ifdef TRANS_CLIENT
  902. static int
  903. TRANS(TLIConnect)(XtransConnInfo ciptr, struct t_call *sndcall )
  904. {
  905.     PRMSG(2, "TLIConnect(%x->%d,%x)n", ciptr, ciptr->fd, sndcall);
  906.     
  907.     if( t_connect(ciptr->fd,sndcall,NULL) < 0 )
  908.     {
  909. extern char *t_errlist[];
  910. extern int t_errno;
  911. PRMSG(1, "TLIConnect() t_connect() failedn", 0,0,0 );
  912. PRMSG(1, "TLIConnect: %sn", t_errlist[t_errno], 0,0 );
  913. t_free((char *)sndcall,T_CALL);
  914. if (t_errno == TLOOK && t_look(ciptr->fd) == T_DISCONNECT)
  915. {
  916.     t_rcvdis(ciptr->fd,NULL);
  917.     return TRANS_TRY_CONNECT_AGAIN;
  918. }
  919. else
  920.     return TRANS_CONNECT_FAILED;
  921.     }
  922.     
  923.     t_free((char *)sndcall,T_CALL);
  924.     
  925.     /*
  926.      * Sync up the address fields of ciptr.
  927.      */
  928.     
  929.     if( TRANS(TLIGetAddr)(ciptr) < 0 )
  930.     {
  931. PRMSG(1,
  932.       "TLIConnect: ...TLIGetAddr() failed: %dn",
  933.       errno, 0,0 );
  934. return TRANS_CONNECT_FAILED;
  935.     }
  936.     
  937.     if( TRANS(TLIGetPeerAddr)(ciptr) < 0 )
  938.     {
  939. PRMSG(1,
  940.       "TLIConnect: ...TLIGetPeerAddr() failed: %dn",
  941.       errno, 0,0 );
  942. return TRANS_CONNECT_FAILED;
  943.     }
  944.     
  945.     if( ioctl(ciptr->fd, I_POP,"timod") < 0 )
  946.     {
  947. PRMSG(1, "TLIConnect() ioctl(I_POP,"timod") failed %dn",
  948.       errno,0,0 );
  949. return TRANS_CONNECT_FAILED;
  950.     }
  951.     
  952.     if( ioctl(ciptr->fd, I_PUSH,"tirdwr") < 0 )
  953.     {
  954. PRMSG(1, "TLIConnect() ioctl(I_PUSH,"tirdwr") failed %dn",
  955.       errno,0,0 );
  956. return TRANS_CONNECT_FAILED;
  957.     }
  958.     
  959.     return 0;
  960. }
  961. static int
  962. TRANS(TLIINETConnect)(XtransConnInfo ciptr, char *host, char *port)
  963. {
  964.     char portbuf[PORTBUFSIZE];
  965.     struct t_call *sndcall;
  966.     long tmpport;
  967.     
  968.     PRMSG(2, "TLIINETConnect(%s,%s)n", host, port, 0);
  969.     
  970. #ifdef X11_t
  971.     /*
  972.      * X has a well known port, that is transport dependant. It is easier
  973.      * to handle it here, than try and come up with a transport independent
  974.      * representation that can be passed in and resolved the usual way.
  975.      *
  976.      * The port that is passed here is really a string containing the idisplay
  977.      * from ConnectDisplay().
  978.      */
  979.     
  980.     if (is_numeric (port))
  981.     {
  982. tmpport = X_TCP_PORT + strtol (port, (char**)NULL, 10);
  983. sprintf(portbuf,"%u", tmpport );
  984. port = portbuf;
  985.     }
  986. #endif
  987.     
  988.     if( (sndcall=(struct t_call *)t_alloc(ciptr->fd,T_CALL,T_ALL)) == NULL )
  989.     {
  990. PRMSG(1, "TLIINETConnect() failed to allocate a t_calln", 0,0,0 );
  991. return TRANS_CONNECT_FAILED;
  992.     }
  993.     
  994.     if( TRANS(TLIAddrToNetbuf)(ciptr->index, host, port, &(sndcall->addr) ) < 0 )
  995.     {
  996. PRMSG(1, "TLIINETConnect() unable to resolve name:%s.%sn",
  997.       host, port, 0 );
  998. t_free((char *)sndcall,T_CALL);
  999. return TRANS_CONNECT_FAILED;
  1000.     }
  1001.     
  1002.     return TRANS(TLIConnect)(ciptr, sndcall );
  1003. }
  1004. static int
  1005. TRANS(TLITLIConnect)(XtransConnInfo ciptr, char *host, char *port)
  1006. {
  1007.     struct t_call *sndcall;
  1008.     struct sockaddr_un *sunaddr;
  1009.     int ret_value;
  1010.     
  1011.     PRMSG(2, "TLITLIConnect(%s,%s)n", host, port, 0);
  1012.     
  1013.     if( (sndcall=(struct t_call *)t_alloc(ciptr->fd,T_CALL,T_OPT|T_UDATA)) == NULL )
  1014.     {
  1015. PRMSG(1, "TLITLIConnect() failed to allocate a t_calln", 0,0,0 );
  1016. return TRANS_CONNECT_FAILED;
  1017.     }
  1018.     
  1019.     if( (sunaddr=(struct sockaddr_un *)
  1020.  malloc(sizeof(struct sockaddr_un))) == NULL )
  1021.     {
  1022. PRMSG(1,
  1023.       "TLITLIConnect: failed to allocate a sockaddr_unn",
  1024.       0,0,0 );
  1025. t_free((char *)sndcall,T_CALL);
  1026. return TRANS_CONNECT_FAILED;
  1027.     }
  1028.     
  1029.     sunaddr->sun_family=AF_UNIX;
  1030.     if( *port == '/' ||
  1031. strncmp (port, TLINODENAME, strlen (TLINODENAME)) == 0) {
  1032. /* Use the port as is */
  1033. (void) strcpy(sunaddr->sun_path, port);
  1034.     } else {
  1035. (void) sprintf(sunaddr->sun_path,"%s%s", TLINODENAME, port );
  1036.     }
  1037.     sndcall->addr.buf=(char *)sunaddr;
  1038.     sndcall->addr.len=sizeof(*sunaddr);
  1039.     sndcall->addr.maxlen=sizeof(*sunaddr);
  1040.     
  1041.     ret_value = TRANS(TLIConnect)(ciptr, sndcall );
  1042.     free((char *) sunaddr);
  1043.     return ret_value;
  1044. }
  1045. #endif /* TRANS_CLIENT */
  1046. static int
  1047. TRANS(TLIBytesReadable)(XtransConnInfo ciptr, BytesReadable_t *pend)
  1048. {
  1049.     int ret;
  1050.     struct pollfd filedes;
  1051.     PRMSG(2, "TLIByteReadable(%x->%d,%x)n", ciptr, ciptr->fd, pend );
  1052.     /*
  1053.      * This function should detect hangup conditions. Use poll to check
  1054.      * if no data is present. On SVR4, the M_HANGUP message sits on the
  1055.      * streams head, and ioctl(N_READ) keeps returning 0 because there is
  1056.      * no data available. The hangup goes undetected, and the client hangs.
  1057.      */
  1058.     
  1059.     ret=ioctl(ciptr->fd, I_NREAD, (char *)pend);
  1060.     if( ret != 0 )
  1061. return ret; /* Data present or error */
  1062.     /* Zero data, or POLLHUP message */
  1063.     filedes.fd=ciptr->fd;
  1064.     filedes.events=POLLIN;
  1065.     ret=poll(&filedes, 1, 0);
  1066.  
  1067.     if( ret == 0 ) {
  1068. *pend=0;
  1069. return 0; /* Really, no data */
  1070. }
  1071.     if( ret < 0 )
  1072. return -1; /* just pass back the error */
  1073.     if( filedes.revents & (POLLHUP|POLLERR) ) /* check for hangup */
  1074. return -1;
  1075.     /* Should only get here if data arrived after the first ioctl() */
  1076.     return ioctl(ciptr->fd, I_NREAD, (char *)pend);
  1077. }
  1078. static int
  1079. TRANS(TLIRead)(XtransConnInfo ciptr, char *buf, int size)
  1080. {
  1081.     PRMSG(2, "TLIRead(%d,%x,%d)n", ciptr->fd, buf, size );
  1082.     
  1083.     return read(ciptr->fd,buf,size);
  1084. }
  1085. static int
  1086. TRANS(TLIWrite)(XtransConnInfo ciptr, char *buf, int size)
  1087. {
  1088.     PRMSG(2, "TLIWrite(%d,%x,%d)n", ciptr->fd, buf, size );
  1089.     
  1090.     return write(ciptr->fd,buf,size);
  1091. }
  1092. static int
  1093. TRANS(TLIReadv)(XtransConnInfo ciptr, struct iovec *buf, int size)
  1094. {
  1095.     PRMSG(2, "TLIReadv(%d,%x,%d)n", ciptr->fd, buf, size );
  1096.     
  1097.     return READV(ciptr,buf,size);
  1098. }
  1099. static int
  1100. TRANS(TLIWritev)(XtransConnInfo ciptr, struct iovec *buf, int size)
  1101. {
  1102.     PRMSG(2, "TLIWritev(%d,%x,%d)n", ciptr->fd, buf, size );
  1103.     
  1104.     return WRITEV(ciptr,buf,size);
  1105. }
  1106. static int
  1107. TRANS(TLIDisconnect)(XtransConnInfo ciptr)
  1108. {
  1109.     PRMSG(2, "TLIDisconnect(%x->%d)n", ciptr, ciptr->fd, 0 );
  1110.     
  1111.     /*
  1112.      * Restore the TLI modules so that the connection can be properly shutdown.
  1113.      * This avoids the situation where a connection goes into the TIME_WAIT
  1114.      * state, and the address remains unavailable for a while.
  1115.      */
  1116.     ioctl(ciptr->fd, I_POP,"tirdwr");
  1117.     ioctl(ciptr->fd, I_PUSH,"timod");
  1118.     t_snddis(ciptr->fd,NULL);
  1119.     
  1120.     return 0;
  1121. }
  1122. static int
  1123. TRANS(TLIClose)(XtransConnInfo ciptr)
  1124. {
  1125.     PRMSG(2, "TLIClose(%x->%d)n", ciptr, ciptr->fd, 0 );
  1126.     
  1127.     t_unbind(ciptr->fd);
  1128.     return (t_close(ciptr->fd));
  1129. }
  1130. static int
  1131. TRANS(TLICloseForCloning)(XtransConnInfo ciptr)
  1132. {
  1133.     /*
  1134.      * Don't unbind.
  1135.      */
  1136.     PRMSG(2, "TLICloseForCloning(%x->%d)n", ciptr, ciptr->fd, 0 );
  1137.     
  1138.     return (t_close(ciptr->fd));
  1139. }
  1140. Xtransport TRANS(TLITCPFuncs) = {
  1141. /* TLI Interface */
  1142. "tcp",
  1143. 0,
  1144. #ifdef TRANS_CLIENT
  1145. TRANS(TLIOpenCOTSClient),
  1146. #endif /* TRANS_CLIENT */
  1147. #ifdef TRANS_SERVER
  1148. NULL,
  1149. TRANS(TLIOpenCOTSServer),
  1150. #endif /* TRANS_SERVER */
  1151. #ifdef TRANS_CLIENT
  1152. TRANS(TLIOpenCLTSClient),
  1153. #endif /* TRANS_CLIENT */
  1154. #ifdef TRANS_SERVER
  1155. TRANS(TLIOpenCLTSServer),
  1156. #endif /* TRANS_SERVER */
  1157. #ifdef TRANS_REOPEN
  1158. TRANS(TLIReopenCOTSServer),
  1159. TRANS(TLIReopenCLTSServer),
  1160. #endif
  1161. TRANS(TLISetOption),
  1162. #ifdef TRANS_SERVER
  1163. TRANS(TLIINETCreateListener),
  1164. NULL,         /* ResetListener */
  1165. TRANS(TLIAccept),
  1166. #endif /* TRANS_SERVER */
  1167. #ifdef TRANS_CLIENT
  1168. TRANS(TLIINETConnect),
  1169. #endif /* TRANS_CLIENT */
  1170. TRANS(TLIBytesReadable),
  1171. TRANS(TLIRead),
  1172. TRANS(TLIWrite),
  1173. TRANS(TLIReadv),
  1174. TRANS(TLIWritev),
  1175. TRANS(TLIDisconnect),
  1176. TRANS(TLIClose),
  1177. TRANS(TLICloseForCloning),
  1178. };
  1179. #ifdef TRANS_SERVER
  1180. static char * inet_aliases[] = { "tcp", NULL };
  1181. #endif
  1182. Xtransport TRANS(TLIINETFuncs) = {
  1183. /* TLI Interface */
  1184. "inet",
  1185. TRANS_ALIAS,
  1186. #ifdef TRANS_CLIENT
  1187. TRANS(TLIOpenCOTSClient),
  1188. #endif /* TRANS_CLIENT */
  1189. #ifdef TRANS_SERVER
  1190. inet_aliases,
  1191. TRANS(TLIOpenCOTSServer),
  1192. #endif /* TRANS_SERVER */
  1193. #ifdef TRANS_CLIENT
  1194. TRANS(TLIOpenCLTSClient),
  1195. #endif /* TRANS_CLIENT */
  1196. #ifdef TRANS_SERVER
  1197. TRANS(TLIOpenCLTSServer),
  1198. #endif /* TRANS_SERVER */
  1199. #ifdef TRANS_REOPEN
  1200. TRANS(TLIReopenCOTSServer),
  1201. TRANS(TLIReopenCLTSServer),
  1202. #endif
  1203. TRANS(TLISetOption),
  1204. #ifdef TRANS_SERVER
  1205. TRANS(TLIINETCreateListener),
  1206. NULL,         /* ResetListener */
  1207. TRANS(TLIAccept),
  1208. #endif /* TRANS_SERVER */
  1209. #ifdef TRANS_CLIENT
  1210. TRANS(TLIINETConnect),
  1211. #endif /* TRANS_CLIENT */
  1212. TRANS(TLIBytesReadable),
  1213. TRANS(TLIRead),
  1214. TRANS(TLIWrite),
  1215. TRANS(TLIReadv),
  1216. TRANS(TLIWritev),
  1217. TRANS(TLIDisconnect),
  1218. TRANS(TLIClose),
  1219. TRANS(TLICloseForCloning),
  1220. };
  1221. Xtransport TRANS(TLITLIFuncs) = {
  1222. /* TLI Interface */
  1223. "tli",
  1224. 0,
  1225. #ifdef TRANS_CLIENT
  1226. TRANS(TLIOpenCOTSClient),
  1227. #endif /* TRANS_CLIENT */
  1228. #ifdef TRANS_SERVER
  1229. NULL,
  1230. TRANS(TLIOpenCOTSServer),
  1231. #endif /* TRANS_SERVER */
  1232. #ifdef TRANS_CLIENT
  1233. TRANS(TLIOpenCLTSClient),
  1234. #endif /* TRANS_CLIENT */
  1235. #ifdef TRANS_SERVER
  1236. TRANS(TLIOpenCLTSServer),
  1237. #endif /* TRANS_SERVER */
  1238. #ifdef TRANS_REOPEN
  1239. TRANS(TLIReopenCOTSServer),
  1240. TRANS(TLIReopenCLTSServer),
  1241. #endif
  1242. TRANS(TLISetOption),
  1243. #ifdef TRANS_SERVER
  1244. TRANS(TLITLICreateListener),
  1245. NULL,         /* ResetListener */
  1246. TRANS(TLIAccept),
  1247. #endif /* TRANS_SERVER */
  1248. #ifdef TRANS_CLIENT
  1249. TRANS(TLITLIConnect),
  1250. #endif /* TRANS_CLIENT */
  1251. TRANS(TLIBytesReadable),
  1252. TRANS(TLIRead),
  1253. TRANS(TLIWrite),
  1254. TRANS(TLIReadv),
  1255. TRANS(TLIWritev),
  1256. TRANS(TLIDisconnect),
  1257. TRANS(TLIClose),
  1258. TRANS(TLICloseForCloning),
  1259. };