diff options
author | Pierre Ossman <ossman@cendio.se> | 2006-01-09 17:14:30 +0000 |
---|---|---|
committer | Pierre Ossman <ossman@cendio.se> | 2006-01-09 17:14:30 +0000 |
commit | 76bc56cf3b50e5d446046536f22a3dfd372f11c7 (patch) | |
tree | 6609c94351e71bd8a41910e8260b12a395085a81 | |
parent | d3cb1448b4765705ed14aee5b40b87459a4e302d (diff) |
Put inet_ntop() emulation in a seperate file.
git-svn-id: file:///home/lennart/svn/public/pulseaudio/branches/ossman@432 fefdeb5f-60dc-0310-8127-8f9354f1896f
-rw-r--r-- | polyp/Makefile.am | 4 | ||||
-rw-r--r-- | polyp/inet_ntop.c | 78 | ||||
-rw-r--r-- | polyp/inet_ntop.h | 6 | ||||
-rw-r--r-- | polyp/socket-server.c | 31 |
4 files changed, 91 insertions, 28 deletions
diff --git a/polyp/Makefile.am b/polyp/Makefile.am index ab7dfe5b..22e8da3d 100644 --- a/polyp/Makefile.am +++ b/polyp/Makefile.am @@ -540,7 +540,9 @@ libprotocol_simple_la_SOURCES = protocol-simple.c protocol-simple.h libprotocol_simple_la_LDFLAGS = -avoid-version libprotocol_simple_la_LIBADD = $(AM_LIBADD) libpolypcore.la libsocket-server.la libiochannel.la -libsocket_server_la_SOURCES = socket-server.c socket-server.h +libsocket_server_la_SOURCES = \ + inet_ntop.c inet_ntop.h \ + socket-server.c socket-server.h libsocket_server_la_LDFLAGS = -avoid-version libsocket_server_la_LIBADD = $(AM_LIBADD) libpolypcore.la libiochannel.la libsocket-util.la $(LIBWRAP_LIBS) $(WINSOCK_LIBS) diff --git a/polyp/inet_ntop.c b/polyp/inet_ntop.c new file mode 100644 index 00000000..19f29f86 --- /dev/null +++ b/polyp/inet_ntop.c @@ -0,0 +1,78 @@ +/* $Id: inet_ntop.c 428 2006-01-09 16:50:39Z ossman $ */ + +/*** + This file is part of polypaudio. + + polypaudio 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. + + polypaudio 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 polypaudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> + +#ifndef HAVE_INET_NTOP + +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif + +#include "winsock.h" + +#include "inet_ntop.h" + +const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt) { + struct in_addr *in = (struct in_addr*)src; + struct in6_addr *in6 = (struct in6_addr*)src; + + assert(src && dst); + + switch (af) { + case AF_INET: + snprintf(dst, cnt, "%d.%d.%d.%d", +#ifdef WORDS_BIGENDIAN + (int)(in->s_addr >> 24) & 0xff, + (int)(in->s_addr >> 16) & 0xff, + (int)(in->s_addr >> 8) & 0xff, + (int)(in->s_addr >> 0) & 0xff); +#else + (int)(in->s_addr >> 0) & 0xff, + (int)(in->s_addr >> 8) & 0xff, + (int)(in->s_addr >> 16) & 0xff, + (int)(in->s_addr >> 24) & 0xff); +#endif + break; + case AF_INET6: + snprintf(dst, cnt, "%x:%x:%x:%x:%x:%x:%x:%x", + in6->s6_addr[ 0] << 8 | in6->s6_addr[ 1], + in6->s6_addr[ 2] << 8 | in6->s6_addr[ 3], + in6->s6_addr[ 4] << 8 | in6->s6_addr[ 5], + in6->s6_addr[ 6] << 8 | in6->s6_addr[ 7], + in6->s6_addr[ 8] << 8 | in6->s6_addr[ 9], + in6->s6_addr[10] << 8 | in6->s6_addr[11], + in6->s6_addr[12] << 8 | in6->s6_addr[13], + in6->s6_addr[14] << 8 | in6->s6_addr[15]); + break; + default: + errno = EAFNOSUPPORT; + return NULL; + } + + return dst; +} + +#endif /* INET_NTOP */ diff --git a/polyp/inet_ntop.h b/polyp/inet_ntop.h new file mode 100644 index 00000000..11bc6112 --- /dev/null +++ b/polyp/inet_ntop.h @@ -0,0 +1,6 @@ +#ifndef fooinet_ntophfoo +#define fooinet_ntophfoo + +const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt); + +#endif diff --git a/polyp/socket-server.c b/polyp/socket-server.c index 18122f33..a78f04cd 100644 --- a/polyp/socket-server.c +++ b/polyp/socket-server.c @@ -52,6 +52,10 @@ #include <tcpd.h> #endif +#ifndef HAVE_INET_NTOP +#include "inet_ntop.h" +#endif + #include "winsock.h" #include "socket-server.h" @@ -362,22 +366,10 @@ char *pa_socket_server_get_address(struct pa_socket_server *s, char *c, size_t l } else { char ip[INET6_ADDRSTRLEN]; -#ifdef HAVE_INET_NTOP if (!inet_ntop(AF_INET6, &sa.sin6_addr, ip, sizeof(ip))) { pa_log(__FILE__": inet_ntop() failed: %s\n", strerror(errno)); return NULL; } -#else - snprintf(ip, INET6_ADDRSTRLEN, "%x:%x:%x:%x:%x:%x:%x:%x", - sa.sin6_addr.s6_addr[ 0] << 8 | sa.sin6_addr.s6_addr[ 1], - sa.sin6_addr.s6_addr[ 2] << 8 | sa.sin6_addr.s6_addr[ 3], - sa.sin6_addr.s6_addr[ 4] << 8 | sa.sin6_addr.s6_addr[ 5], - sa.sin6_addr.s6_addr[ 6] << 8 | sa.sin6_addr.s6_addr[ 7], - sa.sin6_addr.s6_addr[ 8] << 8 | sa.sin6_addr.s6_addr[ 9], - sa.sin6_addr.s6_addr[10] << 8 | sa.sin6_addr.s6_addr[11], - sa.sin6_addr.s6_addr[12] << 8 | sa.sin6_addr.s6_addr[13], - sa.sin6_addr.s6_addr[14] << 8 | sa.sin6_addr.s6_addr[15]); -#endif snprintf(c, l, "tcp6:[%s]:%u", ip, (unsigned) ntohs(sa.sin6_port)); } @@ -409,25 +401,10 @@ char *pa_socket_server_get_address(struct pa_socket_server *s, char *c, size_t l } else { char ip[INET_ADDRSTRLEN]; -#ifdef HAVE_INET_NTOP if (!inet_ntop(AF_INET, &sa.sin_addr, ip, sizeof(ip))) { pa_log(__FILE__": inet_ntop() failed: %s\n", strerror(errno)); return NULL; } -#else /* HAVE_INET_NTOP */ - snprintf(ip, INET_ADDRSTRLEN, "%d.%d.%d.%d", -#ifdef WORDS_BIGENDIAN - (int)(sa.sin_addr.s_addr >> 24) & 0xff, - (int)(sa.sin_addr.s_addr >> 16) & 0xff, - (int)(sa.sin_addr.s_addr >> 8) & 0xff, - (int)(sa.sin_addr.s_addr >> 0) & 0xff); -#else - (int)(sa.sin_addr.s_addr >> 0) & 0xff, - (int)(sa.sin_addr.s_addr >> 8) & 0xff, - (int)(sa.sin_addr.s_addr >> 16) & 0xff, - (int)(sa.sin_addr.s_addr >> 24) & 0xff); -#endif -#endif /* HAVE_INET_NTOP */ snprintf(c, l, "tcp:[%s]:%u", ip, (unsigned) ntohs(sa.sin_port)); |