[FFmpeg-cvslog] r21150 - in trunk/libavformat: network.h os_support.c

rbultje subversion
Mon Jan 11 18:45:18 CET 2010


Author: rbultje
Date: Mon Jan 11 18:45:17 2010
New Revision: 21150

Log:
Provide a fallback for getnameinfo() also. Patch by Martin Storsj?
<$firstname()$firstname,st>.

Modified:
   trunk/libavformat/network.h
   trunk/libavformat/os_support.c

Modified: trunk/libavformat/network.h
==============================================================================
--- trunk/libavformat/network.h	Mon Jan 11 18:42:35 2010	(r21149)
+++ trunk/libavformat/network.h	Mon Jan 11 18:45:17 2010	(r21150)
@@ -92,6 +92,14 @@ struct addrinfo {
 #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 @@ struct addrinfo {
 #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 */

Modified: trunk/libavformat/os_support.c
==============================================================================
--- trunk/libavformat/os_support.c	Mon Jan 11 18:42:35 2010	(r21149)
+++ trunk/libavformat/os_support.c	Mon Jan 11 18:45:17 2010	(r21150)
@@ -128,6 +128,50 @@ void ff_freeaddrinfo(struct addrinfo *re
     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 */



More information about the ffmpeg-cvslog mailing list