static int tcp_open(URLContext *h, const char *uri, int flags)

{

    struct sockaddr_in dest_addr;

    char hostname[1024], *q;

    int port, fd = -1;

    TCPContext *s;

    const char *p;

    fd_set wfds;

    int fd_max, ret;

    struct timeval tv;

    socklen_t optlen;

    

    s = av_malloc(sizeof(TCPContext));

    if (!s)

        return -ENOMEM;

    h->priv_data = s;

    p = uri;

    if (!strstart(p, "tcp://", &p))

        goto fail;

    q = hostname;

    while (*p != ':' && *p != '/' && *p != '\0') {

        if ((q - hostname) < sizeof(hostname) - 1)

            *q++ = *p;

        p++;

    }

    *q = '\0';

    if (*p != ':')

        goto fail;

    p++;

    port = strtoul(p, (char **)&p, 10);

    if (port <= 0 || port >= 65536)

        goto fail;

    

    dest_addr.sin_family = AF_INET;

    dest_addr.sin_port = htons(port);

    if (resolve_host(&dest_addr.sin_addr, hostname) < 0)

        goto fail;



    fd = socket(PF_INET, SOCK_STREAM, 0);

    if (fd < 0)

        goto fail;

    fcntl(fd, F_SETFL, O_NONBLOCK);

    

 redo:

    ret = connect(fd, (struct sockaddr *)&dest_addr, 

                  sizeof(dest_addr));

    if (ret < 0) {

        if (errno == EINTR)

            goto redo;

        if (errno != EINPROGRESS)

            goto fail;



        /* wait until we are connected or until abort */

        for(;;) {

            if (url_interrupt_cb()) {

                ret = -EINTR;

                goto fail1;

            }

            fd_max = fd;

            FD_ZERO(&wfds);

            FD_SET(fd, &wfds);

            tv.tv_sec = 0;

            tv.tv_usec = 100 * 1000;

            ret = select(fd_max + 1, NULL, &wfds, NULL, &tv);

            if (ret > 0 && FD_ISSET(fd, &wfds))

                break;

        }

        

        /* test error */

        optlen = sizeof(ret);

        getsockopt (fd, SOL_SOCKET, SO_ERROR, &ret, &optlen);

        if (ret != 0)

            goto fail;

    }

    s->fd = fd;

    return 0;



 fail:

    ret = AVERROR_IO;

 fail1:

    if (fd >= 0)

        close(fd);

    av_free(s);

    return ret;

}

static int tcp_open(URLContext *h, const char *uri, int flags)

{

    struct sockaddr_in dest_addr;

    char hostname[1024], *q;

    int port, fd = -1;

    TCPContext *s;

    const char *p;

    fd_set wfds;

    int fd_max, ret;

    struct timeval tv;

    socklen_t optlen;

    

    s = av_malloc(sizeof(TCPContext));

    if (!s)

        return -ENOMEM;

    h->priv_data = s;

    p = uri;

    if (!strstart(p, "tcp:

        goto fail;

    q = hostname;

    while (*p != ':' && *p != '/' && *p != '\0') {

        if ((q - hostname) < sizeof(hostname) - 1)

            *q++ = *p;

        p++;

    }

    *q = '\0';

    if (*p != ':')

        goto fail;

    p++;

    port = strtoul(p, (char **)&p, 10);

    if (port <= 0 || port >= 65536)

        goto fail;

    

    dest_addr.sin_family = AF_INET;

    dest_addr.sin_port = htons(port);

    if (resolve_host(&dest_addr.sin_addr, hostname) < 0)

        goto fail;



    fd = socket(PF_INET, SOCK_STREAM, 0);

    if (fd < 0)

        goto fail;

    fcntl(fd, F_SETFL, O_NONBLOCK);

    

 redo:

    ret = connect(fd, (struct sockaddr *)&dest_addr, 

                  sizeof(dest_addr));

    if (ret < 0) {

        if (errno == EINTR)

            goto redo;

        if (errno != EINPROGRESS)

            goto fail;



        

        for(;;) {

            if (url_interrupt_cb()) {

                ret = -EINTR;

                goto fail1;

            }

            fd_max = fd;

            FD_ZERO(&wfds);

            FD_SET(fd, &wfds);

            tv.tv_sec = 0;

            tv.tv_usec = 100 * 1000;

            ret = select(fd_max + 1, NULL, &wfds, NULL, &tv);

            if (ret > 0 && FD_ISSET(fd, &wfds))

                break;

        }

        

        

        optlen = sizeof(ret);

        getsockopt (fd, SOL_SOCKET, SO_ERROR, &ret, &optlen);

        if (ret != 0)

            goto fail;

    }

    s->fd = fd;

    return 0;



 fail:

    ret = AVERROR_IO;

 fail1:

    if (fd >= 0)

        close(fd);

    av_free(s);

    return ret;

}

static int FUNC_0(URLContext *VAR_0, const char *VAR_1, int VAR_2)

{

    struct sockaddr_in VAR_3;

    char VAR_4[1024], *VAR_5;

    int VAR_6, VAR_7 = -1;

    TCPContext *s;

    const char *VAR_8;

    fd_set wfds;

    int VAR_9, VAR_10;

    struct timeval VAR_11;

    socklen_t optlen;

    

    s = av_malloc(sizeof(TCPContext));

    if (!s)

        return -ENOMEM;

    VAR_0->priv_data = s;

    VAR_8 = VAR_1;

    if (!strstart(VAR_8, "tcp:

        goto fail;

    VAR_5 = VAR_4;

    while (*VAR_8 != ':' && *VAR_8 != '/' && *VAR_8 != '\0') {

        if ((VAR_5 - VAR_4) < sizeof(VAR_4) - 1)

            *VAR_5++ = *VAR_8;

        VAR_8++;

    }

    *VAR_5 = '\0';

    if (*VAR_8 != ':')

        goto fail;

    VAR_8++;

    VAR_6 = strtoul(VAR_8, (char **)&VAR_8, 10);

    if (VAR_6 <= 0 || VAR_6 >= 65536)

        goto fail;

    

    VAR_3.sin_family = AF_INET;

    VAR_3.sin_port = htons(VAR_6);

    if (resolve_host(&VAR_3.sin_addr, VAR_4) < 0)

        goto fail;



    VAR_7 = socket(PF_INET, SOCK_STREAM, 0);

    if (VAR_7 < 0)

        goto fail;

    fcntl(VAR_7, F_SETFL, O_NONBLOCK);

    

 redo:

    VAR_10 = connect(VAR_7, (struct sockaddr *)&VAR_3, 

                  sizeof(VAR_3));

    if (VAR_10 < 0) {

        if (errno == EINTR)

            goto redo;

        if (errno != EINPROGRESS)

            goto fail;



        

        for(;;) {

            if (url_interrupt_cb()) {

                VAR_10 = -EINTR;

                goto fail1;

            }

            VAR_9 = VAR_7;

            FD_ZERO(&wfds);

            FD_SET(VAR_7, &wfds);

            VAR_11.tv_sec = 0;

            VAR_11.tv_usec = 100 * 1000;

            VAR_10 = select(VAR_9 + 1, NULL, &wfds, NULL, &VAR_11);

            if (VAR_10 > 0 && FD_ISSET(VAR_7, &wfds))

                break;

        }

        

        

        optlen = sizeof(VAR_10);

        getsockopt (VAR_7, SOL_SOCKET, SO_ERROR, &VAR_10, &optlen);

        if (VAR_10 != 0)

            goto fail;

    }

    s->VAR_7 = VAR_7;

    return 0;



 fail:

    VAR_10 = AVERROR_IO;

 fail1:

    if (VAR_7 >= 0)

        close(VAR_7);

    av_free(s);

    return VAR_10;

}

static int FUNC_0(URLContext *VAR_0, const char *VAR_1, int VAR_2)
{ struct sockaddr_in VAR_3; char VAR_4[1024], *VAR_5; int VAR_6, VAR_7 = -1; TCPContext *s; const char *VAR_8; fd_set wfds; int VAR_9, VAR_10; struct timeval VAR_11; socklen_t optlen; s = av_malloc(sizeof(TCPContext)); if (!s)
return -ENOMEM; VAR_0->priv_data = s; VAR_8 = VAR_1; if (!strstart(VAR_8, "tcp:
goto fail; VAR_5 = VAR_4; while (*VAR_8 != ':' && *VAR_8 != '/' && *VAR_8 != '\0') { if ((VAR_5 - VAR_4) < sizeof(VAR_4) - 1)
*VAR_5++ = *VAR_8; VAR_8++; } *VAR_5 = '\0'; if (*VAR_8 != ':')
goto fail; VAR_8++; VAR_6 = strtoul(VAR_8, (char **)&VAR_8, 10); if (VAR_6 <= 0 || VAR_6 >= 65536)
goto fail; VAR_3.sin_family = AF_INET; VAR_3.sin_port = htons(VAR_6); if (resolve_host(&VAR_3.sin_addr, VAR_4) < 0)
goto fail; VAR_7 = socket(PF_INET, SOCK_STREAM, 0); if (VAR_7 < 0)
goto fail; fcntl(VAR_7, F_SETFL, O_NONBLOCK); redo:
VAR_10 = connect(VAR_7, (struct sockaddr *)&VAR_3,
sizeof(VAR_3)); if (VAR_10 < 0) { if (errno == EINTR)
goto redo; if (errno != EINPROGRESS)
goto fail; for(;;) { if (url_interrupt_cb()) { VAR_10 = -EINTR; goto fail1; } VAR_9 = VAR_7; FD_ZERO(&wfds); FD_SET(VAR_7, &wfds); VAR_11.tv_sec = 0; VAR_11.tv_usec = 100 * 1000; VAR_10 = select(VAR_9 + 1, NULL, &wfds, NULL, &VAR_11); if (VAR_10 > 0 && FD_ISSET(VAR_7, &wfds))
break; } optlen = sizeof(VAR_10); getsockopt (VAR_7, SOL_SOCKET, SO_ERROR, &VAR_10, &optlen); if (VAR_10 != 0)
goto fail; } s->VAR_7 = VAR_7; return 0; fail:
VAR_10 = AVERROR_IO; fail1:
if (VAR_7 >= 0)
close(VAR_7); av_free(s); return VAR_10; }