X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fos_support.c;h=650baea0d0c95dae2c22a7fb00a97ef9ee1d3a9e;hb=82ee7d0dda0fec8cdb670f4e844bf5c2927ad9de;hp=83f0820662f71630b224cd3a4be20e3bf2427819;hpb=7fddac9320eec31bc9027f1b1fabac0f3aafaeb2;p=ffmpeg diff --git a/libavformat/os_support.c b/libavformat/os_support.c index 83f0820662f..650baea0d0c 100644 --- a/libavformat/os_support.c +++ b/libavformat/os_support.c @@ -1,28 +1,27 @@ /* - * Various utilities for ffmpeg system + * various OS-feature replacement utilities * Copyright (c) 2000, 2001, 2002 Fabrice Bellard * copyright (c) 2002 Francois Revol * - * This file is part of FFmpeg. + * This file is part of Libav. * - * FFmpeg is free software; you can redistribute it and/or + * Libav is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * - * FFmpeg is distributed in the hope that it will be useful, + * Libav is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software + * License along with Libav; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /* needed by inet_aton() */ #define _SVID_SOURCE -#define _DARWIN_C_SOURCE #include "config.h" #include "avformat.h" @@ -30,37 +29,38 @@ #if CONFIG_NETWORK #include -#include #if !HAVE_POLL_H +#if HAVE_SYS_TIME_H #include +#endif /* HAVE_SYS_TIME_H */ #if HAVE_WINSOCK2_H #include #elif HAVE_SYS_SELECT_H #include -#endif -#endif +#endif /* HAVE_WINSOCK2_H */ +#endif /* !HAVE_POLL_H */ #include "network.h" #if !HAVE_INET_ATON #include -#include -int ff_inet_aton (const char * str, struct in_addr * add) +int ff_inet_aton(const char *str, struct in_addr *add) { unsigned int add1 = 0, add2 = 0, add3 = 0, add4 = 0; if (sscanf(str, "%d.%d.%d.%d", &add1, &add2, &add3, &add4) != 4) return 0; - if (!add1 || (add1|add2|add3|add4) > 255) return 0; + if (!add1 || (add1 | add2 | add3 | add4) > 255) + return 0; add->s_addr = htonl((add1 << 24) + (add2 << 16) + (add3 << 8) + add4); return 1; } #else -int ff_inet_aton (const char * str, struct in_addr * add) +int ff_inet_aton(const char *str, struct in_addr *add) { return inet_aton(str, add); } @@ -68,7 +68,7 @@ int ff_inet_aton (const char * str, struct in_addr * add) #if !HAVE_GETADDRINFO int ff_getaddrinfo(const char *node, const char *service, - const struct addrinfo *hints, struct addrinfo **res) + const struct addrinfo *hints, struct addrinfo **res) { struct hostent *h = NULL; struct addrinfo *ai; @@ -82,10 +82,10 @@ int ff_getaddrinfo(const char *node, const char *service, win_getaddrinfo = GetProcAddress(ws2mod, "getaddrinfo"); if (win_getaddrinfo) return win_getaddrinfo(node, service, hints, res); -#endif +#endif /* HAVE_WINSOCK2_H */ *res = NULL; - sin = av_mallocz(sizeof(struct sockaddr_in)); + sin = av_mallocz(sizeof(struct sockaddr_in)); if (!sin) return EAI_FAIL; sin->sin_family = AF_INET; @@ -104,9 +104,9 @@ int ff_getaddrinfo(const char *node, const char *service, memcpy(&sin->sin_addr, h->h_addr_list[0], sizeof(struct in_addr)); } } else { - if (hints && (hints->ai_flags & AI_PASSIVE)) { + if (hints && (hints->ai_flags & AI_PASSIVE)) sin->sin_addr.s_addr = INADDR_ANY; - } else + else sin->sin_addr.s_addr = INADDR_LOOPBACK; } @@ -121,16 +121,22 @@ int ff_getaddrinfo(const char *node, const char *service, return EAI_FAIL; } - *res = ai; - ai->ai_family = AF_INET; + *res = ai; + ai->ai_family = AF_INET; ai->ai_socktype = hints ? hints->ai_socktype : 0; switch (ai->ai_socktype) { - case SOCK_STREAM: ai->ai_protocol = IPPROTO_TCP; break; - case SOCK_DGRAM: ai->ai_protocol = IPPROTO_UDP; break; - default: ai->ai_protocol = 0; break; + case SOCK_STREAM: + ai->ai_protocol = IPPROTO_TCP; + break; + case SOCK_DGRAM: + ai->ai_protocol = IPPROTO_UDP; + break; + default: + ai->ai_protocol = 0; + break; } - ai->ai_addr = (struct sockaddr *)sin; + ai->ai_addr = (struct sockaddr *)sin; ai->ai_addrlen = sizeof(struct sockaddr_in); if (hints && (hints->ai_flags & AI_CANONNAME)) ai->ai_canonname = h ? av_strdup(h->h_name) : NULL; @@ -150,7 +156,7 @@ void ff_freeaddrinfo(struct addrinfo *res) win_freeaddrinfo(res); return; } -#endif +#endif /* HAVE_WINSOCK2_H */ av_free(res->ai_canonname); av_free(res->ai_addr); @@ -171,7 +177,7 @@ int ff_getnameinfo(const struct sockaddr *sa, int salen, win_getnameinfo = GetProcAddress(ws2mod, "getnameinfo"); if (win_getnameinfo) return win_getnameinfo(sa, salen, host, hostlen, serv, servlen, flags); -#endif +#endif /* HAVE_WINSOCK2_H */ if (sa->sa_family != AF_INET) return EAI_FAMILY; @@ -193,52 +199,73 @@ int ff_getnameinfo(const struct sockaddr *sa, int salen, a = ntohl(sin->sin_addr.s_addr); snprintf(host, hostlen, "%d.%d.%d.%d", ((a >> 24) & 0xff), ((a >> 16) & 0xff), - ((a >> 8) & 0xff), ( a & 0xff)); + ((a >> 8) & 0xff), (a & 0xff)); } } if (serv && servlen > 0) { struct servent *ent = NULL; +#if HAVE_GETSERVBYPORT if (!(flags & NI_NUMERICSERV)) ent = getservbyport(sin->sin_port, flags & NI_DGRAM ? "udp" : "tcp"); +#endif /* HAVE_GETSERVBYPORT */ - if (ent) { + if (ent) snprintf(serv, servlen, "%s", ent->s_name); - } else + else snprintf(serv, servlen, "%d", ntohs(sin->sin_port)); } return 0; } +#endif /* !HAVE_GETADDRINFO */ +#if !HAVE_GETADDRINFO || HAVE_WINSOCK2_H const char *ff_gai_strerror(int ecode) { - switch(ecode) { - case EAI_FAIL : return "A non-recoverable error occurred"; - case EAI_FAMILY : return "The address family was not recognized or the address length was invalid for the specified family"; - case EAI_NONAME : return "The name does not resolve for the supplied parameters"; + switch (ecode) { + case EAI_AGAIN: + return "Temporary failure in name resolution"; + case EAI_BADFLAGS: + return "Invalid flags for ai_flags"; + case EAI_FAIL: + return "A non-recoverable error occurred"; + case EAI_FAMILY: + return "The address family was not recognized or the address " + "length was invalid for the specified family"; + case EAI_MEMORY: + return "Memory allocation failure"; +#if EAI_NODATA != EAI_NONAME + case EAI_NODATA: + return "No address associated with hostname"; +#endif /* EAI_NODATA != EAI_NONAME */ + case EAI_NONAME: + return "The name does not resolve for the supplied parameters"; + case EAI_SERVICE: + return "servname not supported for ai_socktype"; + case EAI_SOCKTYPE: + return "ai_socktype not supported"; } return "Unknown error"; } -#endif +#endif /* !HAVE_GETADDRINFO || HAVE_WINSOCK2_H */ int ff_socket_nonblock(int socket, int enable) { #if HAVE_WINSOCK2_H - return ioctlsocket(socket, FIONBIO, &enable); + u_long param = enable; + return ioctlsocket(socket, FIONBIO, ¶m); #else - if (enable) - return fcntl(socket, F_SETFL, fcntl(socket, F_GETFL) | O_NONBLOCK); - else - return fcntl(socket, F_SETFL, fcntl(socket, F_GETFL) & ~O_NONBLOCK); -#endif + if (enable) + return fcntl(socket, F_SETFL, fcntl(socket, F_GETFL) | O_NONBLOCK); + else + return fcntl(socket, F_SETFL, fcntl(socket, F_GETFL) & ~O_NONBLOCK); +#endif /* HAVE_WINSOCK2_H */ } -#endif /* CONFIG_NETWORK */ -#if CONFIG_FFSERVER #if !HAVE_POLL_H -int poll(struct pollfd *fds, nfds_t numfds, int timeout) +int ff_poll(struct pollfd *fds, nfds_t numfds, int timeout) { fd_set read_set; fd_set write_set; @@ -252,14 +279,14 @@ int poll(struct pollfd *fds, nfds_t numfds, int timeout) errno = EINVAL; return -1; } -#endif +#endif /* HAVE_WINSOCK2_H */ FD_ZERO(&read_set); FD_ZERO(&write_set); FD_ZERO(&exception_set); - n = -1; - for(i = 0; i < numfds; i++) { + n = 0; + for (i = 0; i < numfds; i++) { if (fds[i].fd < 0) continue; #if !HAVE_WINSOCK2_H @@ -267,43 +294,48 @@ int poll(struct pollfd *fds, nfds_t numfds, int timeout) errno = EINVAL; return -1; } -#endif +#endif /* !HAVE_WINSOCK2_H */ - if (fds[i].events & POLLIN) FD_SET(fds[i].fd, &read_set); - if (fds[i].events & POLLOUT) FD_SET(fds[i].fd, &write_set); - if (fds[i].events & POLLERR) FD_SET(fds[i].fd, &exception_set); + if (fds[i].events & POLLIN) + FD_SET(fds[i].fd, &read_set); + if (fds[i].events & POLLOUT) + FD_SET(fds[i].fd, &write_set); + if (fds[i].events & POLLERR) + FD_SET(fds[i].fd, &exception_set); - if (fds[i].fd > n) - n = fds[i].fd; - }; + if (fds[i].fd >= n) + n = fds[i].fd + 1; + } - if (n == -1) + if (n == 0) /* Hey!? Nothing to poll, in fact!!! */ return 0; - if (timeout < 0) - rc = select(n+1, &read_set, &write_set, &exception_set, NULL); - else { - struct timeval tv; - - tv.tv_sec = timeout / 1000; + if (timeout < 0) { + rc = select(n, &read_set, &write_set, &exception_set, NULL); + } else { + struct timeval tv; + tv.tv_sec = timeout / 1000; tv.tv_usec = 1000 * (timeout % 1000); - rc = select(n+1, &read_set, &write_set, &exception_set, &tv); - }; + rc = select(n, &read_set, &write_set, &exception_set, &tv); + } if (rc < 0) return rc; - for(i = 0; i < (nfds_t) n; i++) { + for (i = 0; i < numfds; i++) { fds[i].revents = 0; - if (FD_ISSET(fds[i].fd, &read_set)) fds[i].revents |= POLLIN; - if (FD_ISSET(fds[i].fd, &write_set)) fds[i].revents |= POLLOUT; - if (FD_ISSET(fds[i].fd, &exception_set)) fds[i].revents |= POLLERR; - }; + if (FD_ISSET(fds[i].fd, &read_set)) + fds[i].revents |= POLLIN; + if (FD_ISSET(fds[i].fd, &write_set)) + fds[i].revents |= POLLOUT; + if (FD_ISSET(fds[i].fd, &exception_set)) + fds[i].revents |= POLLERR; + } return rc; } -#endif /* HAVE_POLL_H */ -#endif /* CONFIG_FFSERVER */ +#endif /* !HAVE_POLL_H */ +#endif /* CONFIG_NETWORK */