Provided by: trafficserver-dev_5.3.0-2ubuntu2_amd64 bug

NAME

       TSVConnFdCreate - create a TSVConn from a socket

SYNOPSIS

       #include <ts/ts.h>

       TSVConn TSVConnFdCreate(int fd)

DESCRIPTION

       TSVConnFdCreate()  accepts a network socket and returns a new TSVConn constructed from the
       socket. The socket descriptor must be an already connected socket. It will be placed  into
       non-blocking mode.

RETURN VALUES

       On  success, the returned TSVConn object owns the socket and the caller must not close it.
       If TSVConnFdCreate() fails, NULL is returned, the socket is unchanged and the caller  must
       close it.

EXAMPLES

       The  example  below is excerpted from example/intercept/intercept.cc in the Traffic Server
       source distribution. It demonstrates how to use TSVConnFdCreate() to construct  a  TSVConn
       from a connected socket.

              // This event is delivered by the continuation that we
              // attached in InterceptTxnHook, so the continuation data is
              // the TSHttpTxn pointer.
              VDEBUG("allocated server intercept state istate=%p for txn=%p", istate, cdata.txn);

              // Set up a connection to our real origin, which will be
              // 127.0.0.1:$PORT.
              memset(&addr, 0, sizeof(addr));
              addr.sin.sin_family = AF_INET;
              addr.sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); // XXX config option
              addr.sin.sin_port = htons(PORT);                   // XXX config option

              // Normally, we would use TSNetConnect to connect to a secondary service, but to demonstrate
              // the use of TSVConnFdCreate, we do a blocking connect inline. This it not recommended for
              // production plugins, since it might block an event thread for an arbitrary time.
              fd = ::socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
              TSReleaseAssert(fd != -1);

              if (::connect(fd, &addr.sa, sizeof(addr.sin)) == -1) {
                // We failed to connect to the intercepted origin. Abort the
                // server intercept since we cannot handle it.
                VDEBUG("connect failed with %s (%d)", strerror(errno), errno);
                TSVConnAbort(arg.vc, TS_VC_CLOSE_ABORT);

                delete istate;
                TSContDestroy(contp);

                close(fd);
                return TS_EVENT_NONE;
              }

              VDEBUG("binding client vc=%p to %s:%u", istate->client.vc, inet_ntop(AF_INET, &addr.sin.sin_addr, buf, sizeof(buf)),
                     (unsigned)ntohs(addr.sin.sin_port));

              istate->txn = cdata.txn;
              istate->client.vc = arg.vc;
              istate->server.vc = TSVConnFdCreate(fd);

              // Reset the continuation data to be our intercept state
              // block. We will need this so that we can access both of the
              // VCs at the same time. We need to do this before calling
              // TSNetConnect so that we can handle the failure case.
              TSContDataSet(contp, istate);

              // Start reading the request from the server intercept VC.
              istate->client.readio.read(istate->client.vc, contp);
              VIODEBUG(istate->client.readio.vio, "started %s read", InterceptProxySide(istate, &istate->client));

SEE ALSO

       TSAPI(3ts)

COPYRIGHT

       2014, dev@trafficserver.apache.org