X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fos_support.c;h=bf6b8f29caa5f4c6ea4e36280e9bfea479369fd3;hb=6b3484dcbc6fe6a5f3d0919922790592c9d5a608;hp=913ca539c87045318813e93c260f5733719da9b1;hpb=b0387edd5e766b1032f946d6cdb35b765bb45435;p=ffmpeg diff --git a/libavformat/os_support.c b/libavformat/os_support.c index 913ca539c87..bf6b8f29caa 100644 --- a/libavformat/os_support.c +++ b/libavformat/os_support.c @@ -28,10 +28,12 @@ #include "os_support.h" #if defined(_WIN32) && !defined(__MINGW32CE__) +#undef open +#include +#include #include #include -#undef open int ff_win32_open(const char *filename_utf8, int oflag, int pmode) { int fd; @@ -58,9 +60,10 @@ int ff_win32_open(const char *filename_utf8, int oflag, int pmode) #if CONFIG_NETWORK #include -#include #if !HAVE_POLL_H +#if HAVE_SYS_TIME_H #include +#endif #if HAVE_WINSOCK2_H #include #elif HAVE_SYS_SELECT_H @@ -73,21 +76,22 @@ int ff_win32_open(const char *filename_utf8, int oflag, int pmode) #if !HAVE_INET_ATON #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); } @@ -95,7 +99,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; @@ -112,7 +116,7 @@ int ff_getaddrinfo(const char *node, const char *service, #endif *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; @@ -131,9 +135,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; } @@ -148,16 +152,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; @@ -220,7 +230,7 @@ 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)); } } @@ -229,41 +239,62 @@ int ff_getnameinfo(const struct sockaddr *sa, int salen, if (!(flags & NI_NUMERICSERV)) ent = getservbyport(sin->sin_port, flags & NI_DGRAM ? "udp" : "tcp"); - 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 + 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); + 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 !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; @@ -283,8 +314,8 @@ int poll(struct pollfd *fds, nfds_t numfds, int timeout) 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 @@ -294,38 +325,43 @@ int poll(struct pollfd *fds, nfds_t numfds, int timeout) } #endif - 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 < numfds; 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; }