]> code.delx.au - pulseaudio/blobdiff - src/pulsecore/parseaddr.c
core: Add name to flist struct for more informative log messages
[pulseaudio] / src / pulsecore / parseaddr.c
index f2b6b2cfe9087e661f16d217d395bed69d01aa90..44cd9a0508e3a4ebe45ff182821a401d9289ce33 100644 (file)
@@ -25,6 +25,8 @@
 
 #include <string.h>
 #include <stdlib.h>
+#include <arpa/inet.h>
+#include <sys/socket.h>
 
 #include <pulse/xmalloc.h>
 #include <pulse/util.h>
@@ -51,20 +53,29 @@ static char *parse_host(const char *s, uint16_t *ret_port) {
         if (!(e = strchr(s+1, ']')))
             return NULL;
 
-        if (e[1] == ':')
-            *ret_port = atoi(e+2);
-        else if (e[1] != 0)
+        if (e[1] == ':') {
+            uint32_t p;
+
+            if (pa_atou(e+2, &p) < 0)
+                return NULL;
+
+            *ret_port = (uint16_t) p;
+        } else if (e[1] != 0)
             return NULL;
 
-        return pa_xstrndup(s+1, e-s-1);
+        return pa_xstrndup(s+1, (size_t) (e-s-1));
     } else {
         char *e;
+        uint32_t p;
 
         if (!(e = strrchr(s, ':')))
             return pa_xstrdup(s);
 
-        *ret_port = atoi(e+1);
-        return pa_xstrndup(s, e-s);
+        if (pa_atou(e+1, &p) < 0)
+            return NULL;
+
+        *ret_port = (uint16_t) p;
+        return pa_xstrndup(s, (size_t) (e-s));
     }
 }
 
@@ -78,13 +89,15 @@ int pa_parse_address(const char *name, pa_parsed_address *ret_p) {
     ret_p->type = PA_PARSED_ADDRESS_TCP_AUTO;
 
     if (*name == '{') {
-        char hn[256], *pfx;
-        /* The URL starts with a host specification for detecting local connections */
+        char *id, *pfx;
 
-        if (!pa_get_host_name(hn, sizeof(hn)))
+        /* The URL starts with a host id for detecting local connections */
+        if (!(id = pa_machine_id()))
             return -1;
 
-        pfx = pa_sprintf_malloc("{%s}", hn);
+        pfx = pa_sprintf_malloc("{%s}", id);
+        pa_xfree(id);
+
         if (!pa_startswith(name, pfx)) {
             pa_xfree(pfx);
             /* Not local */
@@ -120,3 +133,17 @@ int pa_parse_address(const char *name, pa_parsed_address *ret_p) {
 
     return 0;
 }
+
+pa_bool_t pa_is_ip_address(const char *a) {
+    char buf[INET6_ADDRSTRLEN];
+
+    pa_assert(a);
+
+    if (inet_pton(AF_INET6, a, buf) >= 1)
+        return TRUE;
+
+    if (inet_pton(AF_INET, a, buf) >= 1)
+        return TRUE;
+
+    return FALSE;
+}