Merge commit '28306e6d620c109ddd672f7243adfbc2bbb3b18f'

* commit '28306e6d620c109ddd672f7243adfbc2bbb3b18f':
  network: factor out bind-listening code
  use my full first name instead of short one in copyrights

Conflicts:
	libavformat/tcp.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
pull/23/merge
Michael Niedermayer 12 years ago
commit 4d4f5911d3
  1. 2
      libavcodec/binkdata.h
  2. 2
      libavcodec/binkdsp.c
  3. 2
      libavcodec/binkdsp.h
  4. 29
      libavformat/network.c
  5. 3
      libavformat/network.h
  6. 2
      libavformat/rtmp.h
  7. 2
      libavformat/rtmppkt.c
  8. 2
      libavformat/rtmppkt.h
  9. 2
      libavformat/rtmpproto.c
  10. 34
      libavformat/tcp.c

@ -1,6 +1,6 @@
/* /*
* Bink video decoder * Bink video decoder
* Copyright (C) 2009 Kostya Shishkov * Copyright (C) 2009 Konstantin Shishkov
* *
* This file is part of FFmpeg. * This file is part of FFmpeg.
* *

@ -1,6 +1,6 @@
/* /*
* Bink DSP routines * Bink DSP routines
* Copyright (c) 2009 Kostya Shishkov * Copyright (c) 2009 Konstantin Shishkov
* *
* This file is part of FFmpeg. * This file is part of FFmpeg.
* *

@ -1,6 +1,6 @@
/* /*
* Bink DSP routines * Bink DSP routines
* Copyright (c) 2009 Kostya Shishkov * Copyright (c) 2009 Konstantin Shishkov
* *
* This file is part of Libav. * This file is part of Libav.
* *

@ -212,3 +212,32 @@ int ff_is_multicast_address(struct sockaddr *addr)
return 0; return 0;
} }
int ff_listen_bind(int fd, const struct sockaddr *addr,
socklen_t addrlen, int timeout)
{
int ret;
int reuse = 1;
struct pollfd lp = { fd, POLLIN, 0 };
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));
ret = bind(fd, addr, addrlen);
if (ret)
return ff_neterrno();
ret = listen(fd, 1);
if (ret)
return ff_neterrno();
ret = poll(&lp, 1, timeout >= 0 ? timeout : -1);
if (ret <= 0)
return AVERROR(ETIMEDOUT);
ret = accept(fd, NULL, NULL);
if (ret < 0)
return ff_neterrno();
closesocket(fd);
ff_socket_nonblock(ret, 1);
return ret;
}

@ -222,4 +222,7 @@ const char *ff_gai_strerror(int ecode);
int ff_is_multicast_address(struct sockaddr *addr); int ff_is_multicast_address(struct sockaddr *addr);
int ff_listen_bind(int fd, const struct sockaddr *addr,
socklen_t addrlen, int timeout);
#endif /* AVFORMAT_NETWORK_H */ #endif /* AVFORMAT_NETWORK_H */

@ -1,6 +1,6 @@
/* /*
* RTMP definitions * RTMP definitions
* Copyright (c) 2009 Kostya Shishkov * Copyright (c) 2009 Konstantin Shishkov
* *
* This file is part of FFmpeg. * This file is part of FFmpeg.
* *

@ -1,6 +1,6 @@
/* /*
* RTMP input format * RTMP input format
* Copyright (c) 2009 Kostya Shishkov * Copyright (c) 2009 Konstantin Shishkov
* *
* This file is part of FFmpeg. * This file is part of FFmpeg.
* *

@ -1,6 +1,6 @@
/* /*
* RTMP packet utilities * RTMP packet utilities
* Copyright (c) 2009 Kostya Shishkov * Copyright (c) 2009 Konstantin Shishkov
* *
* This file is part of FFmpeg. * This file is part of FFmpeg.
* *

@ -1,6 +1,6 @@
/* /*
* RTMP network protocol * RTMP network protocol
* Copyright (c) 2009 Kostya Shishkov * Copyright (c) 2009 Konstantin Shishkov
* *
* This file is part of FFmpeg. * This file is part of FFmpeg.
* *

@ -108,39 +108,18 @@ static int tcp_open(URLContext *h, const char *uri, int flags)
cur_ai = ai; cur_ai = ai;
restart: restart:
ret = AVERROR(EIO);
fd = socket(cur_ai->ai_family, cur_ai->ai_socktype, cur_ai->ai_protocol); fd = socket(cur_ai->ai_family, cur_ai->ai_socktype, cur_ai->ai_protocol);
if (fd < 0) if (fd < 0) {
ret = ff_neterrno();
goto fail; goto fail;
}
if (s->listen) { if (s->listen) {
int fd1; if ((fd = ff_listen_bind(fd, cur_ai->ai_addr, cur_ai->ai_addrlen,
int reuse = 1; s->listen_timeout)) < 0) {
struct pollfd lp = { fd, POLLIN, 0 }; ret = fd;
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));
ret = bind(fd, cur_ai->ai_addr, cur_ai->ai_addrlen);
if (ret) {
ret = ff_neterrno();
goto fail1;
}
ret = listen(fd, 1);
if (ret) {
ret = ff_neterrno();
goto fail1;
}
ret = poll(&lp, 1, s->listen_timeout >= 0 ? s->listen_timeout : -1);
if (ret <= 0) {
ret = AVERROR(ETIMEDOUT);
goto fail1;
}
fd1 = accept(fd, NULL, NULL);
if (fd1 < 0) {
ret = ff_neterrno();
goto fail1; goto fail1;
} }
closesocket(fd);
fd = fd1;
ff_socket_nonblock(fd, 1);
} else { } else {
redo: redo:
ff_socket_nonblock(fd, 1); ff_socket_nonblock(fd, 1);
@ -202,6 +181,7 @@ static int tcp_open(URLContext *h, const char *uri, int flags)
cur_ai = cur_ai->ai_next; cur_ai = cur_ai->ai_next;
if (fd >= 0) if (fd >= 0)
closesocket(fd); closesocket(fd);
ret = 0;
goto restart; goto restart;
} }
fail1: fail1:

Loading…
Cancel
Save