diff options
author | Luca Barbato <lu_zero@gentoo.org> | 2011-04-04 18:17:12 +0200 |
---|---|---|
committer | Luca Barbato <lu_zero@gentoo.org> | 2011-04-07 02:53:55 +0200 |
commit | ebba2b3e2a551ce638d17332761431ba748f178f (patch) | |
tree | 5fded7a9455e3a83c513d594cf17337ad22c0096 /libavformat/udp.c | |
parent | 1f6265e011f6e56562b2f58c182bc0261062b3c4 (diff) | |
download | ffmpeg-ebba2b3e2a551ce638d17332761431ba748f178f.tar.gz |
proto: factor ff_network_wait_fd and use it on udp
Support the URL_FLAG_NONBLOCK semantic and uniform the protocol.
The quick retry loop is already part of retry_transfer_wrapper.
The polling routine is common to the network protocols:
udp, tcp and, once merged, sctp.
Diffstat (limited to 'libavformat/udp.c')
-rw-r--r-- | libavformat/udp.c | 59 |
1 files changed, 19 insertions, 40 deletions
diff --git a/libavformat/udp.c b/libavformat/udp.c index 8d50218f19..72e2ab53d0 100644 --- a/libavformat/udp.c +++ b/libavformat/udp.c @@ -33,9 +33,6 @@ #include "internal.h" #include "network.h" #include "os_support.h" -#if HAVE_POLL_H -#include <poll.h> -#endif #include <sys/time.h> #ifndef IPV6_ADD_MEMBERSHIP @@ -447,31 +444,15 @@ static int udp_open(URLContext *h, const char *uri, int flags) static int udp_read(URLContext *h, uint8_t *buf, int size) { UDPContext *s = h->priv_data; - struct pollfd p = {s->udp_fd, POLLIN, 0}; - int len; int ret; - for(;;) { - if (url_interrupt_cb()) - return AVERROR_EXIT; - ret = poll(&p, 1, 100); - if (ret < 0) { - if (ff_neterrno() == AVERROR(EINTR)) - continue; - return AVERROR(EIO); - } - if (!(ret == 1 && p.revents & POLLIN)) - continue; - len = recv(s->udp_fd, buf, size, 0); - if (len < 0) { - if (ff_neterrno() != AVERROR(EAGAIN) && - ff_neterrno() != AVERROR(EINTR)) - return AVERROR(EIO); - } else { - break; - } + if (!(h->flags & URL_FLAG_NONBLOCK)) { + ret = ff_network_wait_fd(s->udp_fd, 0); + if (ret < 0) + return ret; } - return len; + ret = recv(s->udp_fd, buf, size, 0); + return ret < 0 ? ff_neterrno() : ret; } static int udp_write(URLContext *h, const uint8_t *buf, int size) @@ -479,22 +460,20 @@ static int udp_write(URLContext *h, const uint8_t *buf, int size) UDPContext *s = h->priv_data; int ret; - for(;;) { - if (!s->is_connected) { - ret = sendto (s->udp_fd, buf, size, 0, - (struct sockaddr *) &s->dest_addr, - s->dest_addr_len); - } else - ret = send(s->udp_fd, buf, size, 0); - if (ret < 0) { - if (ff_neterrno() != AVERROR(EINTR) && - ff_neterrno() != AVERROR(EAGAIN)) - return ff_neterrno(); - } else { - break; - } + if (!(h->flags & URL_FLAG_NONBLOCK)) { + ret = ff_network_wait_fd(s->udp_fd, 1); + if (ret < 0) + return ret; } - return size; + + if (!s->is_connected) { + ret = sendto (s->udp_fd, buf, size, 0, + (struct sockaddr *) &s->dest_addr, + s->dest_addr_len); + } else + ret = send(s->udp_fd, buf, size, 0); + + return ret < 0 ? ff_neterrno() : ret; } static int udp_close(URLContext *h) |