* 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>tags/n2.0
| @@ -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; | |||||
| int reuse = 1; | |||||
| struct pollfd lp = { fd, POLLIN, 0 }; | |||||
| 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(); | |||||
| if ((fd = ff_listen_bind(fd, cur_ai->ai_addr, cur_ai->ai_addrlen, | |||||
| s->listen_timeout)) < 0) { | |||||
| ret = fd; | |||||
| 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: | ||||