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 */