vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Thu Nov 3 20:11:08 2011 +0200| [5ceabdd8d3fa1c4641bb6d35a0f40d4cf4e5b650] | committer: Rémi Denis-Courmont
Rewrite inet_pton() and inet_ntop() into compat This should correct error handling cases. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=5ceabdd8d3fa1c4641bb6d35a0f40d4cf4e5b650 --- compat/inet_pton.c | 67 +++++++++++++++++++++++++++++++++++ configure.ac | 18 +--------- include/vlc_fixups.h | 7 +--- include/vlc_network.h | 3 -- src/libvlccore.sym | 2 - src/network/getaddrinfo.c | 85 --------------------------------------------- 6 files changed, 70 insertions(+), 112 deletions(-) diff --git a/compat/inet_pton.c b/compat/inet_pton.c new file mode 100644 index 0000000..f139138 --- /dev/null +++ b/compat/inet_pton.c @@ -0,0 +1,67 @@ +/***************************************************************************** + * inet_pton.c: POSIX/IETF inet_pton() and inet_ntop() replacements + ***************************************************************************** + * Copyright © 2011 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <stdio.h> +#include <errno.h> + +#include <sys/types.h> +#ifndef WIN32 +# include <sys/socket.h> +#else +# include <winsock2.h> +# define EAFNOSUPPORT WSAEAFNOSUPPORT +#endif + +int inet_pton (int af, const char *src, void *dst) +{ + unsigned char *b = dst; + + switch (af) + { + case AF_INET: + return sscanf (src, "%hhu.%hhu.%hhu.%hhu", + b + 0, b + 1, b + 2, b + 3) == 4; + } + errno = EAFNOSUPPORT; + return -1; +} + +const char *inet_ntop (int af, const void *src, char *dst, int len) +{ + const unsigned char *b = src; + + switch (af) + { + case AF_INET: + if (snprintf (dst, len, "%hhu.%hhu.%hhu.%hhu", + b[0], b[1], b[2], b[3]) <= len) + { + errno = ENOSPC; + return NULL; + } + return dst; + } + errno = EAFNOSUPPORT; + return NULL; +} diff --git a/configure.ac b/configure.ac index b0d3e3f..5a4b021 100644 --- a/configure.ac +++ b/configure.ac @@ -559,7 +559,7 @@ need_libc=false dnl Check for usual libc functions AC_CHECK_DECLS([nanosleep],,,[#include <time.h>]) AC_CHECK_FUNCS([daemon fcntl fstatvfs fork getenv getpwuid_r if_nameindex if_nametoindex isatty lstat memalign mmap openat pread posix_fadvise posix_madvise setlocale stricmp strnicmp uselocale]) -AC_REPLACE_FUNCS([asprintf atof atoll dirfd fdopendir flockfile fsync getdelim getpid gmtime_r lldiv localtime_r nrand48 rewind setenv strcasecmp strcasestr strdup strlcpy strncasecmp strndup strnlen strsep strtof strtok_r strtoll swab tdestroy vasprintf]) +AC_REPLACE_FUNCS([asprintf atof atoll dirfd fdopendir flockfile fsync getdelim getpid gmtime_r inet_pton lldiv localtime_r nrand48 rewind setenv strcasecmp strcasestr strdup strlcpy strncasecmp strndup strnlen strsep strtof strtok_r strtoll swab tdestroy vasprintf]) AC_CHECK_FUNCS(fdatasync,, [AC_DEFINE(fdatasync, fsync, [Alias fdatasync() to fsync() if missing.]) ]) @@ -1646,22 +1646,6 @@ AM_CONDITIONAL([ENABLE_VLM], [test "${enable_vlm}" != "no"]) dnl -dnl ipv6 support -dnl -have_ipv6=no -AC_CHECK_FUNCS(inet_pton,[have_ipv6=yes],[ - AC_CHECK_LIB(nsl,inet_pton, [have_ipv6=yes]) -]) - -AS_IF([test "${have_ipv6}" = "yes"], [ - AC_DEFINE(HAVE_INET_PTON, 1, [Define to 1 if you have inet_pton().])]) - - -AC_CHECK_FUNCS(inet_ntop,[ - AC_DEFINE(HAVE_INET_NTOP, 1, [Define to 1 if you have inet_ntop().])]) - - -dnl dnl Input plugins dnl diff --git a/include/vlc_fixups.h b/include/vlc_fixups.h index f94b1f0..c275076 100644 --- a/include/vlc_fixups.h +++ b/include/vlc_fixups.h @@ -250,11 +250,8 @@ void swab (const void *, void *, ssize_t); /* Socket stuff */ #ifndef HAVE_INET_PTON -# define inet_pton vlc_inet_pton -#endif - -#ifndef HAVE_INET_NTOP -# define inet_ntop vlc_inet_ntop +int inet_pton(int, const char *, void *); +const char *inet_ntop(int, const void *, char *, int); #endif #ifndef HAVE_STRUCT_POLLFD diff --git a/include/vlc_network.h b/include/vlc_network.h index f145312..cd9ae90 100644 --- a/include/vlc_network.h +++ b/include/vlc_network.h @@ -163,9 +163,6 @@ VLC_API ssize_t net_Printf( vlc_object_t *p_this, int fd, const v_socket_t *, co VLC_API ssize_t net_vaPrintf( vlc_object_t *p_this, int fd, const v_socket_t *, const char *psz_fmt, va_list args ); #define net_vaPrintf(a,b,c,d,e) net_vaPrintf(VLC_OBJECT(a),b,c,d,e) -VLC_API int vlc_inet_pton(int af, const char *src, void *dst); -VLC_API const char *vlc_inet_ntop(int af, const void *src, - char *dst, socklen_t cnt); struct pollfd; VLC_API int vlc_poll(struct pollfd *fds, unsigned nfds, int timeout); diff --git a/src/libvlccore.sym b/src/libvlccore.sym index 0a52c27..2bcdfba 100644 --- a/src/libvlccore.sym +++ b/src/libvlccore.sym @@ -549,8 +549,6 @@ vlc_hold vlc_iconv vlc_iconv_close vlc_iconv_open -vlc_inet_ntop -vlc_inet_pton vlc_join vlc_list_children vlc_list_release diff --git a/src/network/getaddrinfo.c b/src/network/getaddrinfo.c index 6648f88..fccbbf1 100644 --- a/src/network/getaddrinfo.c +++ b/src/network/getaddrinfo.c @@ -189,88 +189,3 @@ out: LocaleFree (node); return ret; } - - -/** - * inet_pton() replacement - */ -int vlc_inet_pton (int af, const char *src, void *dst) -{ -#ifndef HAVE_INET_PTON - /* Windows Vista has inet_pton(), but not XP. */ - /* We have a pretty good example of abstraction inversion here... */ - struct addrinfo hints = { - .ai_family = af, - .ai_socktype = SOCK_DGRAM, /* make sure we have... */ - .ai_protocol = IPPROTO_UDP, /* ...only one response */ - .ai_flags = AI_NUMERICHOST, - }, *res; - - if (getaddrinfo (src, NULL, &hints, &res)) - return 0; - - const void *data; - size_t len; - - switch (af) - { - case AF_INET: - data = &((const struct sockaddr_in *)res->ai_addr)->sin_addr; - len = sizeof (struct in_addr); - break; -#ifdef AF_INET6 - case AF_INET6: - data = &((const struct sockaddr_in6 *)res->ai_addr)->sin6_addr; - len = sizeof (struct in6_addr); - break; -#endif - default: - freeaddrinfo (res); - return -1; - } - memcpy (dst, data, len); - freeaddrinfo (res); - return 1; -#else /* HAVE_INET_PTON */ - return inet_pton( af, src, dst ); -#endif /* HAVE_INET_PTON */ -} - -/** - * inet_ntop() replacement - */ -const char *vlc_inet_ntop (int af, const void *src, char *dst, socklen_t cnt) -{ -#ifndef HAVE_INET_NTOP - int ret = EAI_FAMILY; - - switch (af) - { -#ifdef AF_INET6 - case AF_INET6: - { - struct sockaddr_in6 addr; - memset (&addr, 0, sizeof(addr)); - addr.sin6_family = AF_INET6; - addr.sin6_addr = *(struct in6_addr *)src; - ret = getnameinfo ((struct sockaddr *)&addr, sizeof (addr), - dst, cnt, NULL, 0, NI_NUMERICHOST); - } - -#endif - case AF_INET: - { - struct sockaddr_in addr; - memset(&addr, 0, sizeof(addr)); - addr.sin_family = AF_INET; - addr.sin_addr = *(struct in_addr *)src; - ret = getnameinfo ((struct sockaddr *)&addr, sizeof (addr), - dst, cnt, NULL, 0, NI_NUMERICHOST); - } - } - return (ret == 0) ? dst : NULL; -#else /* HAVE_INET_NTOP */ - return inet_ntop( af, src, dst, cnt ); -#endif /* HAVE_INET_NTOP */ -} - _______________________________________________ vlc-commits mailing list [email protected] http://mailman.videolan.org/listinfo/vlc-commits
