Mercurial > libavformat.hg
changeset 5520:8797851aeedb libavformat
Provide a fallback for getnameinfo() also. Patch by Martin Storsj
<$firstname()$firstname,st>.
author | rbultje |
---|---|
date | Mon, 11 Jan 2010 17:45:17 +0000 |
parents | 9faa86343583 |
children | ab2af3bc94f6 |
files | network.h os_support.c |
diffstat | 2 files changed, 76 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/network.h Mon Jan 11 17:42:35 2010 +0000 +++ b/network.h Mon Jan 11 17:45:17 2010 +0000 @@ -92,6 +92,14 @@ #define EAI_FAIL 4 #endif +#ifndef EAI_FAMILY +#define EAI_FAMILY 5 +#endif + +#ifndef EAI_NONAME +#define EAI_NONAME 8 +#endif + #ifndef AI_PASSIVE #define AI_PASSIVE 1 #endif @@ -104,12 +112,36 @@ #define AI_NUMERICHOST 4 #endif +#ifndef NI_NOFQDN +#define NI_NOFQDN 1 +#endif + +#ifndef NI_NUMERICHOST +#define NI_NUMERICHOST 2 +#endif + +#ifndef NI_NAMERQD +#define NI_NAMERQD 4 +#endif + +#ifndef NI_NUMERICSERV +#define NI_NUMERICSERV 8 +#endif + +#ifndef NI_DGRAM +#define NI_DGRAM 16 +#endif + #if !HAVE_GETADDRINFO int ff_getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res); void ff_freeaddrinfo(struct addrinfo *res); +int ff_getnameinfo(const struct sockaddr *sa, int salen, + char *host, int hostlen, + char *serv, int servlen, int flags); #define getaddrinfo ff_getaddrinfo #define freeaddrinfo ff_freeaddrinfo +#define getnameinfo ff_getnameinfo #endif #endif /* AVFORMAT_NETWORK_H */
--- a/os_support.c Mon Jan 11 17:42:35 2010 +0000 +++ b/os_support.c Mon Jan 11 17:45:17 2010 +0000 @@ -128,6 +128,50 @@ av_free(res->ai_addr); av_free(res); } + +int ff_getnameinfo(const struct sockaddr *sa, int salen, + char *host, int hostlen, + char *serv, int servlen, int flags) +{ + const struct sockaddr_in *sin = (const struct sockaddr_in *)sa; + + if (sa->sa_family != AF_INET) + return EAI_FAMILY; + if (!host && !serv) + return EAI_NONAME; + + if (host && hostlen > 0) { + struct hostent *ent = NULL; + uint32_t a; + if (!(flags & NI_NUMERICHOST)) + ent = gethostbyaddr((const char *)&sin->sin_addr, + sizeof(sin->sin_addr), AF_INET); + + if (ent) { + snprintf(host, hostlen, "%s", ent->h_name); + } else if (flags & NI_NAMERQD) { + return EAI_NONAME; + } else { + 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)); + } + } + + if (serv && servlen > 0) { + struct servent *ent = NULL; + if (!(flags & NI_NUMERICSERV)) + ent = getservbyport(sin->sin_port, flags & NI_DGRAM ? "udp" : "tcp"); + + if (ent) { + snprintf(serv, servlen, "%s", ent->s_name); + } else + snprintf(serv, servlen, "%d", ntohs(sin->sin_port)); + } + + return 0; +} #endif /* resolve host with also IP address parsing */